Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 132c72cf81ad31afef8b413e01e19d2d1a17e52d..fe791f308738b326c9d2dfd2ca56a0fa7fdf7a9d 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -11745,14 +11745,23 @@ bool DependentCode::MarkCodeForDeoptimization( |
// Mark all the code that needs to be deoptimized. |
bool marked = false; |
for (int i = start; i < end; i++) { |
- if (is_code_at(i)) { |
- Code* code = code_at(i); |
+ Object* object = object_at(i); |
+ // TODO(hpayer): This is a temporary hack. Foreign objects move after |
+ // new space evacuation. Since pretenuring may mark these objects as aborted |
+ // we have to follow the forwarding pointer in that case. |
+ MapWord map_word = HeapObject::cast(object)->map_word(); |
+ if (map_word.IsForwardingAddress()) { |
+ object = map_word.ToForwardingAddress(); |
+ } |
+ if (object->IsCode()) { |
+ Code* code = Code::cast(object); |
if (!code->marked_for_deoptimization()) { |
code->set_marked_for_deoptimization(true); |
marked = true; |
} |
} else { |
- CompilationInfo* info = compilation_info_at(i); |
+ CompilationInfo* info = reinterpret_cast<CompilationInfo*>( |
+ Foreign::cast(object)->foreign_address()); |
info->AbortDueToDependencyChange(); |
} |
} |