Skip to content

Commit

Permalink
src: cache some context in locals
Browse files Browse the repository at this point in the history
Refs: 66566df

PR-URL: #37473
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
XadillaX authored and targos committed May 1, 2021
1 parent 2e81ded commit 5ed770e
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions src/node_contextify.cc
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ MaybeLocal<Context> ContextifyContext::CreateV8Context(
return MaybeLocal<Context>();
}

ctx->SetSecurityToken(env->context()->GetSecurityToken());
Local<Context> context = env->context();
ctx->SetSecurityToken(context->GetSecurityToken());

// We need to tie the lifetime of the sandbox object with the lifetime of
// newly created context. We do this by making them hold references to each
Expand All @@ -218,7 +219,7 @@ MaybeLocal<Context> ContextifyContext::CreateV8Context(
// directly in an Object, we instead hold onto the new context's global
// object instead (which then has a reference to the context).
ctx->SetEmbedderData(ContextEmbedderIndex::kSandboxObject, sandbox_obj);
sandbox_obj->SetPrivate(env->context(),
sandbox_obj->SetPrivate(context,
env->contextify_global_private_symbol(),
ctx->Global());

Expand Down Expand Up @@ -393,16 +394,17 @@ void ContextifyContext::PropertySetterCallback(
if (ctx->context_.IsEmpty())
return;

Local<Context> context = ctx->context();
auto attributes = PropertyAttribute::None;
bool is_declared_on_global_proxy = ctx->global_proxy()
->GetRealNamedPropertyAttributes(ctx->context(), property)
->GetRealNamedPropertyAttributes(context, property)
.To(&attributes);
bool read_only =
static_cast<int>(attributes) &
static_cast<int>(PropertyAttribute::ReadOnly);

bool is_declared_on_sandbox = ctx->sandbox()
->GetRealNamedPropertyAttributes(ctx->context(), property)
->GetRealNamedPropertyAttributes(context, property)
.To(&attributes);
read_only = read_only ||
(static_cast<int>(attributes) &
Expand Down Expand Up @@ -440,7 +442,7 @@ void ContextifyContext::PropertySetterCallback(
args.GetReturnValue().Set(false);
}

USE(ctx->sandbox()->Set(ctx->context(), property, value));
USE(ctx->sandbox()->Set(context, property, value));
}

// static
Expand Down Expand Up @@ -481,7 +483,7 @@ void ContextifyContext::PropertyDefinerCallback(

auto attributes = PropertyAttribute::None;
bool is_declared =
ctx->global_proxy()->GetRealNamedPropertyAttributes(ctx->context(),
ctx->global_proxy()->GetRealNamedPropertyAttributes(context,
property)
.To(&attributes);
bool read_only =
Expand Down Expand Up @@ -655,8 +657,10 @@ void ContextifyScript::Init(Environment* env, Local<Object> target) {
env->SetProtoMethod(script_tmpl, "runInContext", RunInContext);
env->SetProtoMethod(script_tmpl, "runInThisContext", RunInThisContext);

target->Set(env->context(), class_name,
script_tmpl->GetFunction(env->context()).ToLocalChecked()).Check();
Local<Context> context = env->context();

target->Set(context, class_name,
script_tmpl->GetFunction(context).ToLocalChecked()).Check();
env->set_script_context_constructor_template(script_tmpl);
}

Expand Down Expand Up @@ -776,9 +780,10 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
}
contextify_script->script_.Reset(isolate, v8_script.ToLocalChecked());

Local<Context> env_context = env->context();
if (compile_options == ScriptCompiler::kConsumeCodeCache) {
args.This()->Set(
env->context(),
env_context,
env->cached_data_rejected_string(),
Boolean::New(isolate, source.GetCachedData()->rejected)).Check();
} else if (produce_cached_data) {
Expand All @@ -790,12 +795,12 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
env,
reinterpret_cast<const char*>(cached_data->data),
cached_data->length);
args.This()->Set(env->context(),
args.This()->Set(env_context,
env->cached_data_string(),
buf.ToLocalChecked()).Check();
}
args.This()->Set(
env->context(),
env_context,
env->cached_data_produced_string(),
Boolean::New(isolate, cached_data_produced)).Check();
}
Expand Down Expand Up @@ -885,7 +890,8 @@ void ContextifyScript::RunInContext(const FunctionCallbackInfo<Value>& args) {
ContextifyContext::ContextFromContextifiedSandbox(env, sandbox);
CHECK_NOT_NULL(contextify_context);

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

TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
Expand All @@ -904,7 +910,7 @@ void ContextifyScript::RunInContext(const FunctionCallbackInfo<Value>& args) {
bool break_on_first_line = args[4]->IsTrue();

// Do the eval within the context
Context::Scope context_scope(contextify_context->context());
Context::Scope context_scope(context);
EvalMachine(contextify_context->env(),
timeout,
display_errors,
Expand Down

0 comments on commit 5ed770e

Please sign in to comment.