mirror of
https://github.com/nodejs/node.git
synced 2025-05-03 01:31:27 +00:00
src: move context bootstrap to js
PR-URL: https://github.com/nodejs/node/pull/21518 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
759809f674
commit
d13cdd9c48
16
lib/internal/per_context.js
Normal file
16
lib/internal/per_context.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// node::NewContext calls this script
|
||||||
|
|
||||||
|
(function(global) {
|
||||||
|
// https://github.com/nodejs/node/issues/14909
|
||||||
|
delete global.Intl.v8BreakIterator;
|
||||||
|
|
||||||
|
// https://github.com/nodejs/node/issues/21219
|
||||||
|
Object.defineProperty(global.Atomics, 'notify', {
|
||||||
|
value: global.Atomics.wake,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
});
|
||||||
|
}(this));
|
1
node.gyp
1
node.gyp
@ -25,6 +25,7 @@
|
|||||||
'node_lib_target_name%': 'node_lib',
|
'node_lib_target_name%': 'node_lib',
|
||||||
'node_intermediate_lib_type%': 'static_library',
|
'node_intermediate_lib_type%': 'static_library',
|
||||||
'library_files': [
|
'library_files': [
|
||||||
|
'lib/internal/per_context.js',
|
||||||
'lib/internal/bootstrap/cache.js',
|
'lib/internal/bootstrap/cache.js',
|
||||||
'lib/internal/bootstrap/loaders.js',
|
'lib/internal/bootstrap/loaders.js',
|
||||||
'lib/internal/bootstrap/node.js',
|
'lib/internal/bootstrap/node.js',
|
||||||
|
36
src/node.cc
36
src/node.cc
@ -3497,35 +3497,19 @@ Local<Context> NewContext(Isolate* isolate,
|
|||||||
auto context = Context::New(isolate, nullptr, object_template);
|
auto context = Context::New(isolate, nullptr, object_template);
|
||||||
if (context.IsEmpty()) return context;
|
if (context.IsEmpty()) return context;
|
||||||
HandleScope handle_scope(isolate);
|
HandleScope handle_scope(isolate);
|
||||||
|
|
||||||
context->SetEmbedderData(
|
context->SetEmbedderData(
|
||||||
ContextEmbedderIndex::kAllowWasmCodeGeneration, True(isolate));
|
ContextEmbedderIndex::kAllowWasmCodeGeneration, True(isolate));
|
||||||
|
|
||||||
auto intl_key = FIXED_ONE_BYTE_STRING(isolate, "Intl");
|
{
|
||||||
auto break_iter_key = FIXED_ONE_BYTE_STRING(isolate, "v8BreakIterator");
|
// Run lib/internal/per_context.js
|
||||||
Local<Value> intl_v;
|
Context::Scope context_scope(context);
|
||||||
if (context->Global()->Get(context, intl_key).ToLocal(&intl_v) &&
|
Local<String> per_context = NodePerContextSource(isolate);
|
||||||
intl_v->IsObject()) {
|
v8::ScriptCompiler::Source per_context_src(per_context, nullptr);
|
||||||
Local<Object> intl = intl_v.As<Object>();
|
Local<v8::Script> s = v8::ScriptCompiler::Compile(
|
||||||
intl->Delete(context, break_iter_key).FromJust();
|
context,
|
||||||
}
|
&per_context_src).ToLocalChecked();
|
||||||
|
s->Run(context).ToLocalChecked();
|
||||||
// https://github.com/nodejs/node/issues/21219
|
|
||||||
// TODO(devsnek): remove when v8 supports Atomics.notify
|
|
||||||
auto atomics_key = FIXED_ONE_BYTE_STRING(isolate, "Atomics");
|
|
||||||
Local<Value> atomics_v;
|
|
||||||
if (context->Global()->Get(context, atomics_key).ToLocal(&atomics_v) &&
|
|
||||||
atomics_v->IsObject()) {
|
|
||||||
Local<Object> atomics = atomics_v.As<Object>();
|
|
||||||
auto wake_key = FIXED_ONE_BYTE_STRING(isolate, "wake");
|
|
||||||
|
|
||||||
Local<Value> wake = atomics->Get(context, wake_key).ToLocalChecked();
|
|
||||||
auto notify_key = FIXED_ONE_BYTE_STRING(isolate, "notify");
|
|
||||||
|
|
||||||
v8::PropertyDescriptor desc(wake, true);
|
|
||||||
desc.set_enumerable(false);
|
|
||||||
desc.set_configurable(true);
|
|
||||||
|
|
||||||
atomics->DefineProperty(context, notify_key, desc).ToChecked();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
|
@ -241,9 +241,7 @@ class MultiIsolatePlatform : public v8::Platform {
|
|||||||
// Creates a new isolate with Node.js-specific settings.
|
// Creates a new isolate with Node.js-specific settings.
|
||||||
NODE_EXTERN v8::Isolate* NewIsolate(ArrayBufferAllocator* allocator);
|
NODE_EXTERN v8::Isolate* NewIsolate(ArrayBufferAllocator* allocator);
|
||||||
|
|
||||||
// Creates a new context with Node.js-specific tweaks. Currently, it removes
|
// Creates a new context with Node.js-specific tweaks.
|
||||||
// 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(
|
NODE_EXTERN v8::Local<v8::Context> NewContext(
|
||||||
v8::Isolate* isolate,
|
v8::Isolate* isolate,
|
||||||
v8::Local<v8::ObjectTemplate> object_template =
|
v8::Local<v8::ObjectTemplate> object_template =
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
namespace node {
|
namespace node {
|
||||||
|
|
||||||
void DefineJavaScript(Environment* env, v8::Local<v8::Object> target);
|
void DefineJavaScript(Environment* env, v8::Local<v8::Object> target);
|
||||||
|
v8::Local<v8::String> NodePerContextSource(v8::Isolate* isolate);
|
||||||
v8::Local<v8::String> LoadersBootstrapperSource(Environment* env);
|
v8::Local<v8::String> LoadersBootstrapperSource(Environment* env);
|
||||||
v8::Local<v8::String> NodeBootstrapperSource(Environment* env);
|
v8::Local<v8::String> NodeBootstrapperSource(Environment* env);
|
||||||
|
|
||||||
|
@ -189,6 +189,10 @@ namespace {{
|
|||||||
|
|
||||||
}} // anonymous namespace
|
}} // anonymous namespace
|
||||||
|
|
||||||
|
v8::Local<v8::String> NodePerContextSource(v8::Isolate* isolate) {{
|
||||||
|
return internal_per_context_value.ToStringChecked(isolate);
|
||||||
|
}}
|
||||||
|
|
||||||
v8::Local<v8::String> LoadersBootstrapperSource(Environment* env) {{
|
v8::Local<v8::String> LoadersBootstrapperSource(Environment* env) {{
|
||||||
return internal_bootstrap_loaders_value.ToStringChecked(env->isolate());
|
return internal_bootstrap_loaders_value.ToStringChecked(env->isolate());
|
||||||
}}
|
}}
|
||||||
|
Loading…
Reference in New Issue
Block a user