Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 5de04907085bca722611dfc21a244e2a0b864c23..d3a7309008f400109e50ebb1239210234e90fdd3 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -20987,43 +20987,50 @@ TEST(StreamingProducesParserCache) { |
} |
-TEST(StreamingWithDebuggingDoesNotProduceParserCache) { |
- // If the debugger is active, we should just not produce parser cache at |
- // all. This is a regeression test: We used to produce a parser cache without |
- // any data in it (just headers). |
+TEST(StreamingWithDebuggingEnabledLate) { |
+ // The streaming parser can only parse lazily, i.e. inner functions are not |
+ // fully parsed. However, we may compile inner functions eagerly when |
+ // debugging. Make sure that we can deal with this when turning on debugging |
+ // after streaming parser has already finished parsing. |
i::FLAG_min_preparse_length = 0; |
- const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo(); ", |
+ const char* chunks[] = {"with({x:1}) {", |
+ " var foo = function foo(y) {", |
+ " return x + y;", |
+ " };", |
+ " foo(2);", |
+ "}", |
NULL}; |
LocalContext env; |
v8::Isolate* isolate = env->GetIsolate(); |
v8::HandleScope scope(isolate); |
- |
- // Make the debugger active by setting a breakpoint. |
- CompileRun("function break_here() { }"); |
- i::Handle<i::JSFunction> func = i::Handle<i::JSFunction>::cast( |
- v8::Utils::OpenHandle(*env->Global()->Get(v8_str("break_here")))); |
- EnableDebugger(); |
- v8::internal::Debug* debug = CcTest::i_isolate()->debug(); |
- int position = 0; |
- debug->SetBreakPoint(func, i::Handle<i::Object>(v8::internal::Smi::FromInt(1), |
- CcTest::i_isolate()), |
- &position); |
+ v8::TryCatch try_catch(isolate); |
v8::ScriptCompiler::StreamedSource source( |
new TestSourceStream(chunks), |
v8::ScriptCompiler::StreamedSource::ONE_BYTE); |
v8::ScriptCompiler::ScriptStreamingTask* task = |
- v8::ScriptCompiler::StartStreamingScript( |
- isolate, &source, v8::ScriptCompiler::kProduceParserCache); |
+ v8::ScriptCompiler::StartStreamingScript(isolate, &source); |
- // TestSourceStream::GetMoreData won't block, so it's OK to just run the |
- // task here in the main thread. |
task->Run(); |
delete task; |
- // Check that we got no cached data. |
- CHECK(source.GetCachedData() == NULL); |
+ CHECK(!try_catch.HasCaught()); |
+ |
+ v8::ScriptOrigin origin(v8_str("http://foo.com")); |
+ char* full_source = TestSourceStream::FullSourceString(chunks); |
+ |
+ EnableDebugger(); |
+ |
+ v8::Handle<Script> script = v8::ScriptCompiler::Compile( |
+ isolate, &source, v8_str(full_source), origin); |
+ |
+ Maybe<uint32_t> result = |
+ script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local()); |
+ CHECK_EQ(3, result.FromMaybe(0)); |
+ |
+ delete[] full_source; |
+ |
DisableDebugger(); |
} |