Index: test/cctest/test-compiler.cc |
diff --git a/test/cctest/test-compiler.cc b/test/cctest/test-compiler.cc |
index 2947658b59f5bd8d480654699f5ca80835d2d286..1a6f69c586a556c01dfbab6a21cc051abff8c946 100644 |
--- a/test/cctest/test-compiler.cc |
+++ b/test/cctest/test-compiler.cc |
@@ -347,6 +347,43 @@ TEST(FeedbackVectorPreservedAcrossRecompiles) { |
} |
+TEST(FeedbackVectorRecreatedOnScopeChanges) { |
+ if (i::FLAG_always_opt || !i::FLAG_lazy) return; |
+ CcTest::InitializeVM(); |
+ v8::HandleScope scope(CcTest::isolate()); |
+ |
+ CompileRun("function builder() {" |
+ " call_target = function() { return 3; };" |
+ " return (function() {" |
+ " eval('');" |
+ " return function() {" |
+ " 'use strict';" |
+ " call_target();" |
+ " }" |
+ " })();" |
+ "}" |
+ "morphing_call = builder();"); |
+ |
+ Handle<JSFunction> f = |
+ v8::Utils::OpenHandle( |
+ *v8::Handle<v8::Function>::Cast( |
+ CcTest::global()->Get(v8_str("morphing_call")))); |
+ |
+ // morphing_call should have one feedback vector slot for the call to |
+ // call_target(), scoping analysis having been performed. |
+ CHECK_EQ(1, f->shared()->feedback_vector()->length()); |
+ // And yet it's not compiled. |
+ CHECK(!f->shared()->is_compiled()); |
+ |
+ CompileRun("morphing_call();"); |
+ |
+ // On scoping analysis after lazy compile, the call is now a global |
+ // call which needs no feedback vector slot. |
+ CHECK_EQ(0, f->shared()->feedback_vector()->length()); |
+ CHECK(f->shared()->is_compiled()); |
+} |
+ |
+ |
// Test that optimized code for different closures is actually shared |
// immediately by the FastNewClosureStub when run in the same context. |
TEST(OptimizedCodeSharing) { |