Reviewers: danno,

Message:
PTAL


https://chromiumcodereview.appspot.com/61213012/diff/30001/src/objects.cc
File src/objects.cc (right):

https://chromiumcodereview.appspot.com/61213012/diff/30001/src/objects.cc#newcode10384
src/objects.cc:10384: it.rinfo()->set_target_object(undefined,
SKIP_WRITE_BARRIER);
We cannot put smi(0) here because, target object has to heap object.

Description:
Invalidate embedded objects in optimized code if it was marked for
deoptimization
becase of dead embedded objects.

It avoids having dead pointers in code from the time it was marked for
deoptimization
until it is deoptimized.

BUG=320532,v8:2996
TEST=mjsunit/regress/regress-320532.js
LOG=Y

Please review this at https://chromiumcodereview.appspot.com/61213012/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+13, -0 lines):
  M src/mark-compact.cc
  M src/objects.h
  M src/objects.cc


Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index 6d03d43652e81a3afd101785800eeb2358e63fde..d4eb9efdaacfb3a98f85b896f99a60cd3d548342 100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -2655,6 +2655,7 @@ void MarkCompactCollector::ClearAndDeoptimizeDependentCode(

     if (IsMarked(code) && !code->marked_for_deoptimization()) {
       code->set_marked_for_deoptimization(true);
+      code->InvalidateEmbeddedObjects(heap()->undefined_value());
       have_code_to_deoptimize_ = true;
     }
     entries->clear_at(i);
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 6cb5e212026de06051e8d83d9000964d4e3a7ba5..6686d161c113c8768f7764dae90262f124511532 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -10376,6 +10376,17 @@ void Code::InvalidateRelocation() {
 }


+void Code::InvalidateEmbeddedObjects(Object* undefined) {
+  int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
+  for (RelocIterator it(this, mode_mask); !it.done(); it.next()) {
+    RelocInfo::Mode mode = it.rinfo()->rmode();
+    if (mode == RelocInfo::EMBEDDED_OBJECT) {
+      it.rinfo()->set_target_object(undefined, SKIP_WRITE_BARRIER);
+    }
+  }
+}
+
+
 void Code::Relocate(intptr_t delta) {
for (RelocIterator it(this, RelocInfo::kApplyMask); !it.done(); it.next()) {
     it.rinfo()->apply(delta);
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index c720c440b0400d94e71afb77f612960587ce88a5..64e28934bbee769033f2e85a37c9c0978da2091d 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -5062,6 +5062,7 @@ class Code: public HeapObject {
   // [relocation_info]: Code relocation information
   DECL_ACCESSORS(relocation_info, ByteArray)
   void InvalidateRelocation();
+  void InvalidateEmbeddedObjects(Object* undefined);

   // [handler_table]: Fixed array containing offsets of exception handlers.
   DECL_ACCESSORS(handler_table, FixedArray)


--
--
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.

Reply via email to