Index: test/cctest/compiler/test-run-jscalls.cc |
diff --git a/test/cctest/compiler/test-run-jscalls.cc b/test/cctest/compiler/test-run-jscalls.cc |
index 2ad7e50467edcf87a4a773675d326772207af5a4..179e11835ad9faa0cd68593fdd851bd1f912f57f 100644 |
--- a/test/cctest/compiler/test-run-jscalls.cc |
+++ b/test/cctest/compiler/test-run-jscalls.cc |
@@ -233,3 +233,85 @@ TEST(ReceiverPatching) { |
Handle<JSObject> g(T.function->context()->global_object()->global_proxy()); |
T.CheckCall(g, T.undefined()); |
} |
+ |
+ |
+THREADED_TEST(ContextLoadedFromActivation) { |
+ i::FLAG_turbo_filter = "*"; |
+ i::FLAG_always_opt = true; |
+ i::FLAG_context_specialization = false; |
+ |
+ const char* script = |
+ "var x = 42;" |
+ "(function() {" |
+ " return function () { return x };" |
+ "})()"; |
+ |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope outer(isolate); |
+ v8::Local<v8::Value> fun; |
+ { |
+ v8::Local<v8::Context> env = v8::Context::New(isolate); |
+ env->Enter(); |
+ CompileRun("var x = 42;"); |
+ fun = CompileRun(script); |
+ env->Global()->Set(v8_str("foo"), fun); |
+ ExpectInt32("foo();", 42); |
+ env->Exit(); |
+ } |
+ |
+ { |
+ v8::Local<v8::Context> env = v8::Context::New(isolate); |
+ env->Enter(); |
+ v8::Local<v8::Value> fun2 = CompileRun(script); |
+ i::Handle<i::Object> oifun = v8::Utils::OpenHandle(*fun); |
+ i::Handle<i::JSFunction> ifun = Handle<JSFunction>::cast(oifun); |
+ i::Handle<i::Object> oifun2 = v8::Utils::OpenHandle(*fun2); |
+ i::Handle<i::JSFunction> ifun2 = Handle<JSFunction>::cast(oifun2); |
+ ifun2->set_code(ifun->code()); |
+ env->Global()->Set(v8_str("foo"), fun2); |
+ CompileRun("var x = 24;"); |
+ ExpectInt32("foo();", 24); |
+ env->Exit(); |
+ } |
+} |
+ |
+ |
+THREADED_TEST(BuiltinLoadedFromActivation) { |
+ i::FLAG_turbo_filter = "*"; |
+ i::FLAG_always_opt = true; |
+ i::FLAG_context_specialization = false; |
+ |
+ const char* script = |
+ "var x = 42;" |
+ "(function() {" |
+ " return function () { return this; };" |
+ "})()"; |
+ |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope outer(isolate); |
+ v8::Local<v8::Value> fun; |
+ { |
+ v8::Local<v8::Context> env = v8::Context::New(isolate); |
+ env->Enter(); |
+ CompileRun("var x = 42;"); |
+ fun = CompileRun(script); |
+ env->Global()->Set(v8_str("foo"), fun); |
+ ExpectObject("foo()", env->Global()); |
+ env->Exit(); |
+ } |
+ |
+ { |
+ v8::Local<v8::Context> env = v8::Context::New(isolate); |
+ env->Enter(); |
+ v8::Local<v8::Value> fun2 = CompileRun(script); |
+ i::Handle<i::Object> oifun = v8::Utils::OpenHandle(*fun); |
+ i::Handle<i::JSFunction> ifun = Handle<JSFunction>::cast(oifun); |
+ i::Handle<i::Object> oifun2 = v8::Utils::OpenHandle(*fun2); |
+ i::Handle<i::JSFunction> ifun2 = Handle<JSFunction>::cast(oifun2); |
+ ifun2->set_code(ifun->code()); |
+ env->Global()->Set(v8_str("foo"), fun2); |
+ CompileRun("var x = 24;"); |
+ ExpectObject("foo()", env->Global()); |
+ env->Exit(); |
+ } |
+} |