Persistent<Object> sandbox_;
Persistent<Context> context_;
Persistent<Object> proxy_global_;
+ int references_;
public:
explicit ContextifyContext(Environment* env, Local<Object> sandbox)
: env_(env)
, sandbox_(env->isolate(), sandbox)
, context_(env->isolate(), CreateV8Context(env))
- , proxy_global_(env->isolate(), context()->Global()) {
+ , proxy_global_(env->isolate(), context()->Global())
+ // Wait for both sandbox_'s and proxy_global_'s death
+ , references_(2) {
sandbox_.MakeWeak(this, SandboxFreeCallback);
sandbox_.MarkIndependent();
+ proxy_global_.MakeWeak(this, SandboxFreeCallback);
+ proxy_global_.MarkIndependent();
}
static void SandboxFreeCallback(Isolate* isolate,
Persistent<Object>* target,
ContextifyContext* context) {
- delete context;
+ if (--context->references_ == 0)
+ delete context;
}
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
+// Flags: --expose-gc
+
var common = require('../common');
var assert = require('assert');
var vm = require('vm');
+assert.equal(typeof gc, 'function', 'Run this test with --expose-gc');
+
common.globalCheck = false;
console.error('run a string');
vm.runInNewContext('f.a = 2', { f: f });
assert.equal(f.a, 2);
+console.error('use function in context without referencing context');
+var fn = vm.runInNewContext('(function() { obj.p = {}; })', { obj: {} })
+gc();
+fn();
+// Should not crash