Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 33d505eaaa2640c1cb5018c5e60c521602a46a72..d5748ce2c4ced06605cef90c096cecd229f61f1d 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -13629,3 +13629,102 @@ TEST(DefinePropertyPostDetach) { |
context->DetachGlobal(); |
define_property->Call(proxy, 0, NULL); |
} |
+ |
+ |
+static void InstallContextId(v8::Handle<Context> context, int id) { |
+ Context::Scope scope(context); |
+ CompileRun("Object.prototype").As<Object>()-> |
+ Set(v8_str("context_id"), v8::Integer::New(id)); |
+} |
+ |
+ |
+static void CheckContextId(v8::Handle<Object> object, int expected) { |
+ CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); |
+} |
+ |
+ |
+THREADED_TEST(CreationContext) { |
+ HandleScope handle_scope; |
+ Persistent<Context> context1 = Context::New(); |
+ InstallContextId(context1, 1); |
+ Persistent<Context> context2 = Context::New(); |
+ InstallContextId(context2, 2); |
+ Persistent<Context> context3 = Context::New(); |
+ InstallContextId(context3, 3); |
+ |
+ Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(); |
+ |
+ Local<Object> object1; |
+ Local<Function> func1; |
+ { |
+ Context::Scope scope(context1); |
+ object1 = Object::New(); |
+ func1 = tmpl->GetFunction(); |
+ } |
+ |
+ Local<Object> object2; |
+ Local<Function> func2; |
+ { |
+ Context::Scope scope(context2); |
+ object2 = Object::New(); |
+ func2 = tmpl->GetFunction(); |
+ } |
+ |
+ Local<Object> instance1; |
+ Local<Object> instance2; |
+ |
+ { |
+ Context::Scope scope(context3); |
+ instance1 = func1->NewInstance(); |
+ instance2 = func2->NewInstance(); |
+ } |
+ |
+ CHECK(object1->CreationContext() == context1); |
+ CheckContextId(object1, 1); |
+ CHECK(func1->CreationContext() == context1); |
+ CheckContextId(func1, 1); |
+ CHECK(instance1->CreationContext() == context1); |
+ CheckContextId(instance1, 1); |
+ CHECK(object2->CreationContext() == context2); |
+ CheckContextId(object2, 2); |
+ CHECK(func2->CreationContext() == context2); |
+ CheckContextId(func2, 2); |
+ CHECK(instance2->CreationContext() == context2); |
+ CheckContextId(instance2, 2); |
+ |
+ { |
+ Context::Scope scope(context1); |
+ CHECK(object1->CreationContext() == context1); |
+ CheckContextId(object1, 1); |
+ CHECK(func1->CreationContext() == context1); |
+ CheckContextId(func1, 1); |
+ CHECK(instance1->CreationContext() == context1); |
+ CheckContextId(instance1, 1); |
+ CHECK(object2->CreationContext() == context2); |
+ CheckContextId(object2, 2); |
+ CHECK(func2->CreationContext() == context2); |
+ CheckContextId(func2, 2); |
+ CHECK(instance2->CreationContext() == context2); |
+ CheckContextId(instance2, 2); |
+ } |
+ |
+ { |
+ Context::Scope scope(context2); |
+ CHECK(object1->CreationContext() == context1); |
+ CheckContextId(object1, 1); |
+ CHECK(func1->CreationContext() == context1); |
+ CheckContextId(func1, 1); |
+ CHECK(instance1->CreationContext() == context1); |
+ CheckContextId(instance1, 1); |
+ CHECK(object2->CreationContext() == context2); |
+ CheckContextId(object2, 2); |
+ CHECK(func2->CreationContext() == context2); |
+ CheckContextId(func2, 2); |
+ CHECK(instance2->CreationContext() == context2); |
+ CheckContextId(instance2, 2); |
+ } |
+ |
+ context1.Dispose(); |
+ context2.Dispose(); |
+ context3.Dispose(); |
+} |