Skip to content

Commit b07a4f7

Browse files
authored
Merge pull request #9 from mchandler-plato/main
Enabled isolate callback data to work
2 parents de64023 + 0e98a80 commit b07a4f7

File tree

5 files changed

+82
-27
lines changed

5 files changed

+82
-27
lines changed

src/CMakeLists.txt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ cmake_minimum_required(VERSION 3.15)
22

33
project(dart_dll VERSION 0.1)
44

5-
set(DART_DIR "${PROJECT_SOURCE_DIR}/../dart-sdk/sdk")
5+
set(DARTSDK_ROOTDIR "${PROJECT_SOURCE_DIR}/../dart-sdk" CACHE FILEPATH "Directory that dart-sdk is cloned too")
6+
set(DART_DIR "${DARTSDK_ROOTDIR}/sdk")
67

78
set(CMAKE_CXX_STANDARD 17)
89
set(CMAKE_CXX_STANDARD_REQUIRED True)
@@ -21,8 +22,12 @@ if(WIN32)
2122
set(LIB_PREFIX "lib")
2223
endif()
2324

25+
find_library(LIB_DART_DEBUG
26+
NAMES "${LIB_PREFIX}dart"
27+
HINTS "${DART_DIR}/out/DebugX64/obj/runtime/bin"
28+
)
2429

25-
find_library(LIB_DART
30+
find_library(LIB_DART_RELEASE
2631
NAMES "${LIB_PREFIX}dart"
2732
HINTS "${DART_DIR}/out/ReleaseX64/obj/runtime/bin"
2833
)
@@ -58,6 +63,8 @@ if(WIN32)
5863
Psapi
5964
shlwapi
6065
)
66+
set_property(TARGET dart_dll PROPERTY
67+
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
6168
elseif(LINUX)
6269
set(THREADS_PREFER_PTHREAD_FLAG ON)
6370
set(CMAKE_C_COMPILER "${DART_DIR}/buildtools/linux-x64/clang/bin/clang")
@@ -72,6 +79,5 @@ elseif(LINUX)
7279
)
7380
endif()
7481

75-
target_link_libraries(dart_dll
76-
${LIB_DART}
77-
)
82+
target_link_libraries(dart_dll debug ${LIB_DART_DEBUG})
83+
target_link_libraries(dart_dll optimized ${LIB_DART_RELEASE})

src/dart_dll.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,7 @@ static void OnIsolateShutdown(void*, void*) {
9393
Dart_ExitScope();
9494
}
9595

96-
static void DeleteIsolateData(void*, void* callback_data) {
97-
auto isolate_data = reinterpret_cast<IsolateData*>(callback_data);
98-
delete isolate_data;
99-
}
10096

101-
static void DeleteIsolateGroupData(void* callback_data) {
102-
auto isolate_group_data = reinterpret_cast<IsolateGroupData*>(callback_data);
103-
delete isolate_group_data;
104-
}
10597

10698
extern "C" {
10799

@@ -146,17 +138,22 @@ bool DartDll_Initialize(const DartDllConfig& config) {
146138
}
147139

148140
Dart_Isolate DartDll_LoadScript(const char* script_uri,
149-
const char* package_config) {
141+
const char* package_config,
142+
void* isolate_data) {
150143
Dart_IsolateFlags isolate_flags;
151144
Dart_IsolateFlagsInitialize(&isolate_flags);
152145

153146
char* error = nullptr;
154147
Dart_Isolate isolate = CreateIsolate(true, script_uri, "main", package_config,
155-
&isolate_flags, nullptr, &error);
148+
&isolate_flags, isolate_data, &error);
156149

157150
return isolate;
158151
}
159152

153+
void* DartDll_GetUserIsolateData(void* isolate_group_data) {
154+
return GetUserIsolateData(isolate_group_data);
155+
}
156+
160157
Dart_Handle DartDll_RunMain(Dart_Handle library) {
161158
Dart_Handle mainClosure =
162159
Dart_GetField(library, Dart_NewStringFromCString("main"));
@@ -176,6 +173,7 @@ Dart_Handle DartDll_RunMain(Dart_Handle library) {
176173
kNumIsolateArgs, isolateArgs);
177174
if (Dart_IsError(result)) {
178175
std::cout << "Dart initialized, error was: " << Dart_GetError(result)
176+
<< "\n"
179177
<< std::endl;
180178
return result;
181179
}

src/dart_dll.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ DART_DLL_EXPORT bool DartDll_Initialize(const DartDllConfig& config);
3333
// Load a script, with an optional package configuration location. The package
3434
// configuration is usually in ".dart_tool/package_config.json".
3535
DART_DLL_EXPORT Dart_Isolate DartDll_LoadScript(const char* script_uri,
36-
const char* package_config);
36+
const char* package_config,
37+
void* isolate_data = nullptr);
38+
39+
// Gets the pointer provided by the `isolate_data` parameter in DartDll_LoadScript after
40+
// calling Dart_CurrentIsolateData
41+
DART_DLL_EXPORT void* DartDll_GetUserIsolateData(void* isolate_group_data);
3742

3843
// Run "main" from the supplied library, usually one you got from
3944
// Dart_RootLibrary()
@@ -47,5 +52,4 @@ DART_DLL_EXPORT Dart_Handle DartDll_DrainMicrotaskQueue();
4752

