Script streaming: don't produce (empty) cached data when debugger forces eagerness.
authormarja <marja@chromium.org>
Mon, 19 Jan 2015 14:29:01 +0000 (06:29 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 19 Jan 2015 14:29:12 +0000 (14:29 +0000)
See CompileTopLevel for similar logic which suppresses producing parser cache
when the debugger is active.

BUG=441130
LOG=n

Review URL: https://codereview.chromium.org/845643005

Cr-Commit-Position: refs/heads/master@{#26138}

src/background-parsing-task.cc
test/cctest/test-api.cc

index c7602a7..6ac743e 100644 (file)
@@ -25,6 +25,11 @@ BackgroundParsingTask::BackgroundParsingTask(
          options == ScriptCompiler::kNoCompileOptions);
   source->allow_lazy =
       !i::Compiler::DebuggerWantsEagerCompilation(source->info.get());
+
+  if (!source->allow_lazy && options_ == ScriptCompiler::kProduceParserCache) {
+    // Producing cached data while parsing eagerly is not supported.
+    options_ = ScriptCompiler::kNoCompileOptions;
+  }
   source->hash_seed = isolate->heap()->HashSeed();
 }
 
index dbf1493..9611ddb 100644 (file)
@@ -24422,6 +24422,45 @@ 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).
+  i::FLAG_min_preparse_length = 0;
+  const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo(); ",
+                          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"))));
+  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::ScriptCompiler::StreamedSource source(
+      new TestSourceStream(chunks),
+      v8::ScriptCompiler::StreamedSource::ONE_BYTE);
+  v8::ScriptCompiler::ScriptStreamingTask* task =
+      v8::ScriptCompiler::StartStreamingScript(
+          isolate, &source, v8::ScriptCompiler::kProduceParserCache);
+
+  // 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);
+}
+
+
 TEST(StreamingScriptWithInvalidUtf8) {
   // Regression test for a crash: test that invalid UTF-8 bytes in the end of a
   // chunk don't produce a crash.