| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 7057e7b70350d3bf549d870dbdf37118988c533e..64225b91cbf6ef711de11eab16244a6d6d43f41b 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -70,20 +70,19 @@ std::ostream& operator<<(std::ostream& os, InstanceType instance_type) {
|
| return os << "UNKNOWN"; // Keep the compiler happy.
|
| }
|
|
|
| -
|
| -Handle<HeapType> Object::OptimalType(Isolate* isolate,
|
| - Representation representation) {
|
| - if (representation.IsNone()) return HeapType::None(isolate);
|
| +Handle<FieldType> Object::OptimalType(Isolate* isolate,
|
| + Representation representation) {
|
| + if (representation.IsNone()) return FieldType::None(isolate);
|
| if (FLAG_track_field_types) {
|
| if (representation.IsHeapObject() && IsHeapObject()) {
|
| // We can track only JavaScript objects with stable maps.
|
| Handle<Map> map(HeapObject::cast(this)->map(), isolate);
|
| if (map->is_stable() && map->IsJSReceiverMap()) {
|
| - return HeapType::Class(map, isolate);
|
| + return FieldType::Class(map, isolate);
|
| }
|
| }
|
| }
|
| - return HeapType::Any(isolate);
|
| + return FieldType::Any(isolate);
|
| }
|
|
|
|
|
| @@ -2105,17 +2104,12 @@ void Map::PrintReconfiguration(FILE* file, int modify_index, PropertyKind kind,
|
| os << "]\n";
|
| }
|
|
|
| -
|
| -void Map::PrintGeneralization(FILE* file,
|
| - const char* reason,
|
| - int modify_index,
|
| - int split,
|
| - int descriptors,
|
| - bool constant_to_field,
|
| - Representation old_representation,
|
| - Representation new_representation,
|
| - HeapType* old_field_type,
|
| - HeapType* new_field_type) {
|
| +void Map::PrintGeneralization(
|
| + FILE* file, const char* reason, int modify_index, int split,
|
| + int descriptors, bool constant_to_field, Representation old_representation,
|
| + Representation new_representation, MaybeHandle<FieldType> old_field_type,
|
| + MaybeHandle<Object> old_value, MaybeHandle<FieldType> new_field_type,
|
| + MaybeHandle<Object> new_value) {
|
| OFStream os(file);
|
| os << "[generalizing]";
|
| Name* name = instance_descriptors()->GetKey(modify_index);
|
| @@ -2129,11 +2123,19 @@ void Map::PrintGeneralization(FILE* file,
|
| os << "c";
|
| } else {
|
| os << old_representation.Mnemonic() << "{";
|
| - old_field_type->PrintTo(os, HeapType::SEMANTIC_DIM);
|
| + if (old_field_type.is_null()) {
|
| + os << Brief(*(old_value.ToHandleChecked()));
|
| + } else {
|
| + old_field_type.ToHandleChecked()->PrintTo(os);
|
| + }
|
| os << "}";
|
| }
|
| os << "->" << new_representation.Mnemonic() << "{";
|
| - new_field_type->PrintTo(os, HeapType::SEMANTIC_DIM);
|
| + if (new_field_type.is_null()) {
|
| + os << Brief(*(new_value.ToHandleChecked()));
|
| + } else {
|
| + new_field_type.ToHandleChecked()->PrintTo(os);
|
| + }
|
| os << "} (";
|
| if (strlen(reason) > 0) {
|
| os << reason;
|
| @@ -2588,16 +2590,13 @@ Context* JSReceiver::GetCreationContext() {
|
| return function->context()->native_context();
|
| }
|
|
|
| -
|
| -static Handle<Object> WrapType(Handle<HeapType> type) {
|
| - if (type->IsClass()) return Map::WeakCellForMap(type->AsClass()->Map());
|
| +static Handle<Object> WrapType(Handle<FieldType> type) {
|
| + if (type->IsClass()) return Map::WeakCellForMap(type->AsClass());
|
| return type;
|
| }
|
|
|
| -
|
| -MaybeHandle<Map> Map::CopyWithField(Handle<Map> map,
|
| - Handle<Name> name,
|
| - Handle<HeapType> type,
|
| +MaybeHandle<Map> Map::CopyWithField(Handle<Map> map, Handle<Name> name,
|
| + Handle<FieldType> type,
|
| PropertyAttributes attributes,
|
| Representation representation,
|
| TransitionFlag flag) {
|
| @@ -2617,7 +2616,7 @@ MaybeHandle<Map> Map::CopyWithField(Handle<Map> map,
|
|
|
| if (map->instance_type() == JS_CONTEXT_EXTENSION_OBJECT_TYPE) {
|
| representation = Representation::Tagged();
|
| - type = HeapType::Any(isolate);
|
| + type = FieldType::Any(isolate);
|
| }
|
|
|
| Handle<Object> wrapped_type(WrapType(type));
|
| @@ -3063,7 +3062,7 @@ Handle<Map> Map::CopyGeneralizeAllRepresentations(
|
| for (int i = 0; i < number_of_own_descriptors; i++) {
|
| descriptors->SetRepresentation(i, Representation::Tagged());
|
| if (descriptors->GetDetails(i).type() == DATA) {
|
| - descriptors->SetValue(i, HeapType::Any());
|
| + descriptors->SetValue(i, FieldType::Any());
|
| }
|
| }
|
|
|
| @@ -3095,16 +3094,18 @@ Handle<Map> Map::CopyGeneralizeAllRepresentations(
|
| }
|
|
|
| if (FLAG_trace_generalization) {
|
| - HeapType* field_type =
|
| - (details.type() == DATA)
|
| - ? map->instance_descriptors()->GetFieldType(modify_index)
|
| - : NULL;
|
| + MaybeHandle<FieldType> field_type = FieldType::None(isolate);
|
| + if (details.type() == DATA) {
|
| + field_type = handle(
|
| + map->instance_descriptors()->GetFieldType(modify_index), isolate);
|
| + }
|
| map->PrintGeneralization(
|
| stdout, reason, modify_index, new_map->NumberOfOwnDescriptors(),
|
| new_map->NumberOfOwnDescriptors(),
|
| details.type() == DATA_CONSTANT && store_mode == FORCE_FIELD,
|
| details.representation(), Representation::Tagged(), field_type,
|
| - HeapType::Any());
|
| + MaybeHandle<Object>(), FieldType::Any(isolate),
|
| + MaybeHandle<Object>());
|
| }
|
| }
|
| return new_map;
|
| @@ -3197,7 +3198,7 @@ Map* Map::FindLastMatchMap(int verbatim,
|
| if (!details.representation().Equals(next_details.representation())) break;
|
|
|
| if (next_details.location() == kField) {
|
| - HeapType* next_field_type = next_descriptors->GetFieldType(i);
|
| + FieldType* next_field_type = next_descriptors->GetFieldType(i);
|
| if (!descriptors->GetFieldType(i)->NowIs(next_field_type)) {
|
| break;
|
| }
|
| @@ -3253,42 +3254,41 @@ void Map::UpdateFieldType(int descriptor, Handle<Name> name,
|
| instance_descriptors()->Replace(descriptor, &d);
|
| }
|
|
|
| -
|
| -bool FieldTypeIsCleared(Representation rep, HeapType* type) {
|
| - return type->Is(HeapType::None()) && rep.IsHeapObject();
|
| +bool FieldTypeIsCleared(Representation rep, FieldType* type) {
|
| + return type->IsNone() && rep.IsHeapObject();
|
| }
|
|
|
|
|
| // static
|
| -Handle<HeapType> Map::GeneralizeFieldType(Representation rep1,
|
| - Handle<HeapType> type1,
|
| - Representation rep2,
|
| - Handle<HeapType> type2,
|
| - Isolate* isolate) {
|
| +Handle<FieldType> Map::GeneralizeFieldType(Representation rep1,
|
| + Handle<FieldType> type1,
|
| + Representation rep2,
|
| + Handle<FieldType> type2,
|
| + Isolate* isolate) {
|
| // Cleared field types need special treatment. They represent lost knowledge,
|
| // so we must be conservative, so their generalization with any other type
|
| // is "Any".
|
| if (FieldTypeIsCleared(rep1, *type1) || FieldTypeIsCleared(rep2, *type2)) {
|
| - return HeapType::Any(isolate);
|
| + return FieldType::Any(isolate);
|
| }
|
| if (type1->NowIs(type2)) return type2;
|
| if (type2->NowIs(type1)) return type1;
|
| - return HeapType::Any(isolate);
|
| + return FieldType::Any(isolate);
|
| }
|
|
|
|
|
| // static
|
| void Map::GeneralizeFieldType(Handle<Map> map, int modify_index,
|
| Representation new_representation,
|
| - Handle<HeapType> new_field_type) {
|
| + Handle<FieldType> new_field_type) {
|
| Isolate* isolate = map->GetIsolate();
|
|
|
| // Check if we actually need to generalize the field type at all.
|
| Handle<DescriptorArray> old_descriptors(map->instance_descriptors(), isolate);
|
| Representation old_representation =
|
| old_descriptors->GetDetails(modify_index).representation();
|
| - Handle<HeapType> old_field_type(old_descriptors->GetFieldType(modify_index),
|
| - isolate);
|
| + Handle<FieldType> old_field_type(old_descriptors->GetFieldType(modify_index),
|
| + isolate);
|
|
|
| if (old_representation.Equals(new_representation) &&
|
| !FieldTypeIsCleared(new_representation, *new_field_type) &&
|
| @@ -3322,20 +3322,16 @@ void Map::GeneralizeFieldType(Handle<Map> map, int modify_index,
|
|
|
| if (FLAG_trace_generalization) {
|
| map->PrintGeneralization(
|
| - stdout, "field type generalization",
|
| - modify_index, map->NumberOfOwnDescriptors(),
|
| - map->NumberOfOwnDescriptors(), false,
|
| - details.representation(), details.representation(),
|
| - *old_field_type, *new_field_type);
|
| + stdout, "field type generalization", modify_index,
|
| + map->NumberOfOwnDescriptors(), map->NumberOfOwnDescriptors(), false,
|
| + details.representation(), details.representation(), old_field_type,
|
| + MaybeHandle<Object>(), new_field_type, MaybeHandle<Object>());
|
| }
|
| }
|
|
|
| -
|
| -static inline Handle<HeapType> GetFieldType(Isolate* isolate,
|
| - Handle<DescriptorArray> descriptors,
|
| - int descriptor,
|
| - PropertyLocation location,
|
| - Representation representation) {
|
| +static inline Handle<FieldType> GetFieldType(
|
| + Isolate* isolate, Handle<DescriptorArray> descriptors, int descriptor,
|
| + PropertyLocation location, Representation representation) {
|
| #ifdef DEBUG
|
| PropertyDetails details = descriptors->GetDetails(descriptor);
|
| DCHECK_EQ(kData, details.kind());
|
| @@ -3380,7 +3376,7 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| PropertyKind new_kind,
|
| PropertyAttributes new_attributes,
|
| Representation new_representation,
|
| - Handle<HeapType> new_field_type,
|
| + Handle<FieldType> new_field_type,
|
| StoreMode store_mode) {
|
| DCHECK_NE(kAccessor, new_kind); // TODO(ishell): not supported yet.
|
| DCHECK(store_mode != FORCE_FIELD || modify_index >= 0);
|
| @@ -3409,8 +3405,9 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| stdout, "uninitialized field", modify_index,
|
| old_map->NumberOfOwnDescriptors(),
|
| old_map->NumberOfOwnDescriptors(), false, old_representation,
|
| - new_representation, old_descriptors->GetFieldType(modify_index),
|
| - *new_field_type);
|
| + new_representation,
|
| + handle(old_descriptors->GetFieldType(modify_index), isolate),
|
| + MaybeHandle<Object>(), new_field_type, MaybeHandle<Object>());
|
| }
|
| Handle<Map> field_owner(old_map->FindFieldOwner(modify_index), isolate);
|
|
|
| @@ -3526,11 +3523,11 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| PropertyLocation tmp_location = tmp_details.location();
|
| if (tmp_location == kField) {
|
| if (next_kind == kData) {
|
| - Handle<HeapType> next_field_type;
|
| + Handle<FieldType> next_field_type;
|
| if (modify_index == i) {
|
| next_field_type = new_field_type;
|
| if (!property_kind_reconfiguration) {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i,
|
| old_details.location(), tmp_representation);
|
| Representation old_representation = old_details.representation();
|
| @@ -3539,7 +3536,7 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| next_field_type, isolate);
|
| }
|
| } else {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i, old_details.location(),
|
| tmp_representation);
|
| next_field_type = old_field_type;
|
| @@ -3694,17 +3691,17 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
|
|
| if (next_location == kField) {
|
| if (next_kind == kData) {
|
| - Handle<HeapType> target_field_type =
|
| + Handle<FieldType> target_field_type =
|
| GetFieldType(isolate, target_descriptors, i,
|
| target_details.location(), next_representation);
|
|
|
| - Handle<HeapType> next_field_type;
|
| + Handle<FieldType> next_field_type;
|
| if (modify_index == i) {
|
| next_field_type = GeneralizeFieldType(
|
| target_details.representation(), target_field_type,
|
| new_representation, new_field_type, isolate);
|
| if (!property_kind_reconfiguration) {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i,
|
| old_details.location(), next_representation);
|
| next_field_type = GeneralizeFieldType(
|
| @@ -3712,7 +3709,7 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| next_representation, next_field_type, isolate);
|
| }
|
| } else {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i, old_details.location(),
|
| next_representation);
|
| next_field_type = GeneralizeFieldType(
|
| @@ -3771,11 +3768,11 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
|
|
| if (next_location == kField) {
|
| if (next_kind == kData) {
|
| - Handle<HeapType> next_field_type;
|
| + Handle<FieldType> next_field_type;
|
| if (modify_index == i) {
|
| next_field_type = new_field_type;
|
| if (!property_kind_reconfiguration) {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i,
|
| old_details.location(), next_representation);
|
| next_field_type = GeneralizeFieldType(
|
| @@ -3783,7 +3780,7 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| next_representation, next_field_type, isolate);
|
| }
|
| } else {
|
| - Handle<HeapType> old_field_type =
|
| + Handle<FieldType> old_field_type =
|
| GetFieldType(isolate, old_descriptors, i, old_details.location(),
|
| next_representation);
|
| next_field_type = old_field_type;
|
| @@ -3851,23 +3848,28 @@ Handle<Map> Map::ReconfigureProperty(Handle<Map> old_map, int modify_index,
|
| if (FLAG_trace_generalization && modify_index >= 0) {
|
| PropertyDetails old_details = old_descriptors->GetDetails(modify_index);
|
| PropertyDetails new_details = new_descriptors->GetDetails(modify_index);
|
| - Handle<HeapType> old_field_type =
|
| - (old_details.type() == DATA)
|
| - ? handle(old_descriptors->GetFieldType(modify_index), isolate)
|
| - : HeapType::Constant(
|
| - handle(old_descriptors->GetValue(modify_index), isolate),
|
| - isolate);
|
| - Handle<HeapType> new_field_type =
|
| - (new_details.type() == DATA)
|
| - ? handle(new_descriptors->GetFieldType(modify_index), isolate)
|
| - : HeapType::Constant(
|
| - handle(new_descriptors->GetValue(modify_index), isolate),
|
| - isolate);
|
| + MaybeHandle<FieldType> old_field_type;
|
| + MaybeHandle<FieldType> new_field_type;
|
| + MaybeHandle<Object> old_value;
|
| + MaybeHandle<Object> new_value;
|
| + if (old_details.type() == DATA) {
|
| + old_field_type =
|
| + handle(old_descriptors->GetFieldType(modify_index), isolate);
|
| + } else {
|
| + old_value = handle(old_descriptors->GetValue(modify_index), isolate);
|
| + }
|
| + if (new_details.type() == DATA) {
|
| + new_field_type =
|
| + handle(new_descriptors->GetFieldType(modify_index), isolate);
|
| + } else {
|
| + new_value = handle(new_descriptors->GetValue(modify_index), isolate);
|
| + }
|
| +
|
| old_map->PrintGeneralization(
|
| stdout, "", modify_index, split_nof, old_nof,
|
| old_details.location() == kDescriptor && store_mode == FORCE_FIELD,
|
| old_details.representation(), new_details.representation(),
|
| - *old_field_type, *new_field_type);
|
| + old_field_type, old_value, new_field_type, new_value);
|
| }
|
|
|
| Handle<LayoutDescriptor> new_layout_descriptor =
|
| @@ -3893,7 +3895,7 @@ Handle<Map> Map::GeneralizeAllFieldRepresentations(
|
| if (details.type() == DATA) {
|
| map = ReconfigureProperty(map, i, kData, details.attributes(),
|
| Representation::Tagged(),
|
| - HeapType::Any(map->GetIsolate()), FORCE_FIELD);
|
| + FieldType::Any(map->GetIsolate()), FORCE_FIELD);
|
| }
|
| }
|
| return map;
|
| @@ -3942,7 +3944,7 @@ MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) {
|
| }
|
| switch (new_details.type()) {
|
| case DATA: {
|
| - HeapType* new_type = new_descriptors->GetFieldType(i);
|
| + FieldType* new_type = new_descriptors->GetFieldType(i);
|
| // Cleared field types need special treatment. They represent lost
|
| // knowledge, so we must first generalize the new_type to "Any".
|
| if (FieldTypeIsCleared(new_details.representation(), new_type)) {
|
| @@ -3950,7 +3952,7 @@ MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) {
|
| }
|
| PropertyType old_property_type = old_details.type();
|
| if (old_property_type == DATA) {
|
| - HeapType* old_type = old_descriptors->GetFieldType(i);
|
| + FieldType* old_type = old_descriptors->GetFieldType(i);
|
| if (FieldTypeIsCleared(old_details.representation(), old_type) ||
|
| !old_type->NowIs(new_type)) {
|
| return MaybeHandle<Map>();
|
| @@ -3966,8 +3968,8 @@ MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) {
|
| }
|
| case ACCESSOR: {
|
| #ifdef DEBUG
|
| - HeapType* new_type = new_descriptors->GetFieldType(i);
|
| - DCHECK(HeapType::Any()->Is(new_type));
|
| + FieldType* new_type = new_descriptors->GetFieldType(i);
|
| + DCHECK(new_type->IsAny());
|
| #endif
|
| break;
|
| }
|
| @@ -3992,7 +3994,7 @@ MaybeHandle<Map> Map::TryUpdate(Handle<Map> old_map) {
|
| Handle<Map> Map::Update(Handle<Map> map) {
|
| if (!map->is_deprecated()) return map;
|
| return ReconfigureProperty(map, -1, kData, NONE, Representation::None(),
|
| - HeapType::None(map->GetIsolate()),
|
| + FieldType::None(map->GetIsolate()),
|
| ALLOW_IN_DESCRIPTOR);
|
| }
|
|
|
| @@ -9438,7 +9440,7 @@ Handle<Map> Map::CopyReplaceDescriptors(
|
| for (int i = 0; i < length; i++) {
|
| descriptors->SetRepresentation(i, Representation::Tagged());
|
| if (descriptors->GetDetails(i).type() == DATA) {
|
| - descriptors->SetValue(i, HeapType::Any());
|
| + descriptors->SetValue(i, FieldType::Any());
|
| }
|
| }
|
| result->InitializeDescriptors(*descriptors,
|
| @@ -9790,7 +9792,7 @@ Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor,
|
| PropertyAttributes attributes =
|
| descriptors->GetDetails(descriptor).attributes();
|
| Representation representation = value->OptimalRepresentation();
|
| - Handle<HeapType> type = value->OptimalType(isolate, representation);
|
| + Handle<FieldType> type = value->OptimalType(isolate, representation);
|
|
|
| return ReconfigureProperty(map, descriptor, kData, attributes, representation,
|
| type, FORCE_FIELD);
|
| @@ -9827,7 +9829,7 @@ Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name,
|
| } else if (!map->TooManyFastProperties(store_mode)) {
|
| Isolate* isolate = name->GetIsolate();
|
| Representation representation = value->OptimalRepresentation();
|
| - Handle<HeapType> type = value->OptimalType(isolate, representation);
|
| + Handle<FieldType> type = value->OptimalType(isolate, representation);
|
| maybe_map =
|
| Map::CopyWithField(map, name, type, attributes, representation, flag);
|
| }
|
| @@ -9872,7 +9874,7 @@ Handle<Map> Map::ReconfigureExistingProperty(Handle<Map> map, int descriptor,
|
| Isolate* isolate = map->GetIsolate();
|
| Handle<Map> new_map = ReconfigureProperty(
|
| map, descriptor, kind, attributes, Representation::None(),
|
| - HeapType::None(isolate), FORCE_FIELD);
|
| + FieldType::None(isolate), FORCE_FIELD);
|
| return new_map;
|
| }
|
|
|
|
|