Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

src: merge RunInThisContext() with RunInContext() #43225

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions lib/vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

const {
ArrayPrototypeForEach,
ArrayPrototypeUnshift,
Symbol,
PromiseReject,
ReflectApply,
Expand Down Expand Up @@ -123,17 +122,19 @@ class Script extends ContextifyScript {
}

runInThisContext(options) {
const { breakOnSigint, args } = getRunInContextArgs(options);
const { breakOnSigint, args } = getRunInContextArgs(null, options);
if (breakOnSigint && process.listenerCount('SIGINT') > 0) {
return sigintHandlersWrap(super.runInThisContext, this, args);
return sigintHandlersWrap(super.runInContext, this, args);
}
return ReflectApply(super.runInThisContext, this, args);
return ReflectApply(super.runInContext, this, args);
}

runInContext(contextifiedObject, options) {
validateContext(contextifiedObject);
const { breakOnSigint, args } = getRunInContextArgs(options);
ArrayPrototypeUnshift(args, contextifiedObject);
const { breakOnSigint, args } = getRunInContextArgs(
contextifiedObject,
options,
);
if (breakOnSigint && process.listenerCount('SIGINT') > 0) {
return sigintHandlersWrap(super.runInContext, this, args);
}
Expand All @@ -153,7 +154,7 @@ function validateContext(contextifiedObject) {
}
}

function getRunInContextArgs(options = kEmptyObject) {
function getRunInContextArgs(contextifiedObject, options = kEmptyObject) {
validateObject(options, 'options');

let timeout = options.timeout;
Expand All @@ -174,7 +175,13 @@ function getRunInContextArgs(options = kEmptyObject) {

return {
breakOnSigint,
args: [timeout, displayErrors, breakOnSigint, breakFirstLine]
args: [
contextifiedObject,
timeout,
displayErrors,
breakOnSigint,
breakFirstLine,
],
};
}

Expand Down
68 changes: 20 additions & 48 deletions src/node_contextify.cc
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,6 @@ void ContextifyScript::Init(Environment* env, Local<Object> target) {
script_tmpl->SetClassName(class_name);
env->SetProtoMethod(script_tmpl, "createCachedData", CreateCachedData);
env->SetProtoMethod(script_tmpl, "runInContext", RunInContext);
env->SetProtoMethod(script_tmpl, "runInThisContext", RunInThisContext);

Local<Context> context = env->context();

Expand All @@ -677,7 +676,6 @@ void ContextifyScript::RegisterExternalReferences(
registry->Register(New);
registry->Register(CreateCachedData);
registry->Register(RunInContext);
registry->Register(RunInThisContext);
}

void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
Expand Down Expand Up @@ -844,59 +842,33 @@ void ContextifyScript::CreateCachedData(
}
}

void ContextifyScript::RunInThisContext(
const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);

ContextifyScript* wrapped_script;
ASSIGN_OR_RETURN_UNWRAP(&wrapped_script, args.Holder());

TRACE_EVENT0(TRACING_CATEGORY_NODE2(vm, script), "RunInThisContext");
RaisinTen marked this conversation as resolved.
Show resolved Hide resolved

// TODO(addaleax): Use an options object or otherwise merge this with
// RunInContext().
CHECK_EQ(args.Length(), 4);

CHECK(args[0]->IsNumber());
int64_t timeout = args[0]->IntegerValue(env->context()).FromJust();

CHECK(args[1]->IsBoolean());
bool display_errors = args[1]->IsTrue();

CHECK(args[2]->IsBoolean());
bool break_on_sigint = args[2]->IsTrue();

CHECK(args[3]->IsBoolean());
bool break_on_first_line = args[3]->IsTrue();

// Do the eval within this context
EvalMachine(env,
timeout,
display_errors,
break_on_sigint,
break_on_first_line,
nullptr, // microtask_queue
args);
}

void ContextifyScript::RunInContext(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);

ContextifyScript* wrapped_script;
ASSIGN_OR_RETURN_UNWRAP(&wrapped_script, args.Holder());

CHECK_EQ(args.Length(), 5);
CHECK(args[0]->IsObject() || args[0]->IsNull());

CHECK(args[0]->IsObject());
Local<Object> sandbox = args[0].As<Object>();
// Get the context from the sandbox
ContextifyContext* contextify_context =
ContextifyContext::ContextFromContextifiedSandbox(env, sandbox);
CHECK_NOT_NULL(contextify_context);
Local<Context> context;
std::shared_ptr<v8::MicrotaskQueue> microtask_queue;

Local<Context> context = contextify_context->context();
if (context.IsEmpty())
return;
if (args[0]->IsObject()) {
Local<Object> sandbox = args[0].As<Object>();
// Get the context from the sandbox
ContextifyContext* contextify_context =
ContextifyContext::ContextFromContextifiedSandbox(env, sandbox);
CHECK_NOT_NULL(contextify_context);
CHECK_EQ(contextify_context->env(), env);

context = contextify_context->context();
if (context.IsEmpty()) return;

microtask_queue = contextify_context->microtask_queue();
} else {
context = env->context();
}

TRACE_EVENT0(TRACING_CATEGORY_NODE2(vm, script), "RunInContext");

Expand All @@ -914,12 +886,12 @@ void ContextifyScript::RunInContext(const FunctionCallbackInfo<Value>& args) {

// Do the eval within the context
Context::Scope context_scope(context);
EvalMachine(contextify_context->env(),
EvalMachine(env,
timeout,
display_errors,
break_on_sigint,
break_on_first_line,
contextify_context->microtask_queue(),
microtask_queue,
args);
}

Expand Down
4 changes: 1 addition & 3 deletions src/node_contextify.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,7 @@ class ContextifyScript : public BaseObject {
static void RegisterExternalReferences(ExternalReferenceRegistry* registry);
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static bool InstanceOf(Environment* env, const v8::Local<v8::Value>& args);
static void CreateCachedData(
const v8::FunctionCallbackInfo<v8::Value>& args);
static void RunInThisContext(const v8::FunctionCallbackInfo<v8::Value>& args);
static void CreateCachedData(const v8::FunctionCallbackInfo<v8::Value>& args);
static void RunInContext(const v8::FunctionCallbackInfo<v8::Value>& args);
static bool EvalMachine(Environment* env,
const int64_t timeout,
Expand Down
1 change: 0 additions & 1 deletion test/parallel/test-trace-events-vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ const tmpdir = require('../common/tmpdir');

const names = [
'ContextifyScript::New',
'RunInThisContext',
tniessen marked this conversation as resolved.
Show resolved Hide resolved
'RunInContext',
];

Expand Down