Browse Source

contextify: cache sandbox and context in locals

PR-URL: https://github.com/nodejs/node/pull/5392
Reviewed-By: Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
process-exit-stdio-flushing
Ali Ijaz Sheikh 9 years ago
committed by Ali Sheikh
parent
commit
66566df577
  1. 24
      src/node_contextify.cc

24
src/node_contextify.cc

@ -58,8 +58,7 @@ class ContextifyContext {
Persistent<Context> context_;
public:
explicit ContextifyContext(Environment* env, Local<Object> sandbox_obj)
: env_(env) {
ContextifyContext(Environment* env, Local<Object> sandbox_obj) : env_(env) {
Local<Context> v8_context = CreateV8Context(env, sandbox_obj);
context_.Reset(env->isolate(), v8_context);
@ -122,6 +121,7 @@ class ContextifyContext {
Local<Context> context = PersistentToLocal(env()->isolate(), context_);
Local<Object> global =
context->Global()->GetPrototype()->ToObject(env()->isolate());
Local<Object> sandbox_obj = sandbox();
Local<Function> clone_property_method;
@ -129,7 +129,7 @@ class ContextifyContext {
int length = names->Length();
for (int i = 0; i < length; i++) {
Local<String> key = names->Get(i)->ToString(env()->isolate());
bool has = sandbox()->HasOwnProperty(context, key).FromJust();
bool has = sandbox_obj->HasOwnProperty(context, key).FromJust();
if (!has) {
// Could also do this like so:
//
@ -161,7 +161,7 @@ class ContextifyContext {
clone_property_method = Local<Function>::Cast(script->Run());
CHECK(clone_property_method->IsFunction());
}
Local<Value> args[] = { global, key, sandbox() };
Local<Value> args[] = { global, key, sandbox_obj };
clone_property_method->Call(global, ARRAY_SIZE(args), args);
}
}
@ -335,16 +335,18 @@ class ContextifyContext {
if (ctx->context_.IsEmpty())
return;
Local<Context> context = ctx->context();
Local<Object> sandbox = ctx->sandbox();
MaybeLocal<Value> maybe_rv =
ctx->sandbox()->GetRealNamedProperty(ctx->context(), property);
sandbox->GetRealNamedProperty(context, property);
if (maybe_rv.IsEmpty()) {
maybe_rv =
ctx->global_proxy()->GetRealNamedProperty(ctx->context(), property);
ctx->global_proxy()->GetRealNamedProperty(context, property);
}
Local<Value> rv;
if (maybe_rv.ToLocal(&rv)) {
if (rv == ctx->sandbox())
if (rv == sandbox)
rv = ctx->global_proxy();
args.GetReturnValue().Set(rv);
@ -377,14 +379,14 @@ class ContextifyContext {
if (ctx->context_.IsEmpty())
return;
Local<Context> context = ctx->context();
Maybe<PropertyAttribute> maybe_prop_attr =
ctx->sandbox()->GetRealNamedPropertyAttributes(ctx->context(),
property);
ctx->sandbox()->GetRealNamedPropertyAttributes(context, property);
if (maybe_prop_attr.IsNothing()) {
maybe_prop_attr =
ctx->global_proxy()->GetRealNamedPropertyAttributes(ctx->context(),
property);
ctx->global_proxy()->GetRealNamedPropertyAttributes(context,
property);
}
if (maybe_prop_attr.IsJust()) {

Loading…
Cancel
Save