Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 392c158e1526cb3211497ba1d2c143137db6d60d..7c67539d7b6172ad9120676481c6292f3dfd5923 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -6682,7 +6682,9 @@ MaybeObject* Map::RawCopy(int instance_size) { |
new_bit_field3 = EnumLengthBits::update(new_bit_field3, |
kInvalidEnumCacheSentinel); |
new_bit_field3 = Deprecated::update(new_bit_field3, false); |
- new_bit_field3 = IsUnstable::update(new_bit_field3, false); |
+ if (!is_dictionary_map()) { |
+ new_bit_field3 = IsUnstable::update(new_bit_field3, false); |
+ } |
result->set_bit_field3(new_bit_field3); |
return result; |
} |
@@ -11074,9 +11076,6 @@ void Code::Disassemble(const char* name, FILE* out) { |
if (ic_state() == MONOMORPHIC) { |
PrintF(out, "type = %s\n", StubType2String(type())); |
} |
- if (is_call_stub() || is_keyed_call_stub()) { |
- PrintF(out, "argc = %d\n", arguments_count()); |
- } |
if (is_compare_ic_stub()) { |
ASSERT(major_key() == CodeStub::CompareIC); |
CompareIC::State left_state, right_state, handler_state; |
@@ -11745,14 +11744,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(); |
} |
} |
@@ -12733,8 +12741,7 @@ void AllocationSite::ResetPretenureDecision() { |
PretenureFlag AllocationSite::GetPretenureMode() { |
PretenureDecision mode = pretenure_decision(); |
// Zombie objects "decide" to be untenured. |
- return (mode == kTenure && GetHeap()->GetPretenureMode() == TENURED) |
- ? TENURED : NOT_TENURED; |
+ return mode == kTenure ? TENURED : NOT_TENURED; |
} |
@@ -13832,19 +13839,63 @@ MaybeObject* OneByteStringKey::AsObject(Heap* heap) { |
} |
-MaybeObject* SubStringOneByteStringKey::AsObject(Heap* heap) { |
+MaybeObject* TwoByteStringKey::AsObject(Heap* heap) { |
if (hash_field_ == 0) Hash(); |
- Vector<const uint8_t> chars(string_->GetChars() + from_, length_); |
+ return heap->AllocateTwoByteInternalizedString(string_, hash_field_); |
+} |
+ |
+ |
+template<> |
+const uint8_t* SubStringKey<uint8_t>::GetChars() { |
+ return string_->IsSeqOneByteString() |
+ ? SeqOneByteString::cast(*string_)->GetChars() |
+ : ExternalAsciiString::cast(*string_)->GetChars(); |
+} |
+ |
+ |
+template<> |
+const uint16_t* SubStringKey<uint16_t>::GetChars() { |
+ return string_->IsSeqTwoByteString() |
+ ? SeqTwoByteString::cast(*string_)->GetChars() |
+ : ExternalTwoByteString::cast(*string_)->GetChars(); |
+} |
+ |
+ |
+template<> |
+MaybeObject* SubStringKey<uint8_t>::AsObject(Heap* heap) { |
+ if (hash_field_ == 0) Hash(); |
+ Vector<const uint8_t> chars(GetChars() + from_, length_); |
return heap->AllocateOneByteInternalizedString(chars, hash_field_); |
} |
-MaybeObject* TwoByteStringKey::AsObject(Heap* heap) { |
+template<> |
+MaybeObject* SubStringKey<uint16_t>::AsObject( |
+ Heap* heap) { |
if (hash_field_ == 0) Hash(); |
- return heap->AllocateTwoByteInternalizedString(string_, hash_field_); |
+ Vector<const uint16_t> chars(GetChars() + from_, length_); |
+ return heap->AllocateTwoByteInternalizedString(chars, hash_field_); |
} |
+template<> |
+bool SubStringKey<uint8_t>::IsMatch(Object* string) { |
+ Vector<const uint8_t> chars(GetChars() + from_, length_); |
+ return String::cast(string)->IsOneByteEqualTo(chars); |
+} |
+ |
+ |
+template<> |
+bool SubStringKey<uint16_t>::IsMatch(Object* string) { |
+ Vector<const uint16_t> chars(GetChars() + from_, length_); |
+ return String::cast(string)->IsTwoByteEqualTo(chars); |
+} |
+ |
+ |
+template class SubStringKey<uint8_t>; |
+template class SubStringKey<uint16_t>; |
+ |
+ |
// InternalizedStringKey carries a string/internalized-string object as key. |
class InternalizedStringKey : public HashTableKey { |
public: |