@ -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 ) ;
}
}