Skip to content

Commit

Permalink
src,lib: allow running multiple per-context files
Browse files Browse the repository at this point in the history
Create an `lib/internal/per_context/` directory that can
host multiple files which we execute for each context.

PR-URL: #26497
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
addaleax authored and targos committed Mar 27, 2019
1 parent f2a07df commit e044563
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 20 deletions.
5 changes: 3 additions & 2 deletions lib/internal/bootstrap/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ const cannotBeRequired = [

'internal/test/binding',

'internal/bootstrap/context',
'internal/bootstrap/primordials',
'internal/bootstrap/loaders',
'internal/bootstrap/node'
'internal/bootstrap/node',

'internal/per_context/setup',
];

// Skip modules that cannot be required when they are not
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion node.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@
'node_lib_target_name%': 'node_lib',
'node_intermediate_lib_type%': 'static_library',
'library_files': [
'lib/internal/bootstrap/context.js',
'lib/internal/bootstrap/primordials.js',
'lib/internal/bootstrap/cache.js',
'lib/internal/bootstrap/loaders.js',
'lib/internal/bootstrap/node.js',
'lib/internal/bootstrap/pre_execution.js',
'lib/internal/per_context/setup.js',
'lib/async_hooks.js',
'lib/assert.js',
'lib/buffer.js',
Expand Down
42 changes: 25 additions & 17 deletions src/api/environment.cc
Original file line number Diff line number Diff line change
Expand Up @@ -259,25 +259,33 @@ Local<Context> NewContext(Isolate* isolate,
True(isolate));

{
// Run lib/internal/bootstrap/context.js
// Run per-context JS files.
Context::Scope context_scope(context);

std::vector<Local<String>> parameters = {
FIXED_ONE_BYTE_STRING(isolate, "global")};
Local<Value> arguments[] = {context->Global()};
MaybeLocal<Function> maybe_fn =
per_process::native_module_loader.LookupAndCompile(
context, "internal/bootstrap/context", &parameters, nullptr);
if (maybe_fn.IsEmpty()) {
return Local<Context>();
}
Local<Function> fn = maybe_fn.ToLocalChecked();
MaybeLocal<Value> result =
fn->Call(context, Undefined(isolate), arraysize(arguments), arguments);
// Execution failed during context creation.
// TODO(joyeecheung): deprecate this signature and return a MaybeLocal.
if (result.IsEmpty()) {
return Local<Context>();
static const char* context_files[] = {
"internal/per_context/setup",
nullptr
};

for (const char** module = context_files; *module != nullptr; module++) {
std::vector<Local<String>> parameters = {
FIXED_ONE_BYTE_STRING(isolate, "global")};
Local<Value> arguments[] = {context->Global()};
MaybeLocal<Function> maybe_fn =
per_process::native_module_loader.LookupAndCompile(
context, *module, &parameters, nullptr);
if (maybe_fn.IsEmpty()) {
return Local<Context>();
}
Local<Function> fn = maybe_fn.ToLocalChecked();
MaybeLocal<Value> result =
fn->Call(context, Undefined(isolate),
arraysize(arguments), arguments);
// Execution failed during context creation.
// TODO(joyeecheung): deprecate this signature and return a MaybeLocal.
if (result.IsEmpty()) {
return Local<Context>();
}
}
}

Expand Down

0 comments on commit e044563

Please sign in to comment.