summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/access-info.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/access-info.cc')
-rw-r--r--deps/v8/src/compiler/access-info.cc64
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();
}