Browse Source

contextify: cleanup weak ref for global proxy

Cleanup how node_contextify keeps weak references in order to prepare
for new style phantom weakness API. We didn't need to keep a weak
reference to the context's global proxy, as the context holds it.

PR-URL: https://github.com/nodejs/node/pull/5392
Reviewed-By: Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
v5.x
Ali Ijaz Sheikh 9 years ago
committed by Rod Vagg
parent
commit
93f60cdc54
  1. 32
      src/node_contextify.cc

32
src/node_contextify.cc

@ -52,21 +52,19 @@ class ContextifyContext {
protected: protected:
enum Kind { enum Kind {
kSandbox, kSandbox,
kContext, kContext
kProxyGlobal
}; };
Environment* const env_; Environment* const env_;
Persistent<Object> sandbox_; Persistent<Object> sandbox_;
Persistent<Context> context_; Persistent<Context> context_;
Persistent<Object> proxy_global_;
int references_; int references_;
public: public:
explicit ContextifyContext(Environment* env, Local<Object> sandbox) explicit ContextifyContext(Environment* env, Local<Object> sandbox)
: env_(env), : env_(env),
sandbox_(env->isolate(), sandbox), sandbox_(env->isolate(), sandbox),
// Wait for sandbox_, proxy_global_, and context_ to die // Wait for sandbox_ and context_ to die
references_(0) { references_(0) {
context_.Reset(env->isolate(), CreateV8Context(env)); context_.Reset(env->isolate(), CreateV8Context(env));
@ -80,17 +78,11 @@ class ContextifyContext {
context_.SetWeak(this, WeakCallback<Context, kContext>); context_.SetWeak(this, WeakCallback<Context, kContext>);
context_.MarkIndependent(); context_.MarkIndependent();
references_++; references_++;
proxy_global_.Reset(env->isolate(), context()->Global());
proxy_global_.SetWeak(this, WeakCallback<Object, kProxyGlobal>);
proxy_global_.MarkIndependent();
references_++;
} }
~ContextifyContext() { ~ContextifyContext() {
context_.Reset(); context_.Reset();
proxy_global_.Reset();
sandbox_.Reset(); sandbox_.Reset();
} }
@ -105,6 +97,10 @@ class ContextifyContext {
} }
inline Local<Object> global_proxy() const {
return context()->Global();
}
// XXX(isaacs): This function only exists because of a shortcoming of // XXX(isaacs): This function only exists because of a shortcoming of
// the V8 SetNamedPropertyHandler function. // the V8 SetNamedPropertyHandler function.
// //
@ -320,10 +316,8 @@ class ContextifyContext {
ContextifyContext* context = data.GetParameter(); ContextifyContext* context = data.GetParameter();
if (kind == kSandbox) if (kind == kSandbox)
context->sandbox_.ClearWeak(); context->sandbox_.ClearWeak();
else if (kind == kContext)
context->context_.ClearWeak();
else else
context->proxy_global_.ClearWeak(); context->context_.ClearWeak();
if (--context->references_ == 0) if (--context->references_ == 0)
delete context; delete context;
@ -361,15 +355,14 @@ class ContextifyContext {
MaybeLocal<Value> maybe_rv = MaybeLocal<Value> maybe_rv =
sandbox->GetRealNamedProperty(ctx->context(), property); sandbox->GetRealNamedProperty(ctx->context(), property);
if (maybe_rv.IsEmpty()) { if (maybe_rv.IsEmpty()) {
Local<Object> proxy_global = PersistentToLocal(isolate, maybe_rv =
ctx->proxy_global_); ctx->global_proxy()->GetRealNamedProperty(ctx->context(), property);
maybe_rv = proxy_global->GetRealNamedProperty(ctx->context(), property);
} }
Local<Value> rv; Local<Value> rv;
if (maybe_rv.ToLocal(&rv)) { if (maybe_rv.ToLocal(&rv)) {
if (rv == ctx->sandbox_) if (rv == ctx->sandbox_)
rv = PersistentToLocal(isolate, ctx->proxy_global_); rv = ctx->global_proxy();
args.GetReturnValue().Set(rv); args.GetReturnValue().Set(rv);
} }
@ -410,11 +403,8 @@ class ContextifyContext {
sandbox->GetRealNamedPropertyAttributes(ctx->context(), property); sandbox->GetRealNamedPropertyAttributes(ctx->context(), property);
if (maybe_prop_attr.IsNothing()) { if (maybe_prop_attr.IsNothing()) {
Local<Object> proxy_global = PersistentToLocal(isolate,
ctx->proxy_global_);
maybe_prop_attr = maybe_prop_attr =
proxy_global->GetRealNamedPropertyAttributes(ctx->context(), ctx->global_proxy()->GetRealNamedPropertyAttributes(ctx->context(),
property); property);
} }

Loading…
Cancel
Save