src: cache some context in locals
Refs: 66566df577
PR-URL: https://github.com/nodejs/node/pull/37473
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
bfee9daaa5
commit
4e9212bb7b
@ -210,7 +210,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
|
||||
@ -219,7 +220,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());
|
||||
|
||||
@ -394,16 +395,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) &
|
||||
@ -441,7 +443,7 @@ void ContextifyContext::PropertySetterCallback(
|
||||
args.GetReturnValue().Set(false);
|
||||
}
|
||||
|
||||
USE(ctx->sandbox()->Set(ctx->context(), property, value));
|
||||
USE(ctx->sandbox()->Set(context, property, value));
|
||||
}
|
||||
|
||||
// static
|
||||
@ -482,7 +484,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 =
|
||||
@ -656,8 +658,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);
|
||||
}
|
||||
|
||||
@ -775,9 +779,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) {
|
||||
@ -789,12 +794,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();
|
||||
}
|
||||
@ -884,7 +889,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(
|
||||
@ -903,7 +909,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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user