| Index: src/compiler/access-info.cc
|
| diff --git a/src/compiler/access-info.cc b/src/compiler/access-info.cc
|
| index 3b402a9b8a51ffdfd6870a09bbbaf2a9ac03ab21..d43d96552a304535d4d9cc815889e8da6debe3ff 100644
|
| --- a/src/compiler/access-info.cc
|
| +++ b/src/compiler/access-info.cc
|
| @@ -61,26 +61,26 @@ std::ostream& operator<<(std::ostream& os, AccessMode access_mode) {
|
|
|
| ElementAccessInfo::ElementAccessInfo() {}
|
|
|
| -ElementAccessInfo::ElementAccessInfo(MapList const& receiver_maps,
|
| +ElementAccessInfo::ElementAccessInfo(MapHandles const& receiver_maps,
|
| ElementsKind elements_kind)
|
| : elements_kind_(elements_kind), receiver_maps_(receiver_maps) {}
|
|
|
| // static
|
| -PropertyAccessInfo PropertyAccessInfo::NotFound(MapList const& receiver_maps,
|
| +PropertyAccessInfo PropertyAccessInfo::NotFound(MapHandles const& receiver_maps,
|
| MaybeHandle<JSObject> holder) {
|
| return PropertyAccessInfo(holder, receiver_maps);
|
| }
|
|
|
| // static
|
| PropertyAccessInfo PropertyAccessInfo::DataConstant(
|
| - MapList const& receiver_maps, Handle<Object> constant,
|
| + MapHandles const& receiver_maps, Handle<Object> constant,
|
| MaybeHandle<JSObject> holder) {
|
| return PropertyAccessInfo(kDataConstant, holder, constant, receiver_maps);
|
| }
|
|
|
| // static
|
| PropertyAccessInfo PropertyAccessInfo::DataField(
|
| - PropertyConstness constness, MapList const& receiver_maps,
|
| + PropertyConstness constness, MapHandles const& receiver_maps,
|
| FieldIndex field_index, MachineRepresentation field_representation,
|
| Type* field_type, MaybeHandle<Map> field_map, MaybeHandle<JSObject> holder,
|
| MaybeHandle<Map> transition_map) {
|
| @@ -92,7 +92,7 @@ PropertyAccessInfo PropertyAccessInfo::DataField(
|
|
|
| // static
|
| PropertyAccessInfo PropertyAccessInfo::AccessorConstant(
|
| - MapList const& receiver_maps, Handle<Object> constant,
|
| + MapHandles const& receiver_maps, Handle<Object> constant,
|
| MaybeHandle<JSObject> holder) {
|
| return PropertyAccessInfo(kAccessorConstant, holder, constant, receiver_maps);
|
| }
|
| @@ -103,7 +103,7 @@ PropertyAccessInfo::PropertyAccessInfo()
|
| field_type_(Type::None()) {}
|
|
|
| PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder,
|
| - MapList const& receiver_maps)
|
| + MapHandles const& receiver_maps)
|
| : kind_(kNotFound),
|
| receiver_maps_(receiver_maps),
|
| holder_(holder),
|
| @@ -112,7 +112,7 @@ PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder,
|
|
|
| PropertyAccessInfo::PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder,
|
| Handle<Object> constant,
|
| - MapList const& receiver_maps)
|
| + MapHandles const& receiver_maps)
|
| : kind_(kind),
|
| receiver_maps_(receiver_maps),
|
| constant_(constant),
|
| @@ -123,7 +123,8 @@ PropertyAccessInfo::PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder,
|
| PropertyAccessInfo::PropertyAccessInfo(
|
| Kind kind, MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map,
|
| FieldIndex field_index, MachineRepresentation field_representation,
|
| - Type* field_type, MaybeHandle<Map> field_map, MapList const& receiver_maps)
|
| + Type* field_type, MaybeHandle<Map> field_map,
|
| + MapHandles const& receiver_maps)
|
| : kind_(kind),
|
| receiver_maps_(receiver_maps),
|
| transition_map_(transition_map),
|
| @@ -228,12 +229,12 @@ bool AccessInfoFactory::ComputeElementAccessInfo(
|
| // Check if it is safe to inline element access for the {map}.
|
| if (!CanInlineElementAccess(map)) return false;
|
| ElementsKind const elements_kind = map->elements_kind();
|
| - *access_info = ElementAccessInfo(MapList{map}, elements_kind);
|
| + *access_info = ElementAccessInfo(MapHandles{map}, elements_kind);
|
| return true;
|
| }
|
|
|
| bool AccessInfoFactory::ComputeElementAccessInfos(
|
| - MapHandleList const& maps, AccessMode access_mode,
|
| + MapHandles const& maps, AccessMode access_mode,
|
| ZoneVector<ElementAccessInfo>* access_infos) {
|
| if (access_mode == AccessMode::kLoad) {
|
| // For polymorphic loads of similar elements kinds (i.e. all tagged or all
|
| @@ -248,26 +249,28 @@ bool AccessInfoFactory::ComputeElementAccessInfos(
|
| }
|
|
|
| // Collect possible transition targets.
|
| - MapHandleList possible_transition_targets(maps.length());
|
| + MapHandles possible_transition_targets;
|
| + possible_transition_targets.reserve(maps.size());
|
| for (Handle<Map> map : maps) {
|
| if (Map::TryUpdate(map).ToHandle(&map)) {
|
| if (CanInlineElementAccess(map) &&
|
| IsFastElementsKind(map->elements_kind()) &&
|
| GetInitialFastElementsKind() != map->elements_kind()) {
|
| - possible_transition_targets.Add(map);
|
| + possible_transition_targets.push_back(map);
|
| }
|
| }
|
| }
|
|
|
| // Separate the actual receiver maps and the possible transition sources.
|
| - MapHandleList receiver_maps(maps.length());
|
| - MapTransitionList transitions(maps.length());
|
| + MapHandles receiver_maps;
|
| + receiver_maps.reserve(maps.size());
|
| + MapTransitionList transitions(maps.size());
|
| for (Handle<Map> map : maps) {
|
| if (Map::TryUpdate(map).ToHandle(&map)) {
|
| Map* transition_target =
|
| - map->FindElementsKindTransitionedMap(&possible_transition_targets);
|
| + map->FindElementsKindTransitionedMap(possible_transition_targets);
|
| if (transition_target == nullptr) {
|
| - receiver_maps.Add(map);
|
| + receiver_maps.push_back(map);
|
| } else {
|
| DCHECK(!map->is_stable());
|
| transitions.push_back(std::make_pair(map, handle(transition_target)));
|
| @@ -375,7 +378,7 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| }
|
| }
|
| *access_info = PropertyAccessInfo::DataField(
|
| - details.constness(), MapList{receiver_map}, field_index,
|
| + details.constness(), MapHandles{receiver_map}, field_index,
|
| field_representation, field_type, field_map, holder);
|
| return true;
|
| } else {
|
| @@ -389,7 +392,7 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| if (details.kind() == kData) {
|
| DCHECK(!FLAG_track_constant_fields);
|
| *access_info = PropertyAccessInfo::DataConstant(
|
| - MapList{receiver_map},
|
| + MapHandles{receiver_map},
|
| handle(descriptors->GetValue(number), isolate()), holder);
|
| return true;
|
| } else {
|
| @@ -420,7 +423,7 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| }
|
| }
|
| *access_info = PropertyAccessInfo::AccessorConstant(
|
| - MapList{receiver_map}, accessor, holder);
|
| + MapHandles{receiver_map}, accessor, holder);
|
| return true;
|
| }
|
| }
|
| @@ -463,7 +466,7 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| // on the language mode of the load operation.
|
| // Implemented according to ES6 section 9.1.8 [[Get]] (P, Receiver)
|
| *access_info =
|
| - PropertyAccessInfo::NotFound(MapList{receiver_map}, holder);
|
| + PropertyAccessInfo::NotFound(MapHandles{receiver_map}, holder);
|
| return true;
|
| } else {
|
| return false;
|
| @@ -482,7 +485,7 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| }
|
|
|
| bool AccessInfoFactory::ComputePropertyAccessInfos(
|
| - MapHandleList const& maps, Handle<Name> name, AccessMode access_mode,
|
| + MapHandles const& maps, Handle<Name> name, AccessMode access_mode,
|
| ZoneVector<PropertyAccessInfo>* access_infos) {
|
| for (Handle<Map> map : maps) {
|
| if (Map::TryUpdate(map).ToHandle(&map)) {
|
| @@ -528,14 +531,12 @@ Maybe<ElementsKind> GeneralizeElementsKind(ElementsKind this_kind,
|
|
|
| } // namespace
|
|
|
| -bool AccessInfoFactory::ConsolidateElementLoad(MapHandleList const& maps,
|
| +bool AccessInfoFactory::ConsolidateElementLoad(MapHandles const& maps,
|
| ElementAccessInfo* access_info) {
|
| - if (maps.is_empty()) return false;
|
| - InstanceType instance_type = maps.first()->instance_type();
|
| - ElementsKind elements_kind = maps.first()->elements_kind();
|
| - MapList receiver_maps(maps.length());
|
| - for (int i = 0; i < maps.length(); ++i) {
|
| - Handle<Map> map = maps[i];
|
| + if (maps.empty()) return false;
|
| + InstanceType instance_type = maps.front()->instance_type();
|
| + ElementsKind elements_kind = maps.front()->elements_kind();
|
| + for (Handle<Map> map : maps) {
|
| if (!CanInlineElementAccess(map) || map->instance_type() != instance_type) {
|
| return false;
|
| }
|
| @@ -543,9 +544,8 @@ bool AccessInfoFactory::ConsolidateElementLoad(MapHandleList const& maps,
|
| .To(&elements_kind)) {
|
| return false;
|
| }
|
| - receiver_maps[i] = map;
|
| }
|
| - *access_info = ElementAccessInfo(receiver_maps, elements_kind);
|
| + *access_info = ElementAccessInfo(maps, elements_kind);
|
| return true;
|
| }
|
|
|
| @@ -581,8 +581,9 @@ bool AccessInfoFactory::LookupSpecialFieldAccessor(
|
| }
|
| }
|
| // Special fields are always mutable.
|
| - *access_info = PropertyAccessInfo::DataField(
|
| - kMutable, MapList{map}, field_index, field_representation, field_type);
|
| + *access_info =
|
| + PropertyAccessInfo::DataField(kMutable, MapHandles{map}, field_index,
|
| + field_representation, field_type);
|
| return true;
|
| }
|
| return false;
|
| @@ -640,8 +641,8 @@ bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name,
|
| dependencies()->AssumeMapNotDeprecated(transition_map);
|
| // Transitioning stores are never stores to constant fields.
|
| *access_info = PropertyAccessInfo::DataField(
|
| - kMutable, MapList{map}, field_index, field_representation, field_type,
|
| - field_map, holder, transition_map);
|
| + kMutable, MapHandles{map}, field_index, field_representation,
|
| + field_type, field_map, holder, transition_map);
|
| return true;
|
| }
|
| return false;
|
|
|