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.

Reply via email to