| 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();
|
| }
|
|
|