Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index a14fccb073fb7936f1efe9f83bf9d33ddad1646a..7ebf1e620d7b0a03644bf3a149d678d68c8ec24c 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -58,7 +58,10 @@ PropertyDetails::PropertyDetails(Smi* smi) { |
Smi* PropertyDetails::AsSmi() { |
- return Smi::FromInt(value_); |
+ // Ensure the upper 2 bits have the same value by sign extending it. This is |
+ // necessary to be able to use the 31st bit of the property details. |
+ int value = value_ << 1; |
+ return Smi::FromInt(value >> 1); |
} |
@@ -1475,21 +1478,6 @@ MaybeObject* JSObject::ResetElements() { |
} |
-MaybeObject* JSObject::AddFastPropertyUsingMap(Map* map) { |
- ASSERT(this->map()->NumberOfOwnDescriptors() + 1 == |
- map->NumberOfOwnDescriptors()); |
- if (this->map()->unused_property_fields() == 0) { |
- int new_size = properties()->length() + map->unused_property_fields() + 1; |
- FixedArray* new_properties; |
- MaybeObject* maybe_properties = properties()->CopySize(new_size); |
- if (!maybe_properties->To(&new_properties)) return maybe_properties; |
- set_properties(new_properties); |
- } |
- set_map(map); |
- return this; |
-} |
- |
- |
MaybeObject* JSObject::TransitionToMap(Map* map) { |
ASSERT(this->map()->inobject_properties() == map->inobject_properties()); |
ElementsKind expected_kind = this->map()->elements_kind(); |
@@ -1511,6 +1499,14 @@ MaybeObject* JSObject::TransitionToMap(Map* map) { |
} |
+MaybeObject* JSObject::MigrateInstance() { |
+ // Converting any field to the most specific type will cause the |
+ // GeneralizeFieldRepresentation algorithm to create the most general existing |
+ // transition that matches the object. This achieves what is needed. |
+ return GeneralizeFieldRepresentation(0, Representation::Smi()); |
+} |
+ |
+ |
Handle<String> JSObject::ExpectedTransitionKey(Handle<Map> map) { |
AssertNoAllocation no_gc; |
if (!map->HasTransitionArray()) return Handle<String>::null(); |
@@ -2239,6 +2235,23 @@ void DescriptorArray::SetSortedKey(int descriptor_index, int pointer) { |
} |
+void DescriptorArray::SetRepresentation(int descriptor_index, |
+ Representation representation) { |
+ ASSERT(!representation.IsNone()); |
+ PropertyDetails details = GetDetails(descriptor_index); |
+ set(ToDetailsIndex(descriptor_index), |
+ details.CopyWithRepresentation(representation).AsSmi()); |
+} |
+ |
+ |
+void DescriptorArray::InitializeRepresentations(Representation representation) { |
+ int length = number_of_descriptors(); |
+ for (int i = 0; i < length; i++) { |
+ SetRepresentation(i, representation); |
+ } |
+} |
+ |
+ |
Object** DescriptorArray::GetValueSlot(int descriptor_number) { |
ASSERT(descriptor_number < number_of_descriptors()); |
return HeapObject::RawField( |
@@ -2304,6 +2317,7 @@ void DescriptorArray::Set(int descriptor_number, |
number_of_descriptors()); |
ASSERT(desc->GetDetails().descriptor_index() > 0); |
+ ASSERT(!desc->GetDetails().representation().IsNone()); |
NoIncrementalWriteBarrierSet(this, |
ToKeyIndex(descriptor_number), |
desc->GetKey()); |
@@ -2322,6 +2336,7 @@ void DescriptorArray::Set(int descriptor_number, Descriptor* desc) { |
ASSERT(desc->GetDetails().descriptor_index() <= |
number_of_descriptors()); |
ASSERT(desc->GetDetails().descriptor_index() > 0); |
+ ASSERT(!desc->GetDetails().representation().IsNone()); |
set(ToKeyIndex(descriptor_number), desc->GetKey()); |
set(ToValueIndex(descriptor_number), desc->GetValue()); |
@@ -3535,6 +3550,32 @@ bool Map::is_observed() { |
} |
+void Map::deprecate() { |
+ set_bit_field3(Deprecated::update(bit_field3(), true)); |
+} |
+ |
+ |
+bool Map::is_deprecated() { |
+ if (!FLAG_track_fields) return false; |
+ return Deprecated::decode(bit_field3()); |
+} |
+ |
+ |
+bool Map::CanBeDeprecated() { |
+ int descriptor = LastAdded(); |
+ for (int i = 0; i <= descriptor; i++) { |
+ PropertyDetails details = instance_descriptors()->GetDetails(i); |
+ if (FLAG_track_fields && details.representation().IsSmi()) { |
+ return true; |
+ } |
+ if (FLAG_track_double_fields && details.representation().IsDouble()) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+ |
void Map::NotifyLeafMapLayoutChange() { |
dependent_code()->DeoptimizeDependentCodeGroup( |
GetIsolate(), |