summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhelloshuangzi <helloshuangzi@gmail.com>2018-05-11 11:06:05 -0700
committerAnna Henningsen <anna@addaleax.net>2018-05-14 18:40:17 +0200
commit963cb3a49ca79427512886334222e8f878aaeba8 (patch)
tree8db7d41145a84d0df116a20b8e29b31c71052885 /src
parent617f0d27637b428c3eed1920d0c0da59f5b7d714 (diff)
downloadandroid-node-v8-963cb3a49ca79427512886334222e8f878aaeba8.tar.gz
android-node-v8-963cb3a49ca79427512886334222e8f878aaeba8.tar.bz2
android-node-v8-963cb3a49ca79427512886334222e8f878aaeba8.zip
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>
Diffstat (limited to 'src')
-rw-r--r--src/node.cc58
-rw-r--r--src/node.h22
-rw-r--r--src/node_internals.h8
3 files changed, 67 insertions, 21 deletions
diff --git a/src/node.cc b/src/node.cc
index 141846f6a1..71b130a63f 100644
--- a/src/node.cc
+++ b/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);
}
{
diff --git a/src/node.h b/src/node.h
index 2ac145f4f7..44c89afdb7 100644
--- a/src/node.h
+++ b/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,
diff --git a/src/node_internals.h b/src/node_internals.h
index c10369c563..1ba56458b1 100644
--- a/src/node_internals.h
+++ b/src/node_internals.h
@@ -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.