Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 209c2ade04a077b1b340251f295bbfcbdd061e12..57182833ad733ad6a09fd085f0c4e1cd5ae761b8 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -584,7 +584,7 @@ bool Object::IsDeoptimizationOutputData() { |
} |
-bool Object::IsDependentCodes() { |
+bool Object::IsDependentCode() { |
if (!IsFixedArray()) return false; |
// There's actually no way to see the difference between a fixed array and |
// a dependent codes array. |
@@ -2392,7 +2392,7 @@ CAST_ACCESSOR(FixedDoubleArray) |
CAST_ACCESSOR(DescriptorArray) |
CAST_ACCESSOR(DeoptimizationInputData) |
CAST_ACCESSOR(DeoptimizationOutputData) |
-CAST_ACCESSOR(DependentCodes) |
+CAST_ACCESSOR(DependentCode) |
CAST_ACCESSOR(TypeFeedbackCells) |
CAST_ACCESSOR(SymbolTable) |
CAST_ACCESSOR(JSFunctionResultCache) |
@@ -3424,64 +3424,63 @@ bool Map::is_observed() { |
return IsObserved::decode(bit_field3()); |
} |
+void Map::NotifyObjectLayoutChange() { |
+ DeoptimizeDependentCode(DependentCode::kPrototypeCheckGroup); |
+} |
+ |
+bool Map::CanOmitPrototypeChecks() { |
+ return !HasTransitionArray() && !is_dictionary_map(); |
+} |
-void Map::AddDependentCode(DependentCodes::DependencyGroup group, |
+void Map::AddDependentCode(DependentCode::DependencyGroup group, |
Handle<Code> code) { |
- Handle<DependentCodes> codes = |
- DependentCodes::Insert(Handle<DependentCodes>(dependent_codes()), |
+ Handle<DependentCode> codes = |
+ DependentCode::Insert(Handle<DependentCode>(dependent_code()), |
group, code); |
- if (*codes != dependent_codes()) { |
- set_dependent_codes(*codes); |
+ if (*codes != dependent_code()) { |
+ set_dependent_code(*codes); |
} |
} |
-int DependentCodes::number_of_codes(DependencyGroup group) { |
+int DependentCode::number_of_codes(DependencyGroup group) { |
if (length() == 0) return 0; |
return Smi::cast(get(group))->value(); |
} |
-void DependentCodes::set_number_of_codes(DependencyGroup group, int value) { |
+void DependentCode::set_number_of_codes(DependencyGroup group, int value) { |
set(group, Smi::FromInt(value)); |
} |
-Code* DependentCodes::code_at(int i) { |
+Code* DependentCode::code_at(int i) { |
return Code::cast(get(kCodesStartIndex + i)); |
} |
-void DependentCodes::set_code_at(int i, Code* value) { |
+void DependentCode::set_code_at(int i, Code* value) { |
set(kCodesStartIndex + i, value); |
} |
-Object** DependentCodes::code_slot_at(int i) { |
+Object** DependentCode::code_slot_at(int i) { |
return HeapObject::RawField( |
this, FixedArray::OffsetOfElementAt(kCodesStartIndex + i)); |
} |
-void DependentCodes::clear_code_at(int i) { |
+void DependentCode::clear_code_at(int i) { |
set_undefined(kCodesStartIndex + i); |
} |
-void DependentCodes::ComputeGroupStartIndexes(GroupStartIndexes starts) { |
- starts[0] = 0; |
- for (int g = 1; g <= kGroupCount; g++) { |
- int count = number_of_codes(static_cast<DependencyGroup>(g - 1)); |
- starts[g] = starts[g - 1] + count; |
- } |
-} |
- |
- |
-void DependentCodes::ExtendGroup(DependencyGroup group) { |
- GroupStartIndexes starts; |
- ComputeGroupStartIndexes(starts); |
- for (int g = kGroupCount - 2; g > group; g--) { |
- set_code_at(starts[g + 1], code_at(starts[g])); |
+void DependentCode::ExtendGroup(DependencyGroup group) { |
+ GroupStartIndexes starts(this); |
+ for (int g = kGroupCount - 1; g > group; g--) { |
+ if (starts.at(g) < starts.at(g + 1)) { |
+ set_code_at(starts.at(g + 1), code_at(starts.at(g))); |
+ } |
} |
} |
@@ -4108,7 +4107,7 @@ HeapObject* Map::UncheckedPrototypeTransitions() { |
ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) |
-ACCESSORS(Map, dependent_codes, DependentCodes, kDependentCodesOffset) |
+ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset) |
ACCESSORS(Map, constructor, Object, kConstructorOffset) |
ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) |