Reviewers: ulan,
Description:
In PrepareForBreakPoints, also purge shared function info not referenced by
functions.
[email protected]
BUG=chromium:424142
LOG=N
Please review this at https://codereview.chromium.org/685753002/
Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+58, -9 lines):
M src/debug.cc
A test/mjsunit/regress/regress-crbug-424142.js
Index: src/debug.cc
diff --git a/src/debug.cc b/src/debug.cc
index
6521110a61dc61ebb12271ed7a4bdbd1be2ea08d..338b3343923f1954d1a261bec3a05b9074585f69
100644
--- a/src/debug.cc
+++ b/src/debug.cc
@@ -1894,6 +1894,20 @@ static void RecompileAndRelocateSuspendedGenerators(
}
+static bool SkipSharedFunctionInfo(SharedFunctionInfo* shared,
+ Object* active_code_marker) {
+ if (!shared->allows_lazy_compilation()) return true;
+ if (!shared->script()->IsScript()) return true;
+ Object* script = shared->script();
+ if (!script->IsScript()) return true;
+ if (Script::cast(script)->type()->value() == Script::TYPE_NATIVE) return
true;
+ Code* shared_code = shared->code();
+ if (shared_code->gc_metadata() == active_code_marker) return true;
+ if (shared_code->kind() != Code::FUNCTION) return true;
+ return shared_code->has_debug_break_slots();
+}
+
+
void Debug::PrepareForBreakPoints() {
// If preparing for the first break point make sure to deoptimize all
// functions as debugging does not work with optimized code.
@@ -1959,12 +1973,7 @@ void Debug::PrepareForBreakPoints() {
if (obj->IsJSFunction()) {
JSFunction* function = JSFunction::cast(obj);
SharedFunctionInfo* shared = function->shared();
-
- if (!shared->allows_lazy_compilation()) continue;
- if (!shared->script()->IsScript()) continue;
- if (function->IsFromNativeScript()) continue;
- if (shared->code()->gc_metadata() == active_code_marker)
continue;
-
+ if (SkipSharedFunctionInfo(shared, active_code_marker)) continue;
if (shared->is_generator()) {
generator_functions.Add(Handle<JSFunction>(function,
isolate_));
continue;
@@ -1974,19 +1983,19 @@ void Debug::PrepareForBreakPoints() {
if (kind == Code::FUNCTION &&
!function->code()->has_debug_break_slots()) {
function->ReplaceCode(*lazy_compile);
- function->shared()->ReplaceCode(*lazy_compile);
+ shared->ReplaceCode(*lazy_compile);
} else if (kind == Code::BUILTIN &&
(function->IsInOptimizationQueue() ||
function->IsMarkedForOptimization() ||
function->IsMarkedForConcurrentOptimization())) {
// Abort in-flight compilation.
- Code* shared_code = function->shared()->code();
+ Code* shared_code = shared->code();
if (shared_code->kind() == Code::FUNCTION &&
shared_code->has_debug_break_slots()) {
function->ReplaceCode(shared_code);
} else {
function->ReplaceCode(*lazy_compile);
- function->shared()->ReplaceCode(*lazy_compile);
+ shared->ReplaceCode(*lazy_compile);
}
}
} else if (obj->IsJSGeneratorObject()) {
@@ -2007,6 +2016,10 @@ void Debug::PrepareForBreakPoints() {
gen->set_continuation(code_offset);
suspended_generators.Add(Handle<JSGeneratorObject>(gen,
isolate_));
+ } else if (obj->IsSharedFunctionInfo()) {
+ SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
+ if (SkipSharedFunctionInfo(shared, active_code_marker)) continue;
+ shared->ReplaceCode(*lazy_compile);
}
}
Index: test/mjsunit/regress/regress-crbug-424142.js
diff --git a/test/mjsunit/regress/regress-crbug-424142.js
b/test/mjsunit/regress/regress-crbug-424142.js
new file mode 100644
index
0000000000000000000000000000000000000000..e38c14eae1aacf56a0caa8cc78547aa42c1b06c2
--- /dev/null
+++ b/test/mjsunit/regress/regress-crbug-424142.js
@@ -0,0 +1,36 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --expose-debug-as debug
+
+(function outer() {
+ var C = (function C_() {
+ var y = 1;
+ function CC() {
+ this.x = 0;
+ }
+ CC.prototype.f = function CCf() {
+ this.x += y;
+ return this.x;
+ };
+ return CC;
+ })();
+
+ var c = new C(0);
+})
+
+function sentinel() {}
+
+Debug = debug.Debug;
+
+var script = Debug.findScript(sentinel);
+var line = 14;
+var line_start = Debug.findScriptSourcePosition(script, line, 0);
+var line_end = Debug.findScriptSourcePosition(script, line + 1, 0) - 1;
+var actual = Debug.setBreakPointByScriptIdAndPosition(
+ script.id, line_start).actual_position;
+// Make sure the actual break position is within the line where we set
+// the break point.
+assertTrue(line_start <= actual);
+assertTrue(actual <= line_end);
--
--
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/d/optout.