src: add public API to create isolate and context
PR-URL: https://github.com/nodejs/node/pull/20639 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com> Reviewed-By: Khaidi Chu <i@2333.moe> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
617f0d2763
commit
963cb3a49c
58
src/node.cc
58
src/node.cc
@ -4439,10 +4439,21 @@ int EmitExit(Environment* env) {
|
||||
}
|
||||
|
||||
|
||||
ArrayBufferAllocator* CreateArrayBufferAllocator() {
|
||||
return new ArrayBufferAllocator();
|
||||
}
|
||||
|
||||
|
||||
void FreeArrayBufferAllocator(ArrayBufferAllocator* allocator) {
|
||||
delete allocator;
|
||||
}
|
||||
|
||||
|
||||
IsolateData* CreateIsolateData(Isolate* isolate, uv_loop_t* loop) {
|
||||
return new IsolateData(isolate, loop, nullptr);
|
||||
}
|
||||
|
||||
|
||||
IsolateData* CreateIsolateData(
|
||||
Isolate* isolate,
|
||||
uv_loop_t* loop,
|
||||
@ -4451,6 +4462,15 @@ IsolateData* CreateIsolateData(
|
||||
}
|
||||
|
||||
|
||||
IsolateData* CreateIsolateData(
|
||||
Isolate* isolate,
|
||||
uv_loop_t* loop,
|
||||
MultiIsolatePlatform* platform,
|
||||
ArrayBufferAllocator* allocator) {
|
||||
return new IsolateData(isolate, loop, platform, allocator->zero_fill_field());
|
||||
}
|
||||
|
||||
|
||||
void FreeIsolateData(IsolateData* isolate_data) {
|
||||
delete isolate_data;
|
||||
}
|
||||
@ -4594,19 +4614,16 @@ bool AllowWasmCodeGenerationCallback(
|
||||
return wasm_code_gen->IsUndefined() || wasm_code_gen->IsTrue();
|
||||
}
|
||||
|
||||
inline int Start(uv_loop_t* event_loop,
|
||||
int argc, const char* const* argv,
|
||||
int exec_argc, const char* const* exec_argv) {
|
||||
Isolate* NewIsolate(ArrayBufferAllocator* allocator) {
|
||||
Isolate::CreateParams params;
|
||||
ArrayBufferAllocator allocator;
|
||||
params.array_buffer_allocator = &allocator;
|
||||
params.array_buffer_allocator = allocator;
|
||||
#ifdef NODE_ENABLE_VTUNE_PROFILING
|
||||
params.code_event_handler = vTune::GetVtuneCodeEventHandler();
|
||||
#endif
|
||||
|
||||
Isolate* const isolate = Isolate::New(params);
|
||||
Isolate* isolate = Isolate::New(params);
|
||||
if (isolate == nullptr)
|
||||
return 12; // Signal internal error.
|
||||
return nullptr;
|
||||
|
||||
isolate->AddMessageListener(OnMessage);
|
||||
isolate->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException);
|
||||
@ -4614,6 +4631,18 @@ inline int Start(uv_loop_t* event_loop,
|
||||
isolate->SetFatalErrorHandler(OnFatalError);
|
||||
isolate->SetAllowWasmCodeGenerationCallback(AllowWasmCodeGenerationCallback);
|
||||
|
||||
return isolate;
|
||||
}
|
||||
|
||||
inline int Start(uv_loop_t* event_loop,
|
||||
int argc, const char* const* argv,
|
||||
int exec_argc, const char* const* exec_argv) {
|
||||
std::unique_ptr<ArrayBufferAllocator, decltype(&FreeArrayBufferAllocator)>
|
||||
allocator(CreateArrayBufferAllocator(), &FreeArrayBufferAllocator);
|
||||
Isolate* const isolate = NewIsolate(allocator.get());
|
||||
if (isolate == nullptr)
|
||||
return 12; // Signal internal error.
|
||||
|
||||
{
|
||||
Mutex::ScopedLock scoped_lock(node_isolate_mutex);
|
||||
CHECK_EQ(node_isolate, nullptr);
|
||||
@ -4625,15 +4654,18 @@ inline int Start(uv_loop_t* event_loop,
|
||||
Locker locker(isolate);
|
||||
Isolate::Scope isolate_scope(isolate);
|
||||
HandleScope handle_scope(isolate);
|
||||
IsolateData isolate_data(
|
||||
isolate,
|
||||
event_loop,
|
||||
v8_platform.Platform(),
|
||||
allocator.zero_fill_field());
|
||||
std::unique_ptr<IsolateData, decltype(&FreeIsolateData)> isolate_data(
|
||||
CreateIsolateData(
|
||||
isolate,
|
||||
event_loop,
|
||||
v8_platform.Platform(),
|
||||
allocator.get()),
|
||||
&FreeIsolateData);
|
||||
if (track_heap_objects) {
|
||||
isolate->GetHeapProfiler()->StartTrackingHeapObjects(true);
|
||||
}
|
||||
exit_code = Start(isolate, &isolate_data, argc, argv, exec_argc, exec_argv);
|
||||
exit_code =
|
||||
Start(isolate, isolate_data.get(), argc, argv, exec_argc, exec_argv);
|
||||
}
|
||||
|
||||
{
|
||||
|
22
src/node.h
22
src/node.h
@ -214,6 +214,11 @@ NODE_EXTERN void Init(int* argc,
|
||||
int* exec_argc,
|
||||
const char*** exec_argv);
|
||||
|
||||
class ArrayBufferAllocator;
|
||||
|
||||
NODE_EXTERN ArrayBufferAllocator* CreateArrayBufferAllocator();
|
||||
NODE_EXTERN void FreeArrayBufferAllocator(ArrayBufferAllocator* allocator);
|
||||
|
||||
class IsolateData;
|
||||
class Environment;
|
||||
|
||||
@ -229,9 +234,21 @@ class MultiIsolatePlatform : public v8::Platform {
|
||||
virtual void UnregisterIsolate(IsolateData* isolate_data) = 0;
|
||||
};
|
||||
|
||||
// Creates a new isolate with Node.js-specific settings.
|
||||
NODE_EXTERN v8::Isolate* NewIsolate(ArrayBufferAllocator* allocator);
|
||||
|
||||
// Creates a new context with Node.js-specific tweaks. Currently, it removes
|
||||
// the `v8BreakIterator` property from the global `Intl` object if present.
|
||||
// See https://github.com/nodejs/node/issues/14909 for more info.
|
||||
NODE_EXTERN v8::Local<v8::Context> NewContext(
|
||||
v8::Isolate* isolate,
|
||||
v8::Local<v8::ObjectTemplate> object_template =
|
||||
v8::Local<v8::ObjectTemplate>());
|
||||
|
||||
// If `platform` is passed, it will be used to register new Worker instances.
|
||||
// It can be `nullptr`, in which case creating new Workers inside of
|
||||
// Environments that use this `IsolateData` will not work.
|
||||
// TODO(helloshuangzi): switch to default parameters.
|
||||
NODE_EXTERN IsolateData* CreateIsolateData(
|
||||
v8::Isolate* isolate,
|
||||
struct uv_loop_s* loop);
|
||||
@ -239,6 +256,11 @@ NODE_EXTERN IsolateData* CreateIsolateData(
|
||||
v8::Isolate* isolate,
|
||||
struct uv_loop_s* loop,
|
||||
MultiIsolatePlatform* platform);
|
||||
NODE_EXTERN IsolateData* CreateIsolateData(
|
||||
v8::Isolate* isolate,
|
||||
struct uv_loop_s* loop,
|
||||
MultiIsolatePlatform* platform,
|
||||
ArrayBufferAllocator* allocator);
|
||||
NODE_EXTERN void FreeIsolateData(IsolateData* isolate_data);
|
||||
|
||||
NODE_EXTERN Environment* CreateEnvironment(IsolateData* isolate_data,
|
||||
|
@ -232,14 +232,6 @@ inline v8::Local<TypeName> PersistentToLocal(
|
||||
v8::Isolate* isolate,
|
||||
const Persistent<TypeName>& persistent);
|
||||
|
||||
// Creates a new context with Node.js-specific tweaks. Currently, it removes
|
||||
// the `v8BreakIterator` property from the global `Intl` object if present.
|
||||
// See https://github.com/nodejs/node/issues/14909 for more info.
|
||||
v8::Local<v8::Context> NewContext(
|
||||
v8::Isolate* isolate,
|
||||
v8::Local<v8::ObjectTemplate> object_template =
|
||||
v8::Local<v8::ObjectTemplate>());
|
||||
|
||||
// Convert a struct sockaddr to a { address: '1.2.3.4', port: 1234 } JS object.
|
||||
// Sets address and port properties on the info object and returns it.
|
||||
// If |info| is omitted, a new object is returned.
|
||||
|
Loading…
x
Reference in New Issue
Block a user