4853
// Shutdown Dart
4954
DART_DLL_EXPORT bool DartDll_Shutdown();
50-
5155
}

src/isolate_setup.cpp

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ extern const uint8_t kDartCoreIsolateSnapshotData[];
1717
extern const uint8_t kDartCoreIsolateSnapshotInstructions[];
1818
}
1919

20+
namespace {
21+
class DllIsolateGroupData : public IsolateGroupData {
22+
public:
23+
DllIsolateGroupData(const char* url,
24+
const char* packages_file,
25+
AppSnapshot* app_snapshot,
26+
bool isolate_run_app_snapshot,
27+
void* callback_data = nullptr)
28+
: IsolateGroupData(url,
29+
packages_file,
30+
app_snapshot,
31+
isolate_run_app_snapshot),
32+
callback_data(callback_data) {}
33+
34+
void* callback_data;
35+
};
36+
}
37+
2038
Dart_Handle SetupCoreLibraries(Dart_Isolate isolate,
2139
IsolateData* isolate_data,
2240
bool is_isolate_group_start,
@@ -63,8 +81,8 @@ Dart_Isolate CreateKernelIsolate(const char* script_uri,
6381
intptr_t kernel_service_buffer_size = 0;
6482
dfe.LoadKernelService(&kernel_service_buffer, &kernel_service_buffer_size);
6583

66-
IsolateGroupData* isolate_group_data =
67-
new IsolateGroupData(uri, package_config, nullptr, false);
84+
DllIsolateGroupData* isolate_group_data =
85+
new DllIsolateGroupData(uri, package_config, nullptr, false);
6886
isolate_group_data->SetKernelBufferUnowned(
6987
const_cast<uint8_t*>(kernel_service_buffer), kernel_service_buffer_size);
7088
IsolateData* isolate_data = new IsolateData(isolate_group_data);
@@ -102,8 +120,8 @@ Dart_Isolate CreateVmServiceIsolate(const char* script_uri,
102120
void* callback_data,
103121
int service_port,
104122
char** error) {
105-
IsolateGroupData* isolate_group_data =
106-
new IsolateGroupData(script_uri, package_config, nullptr, false);
123+
DllIsolateGroupData* isolate_group_data = new DllIsolateGroupData(
124+
script_uri, package_config, nullptr, false, callback_data);
107125
IsolateData* isolate_data = new IsolateData(isolate_group_data);
108126

109127
flags->load_vmservice_library = true;
@@ -147,8 +165,8 @@ Dart_Isolate CreateIsolate(bool is_main_isolate,
147165
dfe.ReadScript(script_uri, &kernel_buffer, &kernel_buffer_size);
148166
flags->null_safety = true;
149167

150-
IsolateGroupData* isolate_group_data =
151-
new IsolateGroupData(script_uri, packages_config, nullptr, false);
168+
DllIsolateGroupData* isolate_group_data = new DllIsolateGroupData(
169+
script_uri, packages_config, nullptr, false, callback_data);
152170
isolate_group_data->SetKernelBufferNewlyOwned(kernel_buffer,
153171
kernel_buffer_size);
154172

@@ -243,3 +261,27 @@ Dart_Isolate CreateIsolate(bool is_main_isolate,
243261

244262
return isolate;
245263
}
264+
265+
void* GetUserIsolateData(void* isolate_data) {
266+
if (isolate_data == nullptr) {
267+
return nullptr;
268+
}
269+
IsolateGroupData* isolate_group_data =
270+
reinterpret_cast<IsolateData*>(isolate_data)->isolate_group_data();
271+
272+
if (isolate_group_data == nullptr) {
273+
return nullptr;
274+
}
275+
return static_cast<DllIsolateGroupData*>(isolate_group_data)->callback_data;
276+
}
277+
278+
void DeleteIsolateData(void* raw_isolate_group_data, void* raw_isolate_data) {
279+
auto isolate_data = reinterpret_cast<IsolateData*>(raw_isolate_data);
280+
delete isolate_data;
281+
}
282+
283+
void DeleteIsolateGroupData(void* raw_isolate_group_data) {
284+
auto isolate_group_data =
285+
reinterpret_cast<DllIsolateGroupData*>(raw_isolate_group_data);
286+
delete isolate_group_data;
287+
}

src/isolate_setup.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ Dart_Isolate CreateKernelIsolate(const char* script_uri,
77
const char* package_root,
88
const char* package_config,
99
Dart_IsolateFlags* flags,
10-
void* callback_data,
10+
void* isolate_data,
1111
char** error);
1212

1313
Dart_Isolate CreateVmServiceIsolate(const char* script_uri,
1414
const char* main,
1515
const char* package_root,
1616
const char* package_config,
1717
Dart_IsolateFlags* flags,
18-
void* callback_data,
18+
void* isolate_data,
1919
int service_port,
2020
char** error);
2121

@@ -24,5 +24,10 @@ Dart_Isolate CreateIsolate(bool is_main_isolate,
2424
const char* name,
2525
const char* packages_config,
2626
Dart_IsolateFlags* flags,
27-
void* callback_data,
28-
char** error);
27+
void* isolate_data,
28+
char** error);
29+
30+
void* GetUserIsolateData(void* isolate_group_data);
31+
32+
void DeleteIsolateData(void* raw_isolate_group_data, void* raw_isolate_data);
33+
void DeleteIsolateGroupData(void* raw_isolate_group_data);

0 commit comments

Comments
 (0)