Revision: 15378
Author: [email protected]
Date: Fri Jun 28 04:34:51 2013
Log: Abort optimization when debugger is turned on.
BUG=v8:2751
[email protected]
Review URL: https://codereview.chromium.org/18198003
http://code.google.com/p/v8/source/detail?r=15378
Added:
/branches/bleeding_edge/test/mjsunit/regress/regress-debug-deopt-while-recompile.js
/branches/bleeding_edge/test/mjsunit/regress/regress-opt-after-debug-deopt.js
Modified:
/branches/bleeding_edge/src/compiler.cc
/branches/bleeding_edge/src/debug.cc
/branches/bleeding_edge/src/objects.cc
=======================================
--- /dev/null
+++
/branches/bleeding_edge/test/mjsunit/regress/regress-debug-deopt-while-recompile.js
Fri Jun 28 04:34:51 2013
@@ -0,0 +1,84 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Flags: --expose-debug-as debug --allow-natives-syntax
+
+Debug = debug.Debug;
+
+function listener(event, exec_state, event_data, data) {
+ if (event != Debug.DebugEvent.Break) return;
+ try {
+ assertEquals("foo", exec_state.frame(0).evaluate("bar").value());
+ } catch (e) {
+ exception = e;
+ };
+ listened++;
+};
+
+var exception = null;
+var listened = 0;
+
+var f = function() {
+ var bar = "foo";
+ var baz = bar; // Break point should be here.
+ return bar;
+}
+
+var g = function() {
+ var bar = "foo";
+ var baz = bar; // Break point should be here.
+ return bar;
+}
+
+f();
+f();
+g();
+g();
+
+// Mark with builtin.
+%OptimizeFunctionOnNextCall(f);
+if (%IsParallelRecompilationSupported()) {
+ %OptimizeFunctionOnNextCall(g, "parallel");
+}
+
+// Activate debugger.
+Debug.setListener(listener);
+
+ // Set break point.
+Debug.setBreakPoint(f, 2, 0);
+Debug.setBreakPoint(g, 2, 0);
+
+// Trigger break point.
+f();
+g();
+
+// Assert that break point is set at expected location.
+assertTrue(Debug.showBreakPoints(f).indexOf("[B0]var baz = bar;") > 0);
+assertTrue(Debug.showBreakPoints(g).indexOf("[B0]var baz = bar;") > 0);
+
+assertEquals(2, listened);
+assertNull(exception);
=======================================
--- /dev/null
+++
/branches/bleeding_edge/test/mjsunit/regress/regress-opt-after-debug-deopt.js
Fri Jun 28 04:34:51 2013
@@ -0,0 +1,69 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Flags: --expose-debug-as debug --allow-natives-syntax
+// Flags: --parallel-recompilation --parallel-recompilation-delay=300
+
+if (!%IsParallelRecompilationSupported()) {
+ print("Parallel recompilation is disabled. Skipping this test.");
+ quit();
+}
+
+Debug = debug.Debug;
+
+function listener(event, exec_state, event_data, data) {
+ if (event != Debug.DebugEvent.Break) return;
+ try {
+ assertEquals("foo", exec_state.frame(0).evaluate("a").value());
+ } catch (e) {
+ exception = e;
+ };
+ listened++;
+};
+
+var exception = null;
+var listened = 0;
+
+var f = function() {
+ var a = "foo";
+ var b = a.substring("1");
+ [a, b].sort();
+ return a;
+}
+
+f();
+f();
+%OptimizeFunctionOnNextCall(f, "parallel"); // Mark with builtin.
+f(); // Kick off parallel recompilation.
+
+Debug.setListener(listener); // Activate debugger.
+Debug.setBreakPoint(f, 2, 0); // Force deopt.
+%CompleteOptimization(f); // Install optimized code.
+
+f(); // Trigger break point.
+assertEquals(1, listened);
+assertNull(exception);
=======================================
--- /branches/bleeding_edge/src/compiler.cc Thu Jun 27 06:03:01 2013
+++ /branches/bleeding_edge/src/compiler.cc Fri Jun 28 04:34:51 2013
@@ -1058,6 +1058,9 @@
} else if (status != OptimizingCompiler::SUCCEEDED) {
info->set_bailout_reason("failed/bailed out last time");
status = optimizing_compiler->AbortOptimization();
+ } else if (isolate->debugger()->IsDebuggerActive()) {
+ info->set_bailout_reason("debugger is active");
+ status = optimizing_compiler->AbortOptimization();
} else {
status = optimizing_compiler->GenerateAndInstallCode();
ASSERT(status == OptimizingCompiler::SUCCEEDED ||
=======================================
--- /branches/bleeding_edge/src/debug.cc Tue Jun 25 07:57:47 2013
+++ /branches/bleeding_edge/src/debug.cc Fri Jun 28 04:34:51 2013
@@ -2060,13 +2060,30 @@
if (obj->IsJSFunction()) {
JSFunction* function = JSFunction::cast(obj);
SharedFunctionInfo* shared = function->shared();
- if (shared->allows_lazy_compilation() &&
- shared->script()->IsScript() &&
- function->code()->kind() == Code::FUNCTION &&
- !function->code()->has_debug_break_slots() &&
- shared->code()->gc_metadata() != active_code_marker) {
+
+ if (!shared->allows_lazy_compilation()) continue;
+ if (!shared->script()->IsScript()) continue;
+ if (shared->code()->gc_metadata() == active_code_marker)
continue;
+
+ Code::Kind kind = function->code()->kind();
+ if (kind == Code::FUNCTION &&
+ !function->code()->has_debug_break_slots()) {
function->set_code(*lazy_compile);
function->shared()->set_code(*lazy_compile);
+ } else if (kind == Code::BUILTIN &&
+ (function->IsMarkedForInstallingRecompiledCode() ||
+ function->IsInRecompileQueue() ||
+ function->IsMarkedForLazyRecompilation() ||
+ function->IsMarkedForParallelRecompilation())) {
+ // Abort in-flight compilation.
+ Code* shared_code = function->shared()->code();
+ if (shared_code->kind() == Code::FUNCTION &&
+ shared_code->has_debug_break_slots()) {
+ function->set_code(shared_code);
+ } else {
+ function->set_code(*lazy_compile);
+ function->shared()->set_code(*lazy_compile);
+ }
}
}
}
=======================================
--- /branches/bleeding_edge/src/objects.cc Thu Jun 27 06:36:15 2013
+++ /branches/bleeding_edge/src/objects.cc Fri Jun 28 04:34:51 2013
@@ -9140,7 +9140,8 @@
void JSFunction::MarkForLazyRecompilation() {
- ASSERT(is_compiled() && !IsOptimized());
+ ASSERT(is_compiled() || GetIsolate()->debugger()->IsDebuggerActive());
+ ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() ||
code()->optimizable());
set_code_no_write_barrier(
@@ -9150,7 +9151,8 @@
void JSFunction::MarkForParallelRecompilation() {
- ASSERT(is_compiled() && !IsOptimized());
+ ASSERT(is_compiled() || GetIsolate()->debugger()->IsDebuggerActive());
+ ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() || code()->optimizable());
if (!FLAG_parallel_recompilation) {
JSFunction::MarkForLazyRecompilation();
@@ -9168,7 +9170,8 @@
void JSFunction::MarkForInstallingRecompiledCode() {
- ASSERT(is_compiled() && !IsOptimized());
+ ASSERT(is_compiled() || GetIsolate()->debugger()->IsDebuggerActive());
+ ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() || code()->optimizable());
ASSERT(FLAG_parallel_recompilation);
set_code_no_write_barrier(
@@ -9178,7 +9181,8 @@
void JSFunction::MarkInRecompileQueue() {
- ASSERT(is_compiled() && !IsOptimized());
+ ASSERT(is_compiled() || GetIsolate()->debugger()->IsDebuggerActive());
+ ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() || code()->optimizable());
ASSERT(FLAG_parallel_recompilation);
if (FLAG_trace_parallel_recompilation) {
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.