Reviewers: Peter Rybin,

Message:
Peter,

may you have a look?

Description:
Restore r4358 which was reverted by 4366.

Please review this at http://codereview.chromium.org/1594023/show

Affected files:
  M src/liveedit.cc


Index: src/liveedit.cc
diff --git a/src/liveedit.cc b/src/liveedit.cc
index 7647f35db8e7d9b8894582f65d23e34a08a11a9e..8e02b5d9e841f419db269efd7ed79d93889547ee 100644
--- a/src/liveedit.cc
+++ b/src/liveedit.cc
@@ -447,6 +447,13 @@ static void ReplaceCodeObject(Code* original, Code* substitution) {
 }


+// Check whether the code is natural function code (not a lazy-compile stub
+// code).
+static bool IsJSFunctionCode(Code* code) {
+  return code->kind() == Code::FUNCTION;
+}
+
+
 void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array,
                                    Handle<JSArray> shared_info_array) {
   HandleScope scope;
@@ -456,15 +463,30 @@ void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array,

   Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo();

-  ReplaceCodeObject(shared_info->code(),
-                       *(compile_info_wrapper.GetFunctionCode()));
+
+  if (IsJSFunctionCode(shared_info->code())) {
+    ReplaceCodeObject(shared_info->code(),
+                      *(compile_info_wrapper.GetFunctionCode()));
+  }
+
+  if (shared_info->debug_info()->IsDebugInfo()) {
+ Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info()));
+    Handle<Code> new_original_code =
+        Factory::CopyCode(compile_info_wrapper.GetFunctionCode());
+    debug_info->set_original_code(*new_original_code);
+  }

   shared_info->set_start_position(compile_info_wrapper.GetStartPosition());
   shared_info->set_end_position(compile_info_wrapper.GetEndPosition());
-  // update breakpoints, original code, constructor stub
+
+  shared_info->set_construct_stub(
+      Builtins::builtin(Builtins::JSConstructStubGeneric));
+  // update breakpoints
 }


+// TODO(635): Eval caches its scripts (same text -- same compiled info).
+// Make sure we clear such caches.
 void LiveEdit::RelinkFunctionToScript(Handle<JSArray> shared_info_array,
                                       Handle<Script> script_handle) {
   SharedInfoWrapper shared_info_wrapper(shared_info_array);
@@ -651,15 +673,18 @@ Handle<JSArray> LiveEdit::PatchFunctionPositions(
       TranslatePosition(info->function_token_position(),
       position_change_array));

-  // Patch relocation info section of the code.
- Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()),
-                                                   position_change_array);
-  if (*patched_code != info->code()) {
-    // Replace all references to the code across the heap. In particular,
- // some stubs may refer to this code and this code may be being executed
-    // on stack (it is safe to substitute the code object on stack, because
- // we only change the structure of rinfo and leave instructions untouched).
-    ReplaceCodeObject(info->code(), *patched_code);
+  if (IsJSFunctionCode(info->code())) {
+    // Patch relocation info section of the code.
+ Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()), + position_change_array);
+    if (*patched_code != info->code()) {
+      // Replace all references to the code across the heap. In particular,
+ // some stubs may refer to this code and this code may be being executed + // on stack (it is safe to substitute the code object on stack, because
+      // we only change the structure of rinfo and leave instructions
+      // untouched).
+      ReplaceCodeObject(info->code(), *patched_code);
+    }
   }




--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

To unsubscribe, reply using "remove me" as the subject.

Reply via email to