diff options
Diffstat (limited to 'deps/v8/src/compiler/access-info.cc')
-rw-r--r-- | deps/v8/src/compiler/access-info.cc | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/deps/v8/src/compiler/access-info.cc b/deps/v8/src/compiler/access-info.cc index 4c8923325b..7c35df243a 100644 --- a/deps/v8/src/compiler/access-info.cc +++ b/deps/v8/src/compiler/access-info.cc @@ -139,18 +139,20 @@ PropertyAccessInfo PropertyAccessInfo::FastDataConstant( // static PropertyAccessInfo PropertyAccessInfo::FastAccessorConstant( - Zone* zone, MapRef receiver_map, base::Optional<ObjectRef> constant, - base::Optional<JSObjectRef> holder) { - return PropertyAccessInfo(zone, kFastAccessorConstant, holder, constant, {}, - {{receiver_map}, zone}); + Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder, + base::Optional<ObjectRef> constant, + base::Optional<JSObjectRef> api_holder) { + return PropertyAccessInfo(zone, kFastAccessorConstant, holder, constant, + api_holder, {} /* name */, {{receiver_map}, zone}); } // static PropertyAccessInfo PropertyAccessInfo::ModuleExport(Zone* zone, MapRef receiver_map, CellRef cell) { - return PropertyAccessInfo(zone, kModuleExport, {}, cell, {}, - {{receiver_map}, zone}); + return PropertyAccessInfo(zone, kModuleExport, {} /* holder */, + cell /* constant */, {} /* api_holder */, + {} /* name */, {{receiver_map}, zone}); } // static @@ -170,9 +172,11 @@ PropertyAccessInfo PropertyAccessInfo::DictionaryProtoDataConstant( // static PropertyAccessInfo PropertyAccessInfo::DictionaryProtoAccessorConstant( Zone* zone, MapRef receiver_map, base::Optional<JSObjectRef> holder, - ObjectRef constant, NameRef property_name) { + ObjectRef constant, base::Optional<JSObjectRef> api_holder, + NameRef property_name) { return PropertyAccessInfo(zone, kDictionaryProtoAccessorConstant, holder, - constant, property_name, {{receiver_map}, zone}); + constant, api_holder, property_name, + {{receiver_map}, zone}); } PropertyAccessInfo::PropertyAccessInfo(Zone* zone) @@ -196,12 +200,13 @@ PropertyAccessInfo::PropertyAccessInfo( PropertyAccessInfo::PropertyAccessInfo( Zone* zone, Kind kind, base::Optional<JSObjectRef> holder, - base::Optional<ObjectRef> constant, base::Optional<NameRef> name, - ZoneVector<MapRef>&& lookup_start_object_maps) + base::Optional<ObjectRef> constant, base::Optional<JSObjectRef> api_holder, + base::Optional<NameRef> name, ZoneVector<MapRef>&& lookup_start_object_maps) : kind_(kind), lookup_start_object_maps_(lookup_start_object_maps), constant_(constant), holder_(holder), + api_holder_(api_holder), unrecorded_dependencies_(zone), field_representation_(Representation::None()), field_type_(Type::Any()), @@ -544,8 +549,8 @@ PropertyAccessInfo AccessorAccessInfoHelper( DCHECK(!map.is_dictionary_map()); // HasProperty checks don't call getter/setters, existence is sufficient. - return PropertyAccessInfo::FastAccessorConstant(zone, receiver_map, {}, - holder); + return PropertyAccessInfo::FastAccessorConstant(zone, receiver_map, holder, + {}, {}); } Handle<Object> maybe_accessors = get_accessors(); if (!maybe_accessors->IsAccessorPair()) { @@ -559,6 +564,7 @@ PropertyAccessInfo AccessorAccessInfoHelper( base::Optional<ObjectRef> accessor_ref = TryMakeRef(broker, accessor); if (!accessor_ref.has_value()) return PropertyAccessInfo::Invalid(zone); + base::Optional<JSObjectRef> api_holder_ref; if (!accessor->IsJSFunction()) { CallOptimization optimization(broker->local_isolate_or_isolate(), accessor); if (!optimization.is_simple_api_call() || @@ -567,24 +573,22 @@ PropertyAccessInfo AccessorAccessInfoHelper( return PropertyAccessInfo::Invalid(zone); } - CallOptimization::HolderLookup lookup; - Handle<JSObject> holder_handle = broker->CanonicalPersistentHandle( + CallOptimization::HolderLookup holder_lookup; + Handle<JSObject> api_holder = broker->CanonicalPersistentHandle( optimization.LookupHolderOfExpectedType( broker->local_isolate_or_isolate(), receiver_map.object(), - &lookup)); - if (lookup == CallOptimization::kHolderNotFound) { + &holder_lookup)); + if (holder_lookup == CallOptimization::kHolderNotFound) { return PropertyAccessInfo::Invalid(zone); } - DCHECK_IMPLIES(lookup == CallOptimization::kHolderIsReceiver, - holder_handle.is_null()); - DCHECK_IMPLIES(lookup == CallOptimization::kHolderFound, - !holder_handle.is_null()); - - if (holder_handle.is_null()) { - holder = {}; - } else { - holder = TryMakeRef(broker, holder_handle); - if (!holder.has_value()) return PropertyAccessInfo::Invalid(zone); + DCHECK_IMPLIES(holder_lookup == CallOptimization::kHolderIsReceiver, + api_holder.is_null()); + DCHECK_IMPLIES(holder_lookup == CallOptimization::kHolderFound, + !api_holder.is_null()); + + if (!api_holder.is_null()) { + api_holder_ref = TryMakeRef(broker, api_holder); + if (!api_holder_ref.has_value()) return PropertyAccessInfo::Invalid(zone); } } if (access_mode == AccessMode::kLoad) { @@ -602,11 +606,12 @@ PropertyAccessInfo AccessorAccessInfoHelper( } if (map.is_dictionary_map()) { + CHECK(!api_holder_ref.has_value()); return PropertyAccessInfo::DictionaryProtoAccessorConstant( - zone, receiver_map, holder, accessor_ref.value(), name); + zone, receiver_map, holder, accessor_ref.value(), api_holder_ref, name); } else { return PropertyAccessInfo::FastAccessorConstant( - zone, receiver_map, accessor_ref.value(), holder); + zone, receiver_map, holder, accessor_ref.value(), api_holder_ref); } } @@ -876,7 +881,8 @@ PropertyAccessInfo AccessInfoFactory::ComputePropertyAccessInfo( if (!map_prototype_map.object()->IsJSObjectMap()) { // Don't allow proxies on the prototype chain. if (!prototype.IsNull()) { - DCHECK(prototype.object()->IsJSProxy()); + DCHECK(prototype.object()->IsJSProxy() || + prototype.object()->IsWasmObject()); return Invalid(); } |