Index: src/compiler/property-access-info.cc |
diff --git a/src/compiler/property-access-info.cc b/src/compiler/property-access-info.cc |
index 4b2afb602fce25929cc89ecffa132eb3f8583e34..930098ac8c305733841a02008c6afceb1f80e5e0 100644 |
--- a/src/compiler/property-access-info.cc |
+++ b/src/compiler/property-access-info.cc |
@@ -28,11 +28,43 @@ std::ostream& operator<<(std::ostream& os, PropertyAccessMode access_mode) { |
} |
+// static |
+PropertyAccessInfo PropertyAccessInfo::NotFound(Type* receiver_type, |
+ MaybeHandle<JSObject> holder) { |
+ return PropertyAccessInfo(holder, receiver_type); |
+} |
+ |
+ |
+// static |
+PropertyAccessInfo PropertyAccessInfo::DataConstant( |
+ Type* receiver_type, Handle<Object> constant, |
+ MaybeHandle<JSObject> holder) { |
+ return PropertyAccessInfo(holder, constant, receiver_type); |
+} |
+ |
+ |
+// static |
+PropertyAccessInfo PropertyAccessInfo::DataField( |
+ Type* receiver_type, FieldIndex field_index, Type* field_type, |
+ MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map) { |
+ return PropertyAccessInfo(holder, transition_map, field_index, field_type, |
+ receiver_type); |
+} |
+ |
+ |
PropertyAccessInfo::PropertyAccessInfo() |
: kind_(kInvalid), receiver_type_(Type::None()), field_type_(Type::Any()) {} |
PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, |
+ Type* receiver_type) |
+ : kind_(kNotFound), |
+ receiver_type_(receiver_type), |
+ holder_(holder), |
+ field_type_(Type::Any()) {} |
+ |
+ |
+PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder, |
Handle<Object> constant, |
Type* receiver_type) |
: kind_(kDataConstant), |
@@ -95,7 +127,7 @@ bool PropertyAccessInfoFactory::ComputePropertyAccessInfo( |
} |
MaybeHandle<JSObject> holder; |
- while (true) { |
+ do { |
// Lookup the named property on the {map}. |
Handle<DescriptorArray> descriptors(map->instance_descriptors(), isolate()); |
int const number = descriptors->SearchWithCache(*name, *map); |
@@ -187,8 +219,12 @@ bool PropertyAccessInfoFactory::ComputePropertyAccessInfo( |
if (access_mode == PropertyAccessMode::kStore) { |
return LookupTransition(receiver_map, name, holder, access_info); |
} |
- // TODO(bmeurer): Handle the not found case if the prototype is null. |
- return false; |
+ // The property was not found, return undefined or throw depending |
+ // on the language mode of the load operation. |
+ // Implemented according to ES6 section 9.1.8 [[Get]] (P, Receiver) |
+ *access_info = PropertyAccessInfo::NotFound( |
+ Type::Class(receiver_map, zone()), holder); |
+ return true; |
} else { |
return false; |
} |
@@ -201,11 +237,25 @@ bool PropertyAccessInfoFactory::ComputePropertyAccessInfo( |
} |
map = handle(map_prototype->map(), isolate()); |
holder = map_prototype; |
+ } while (CanInlinePropertyAccess(map)); |
+ return false; |
+} |
- // Check if it is safe to inline property access for the {map}. |
- if (!CanInlinePropertyAccess(map)) return false; |
+ |
+bool PropertyAccessInfoFactory::ComputePropertyAccessInfos( |
+ MapHandleList const& maps, Handle<Name> name, |
+ PropertyAccessMode access_mode, |
+ ZoneVector<PropertyAccessInfo>* access_infos) { |
+ for (Handle<Map> map : maps) { |
+ if (Map::TryUpdate(map).ToHandle(&map)) { |
+ PropertyAccessInfo access_info; |
+ if (!ComputePropertyAccessInfo(map, name, access_mode, &access_info)) { |
+ return false; |
+ } |
+ access_infos->push_back(access_info); |
+ } |
} |
- return false; |
+ return true; |
} |
@@ -299,23 +349,6 @@ bool PropertyAccessInfoFactory::LookupTransition( |
} |
-bool PropertyAccessInfoFactory::ComputePropertyAccessInfos( |
- MapHandleList const& maps, Handle<Name> name, |
- PropertyAccessMode access_mode, |
- ZoneVector<PropertyAccessInfo>* access_infos) { |
- for (Handle<Map> map : maps) { |
- if (Map::TryUpdate(map).ToHandle(&map)) { |
- PropertyAccessInfo access_info; |
- if (!ComputePropertyAccessInfo(map, name, access_mode, &access_info)) { |
- return false; |
- } |
- access_infos->push_back(access_info); |
- } |
- } |
- return true; |
-} |
- |
- |
Factory* PropertyAccessInfoFactory::factory() const { |
return isolate()->factory(); |
} |