| Index: src/compiler/access-info.cc
|
| diff --git a/src/compiler/access-info.cc b/src/compiler/access-info.cc
|
| index 4748023c16c7d1ff9cb460fb90a919d9721f78c6..0693d35c0ae64f159d522fcb0891ca34eb39775f 100644
|
| --- a/src/compiler/access-info.cc
|
| +++ b/src/compiler/access-info.cc
|
| @@ -75,9 +75,10 @@ PropertyAccessInfo PropertyAccessInfo::DataConstant(
|
| // 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);
|
| + FieldCheck field_check, MaybeHandle<JSObject> holder,
|
| + MaybeHandle<Map> transition_map) {
|
| + return PropertyAccessInfo(holder, transition_map, field_index, field_check,
|
| + field_type, receiver_type);
|
| }
|
|
|
|
|
| @@ -116,13 +117,15 @@ PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder,
|
|
|
| PropertyAccessInfo::PropertyAccessInfo(MaybeHandle<JSObject> holder,
|
| MaybeHandle<Map> transition_map,
|
| - FieldIndex field_index, Type* field_type,
|
| + FieldIndex field_index,
|
| + FieldCheck field_check, Type* field_type,
|
| Type* receiver_type)
|
| : kind_(kDataField),
|
| receiver_type_(receiver_type),
|
| transition_map_(transition_map),
|
| holder_(holder),
|
| field_index_(field_index),
|
| + field_check_(field_check),
|
| field_type_(field_type) {}
|
|
|
|
|
| @@ -286,7 +289,8 @@ bool AccessInfoFactory::ComputePropertyAccessInfo(
|
| DCHECK(field_type->Is(Type::TaggedPointer()));
|
| }
|
| *access_info = PropertyAccessInfo::DataField(
|
| - Type::Class(receiver_map, zone()), field_index, field_type, holder);
|
| + Type::Class(receiver_map, zone()), field_index, field_type,
|
| + FieldCheck::kNone, holder);
|
| return true;
|
| } else {
|
| // TODO(bmeurer): Add support for accessors.
|
| @@ -390,6 +394,26 @@ bool AccessInfoFactory::LookupSpecialFieldAccessor(
|
| field_index, field_type);
|
| return true;
|
| }
|
| + // Check for special JSArrayBufferView field accessors.
|
| + if (Accessors::IsJSArrayBufferViewFieldAccessor(map, name, &offset)) {
|
| + FieldIndex field_index = FieldIndex::ForInObjectOffset(offset);
|
| + Type* field_type = Type::Tagged();
|
| + if (Name::Equals(factory()->byte_length_string(), name) ||
|
| + Name::Equals(factory()->byte_offset_string(), name)) {
|
| + // The JSArrayBufferView::byte_length and JSArrayBufferView::byte_offset
|
| + // properties are always numbers in the range [0, kMaxSafeInteger].
|
| + field_type = type_cache_.kPositiveSafeInteger;
|
| + } else if (map->IsJSTypedArrayMap()) {
|
| + DCHECK(Name::Equals(factory()->length_string(), name));
|
| + // The JSTypedArray::length property is always a number in the range
|
| + // [0, kMaxSafeInteger].
|
| + field_type = type_cache_.kPositiveSafeInteger;
|
| + }
|
| + *access_info = PropertyAccessInfo::DataField(
|
| + Type::Class(map, zone()), field_index, field_type,
|
| + FieldCheck::kJSArrayBufferViewBufferNotNeutered);
|
| + return true;
|
| + }
|
| return false;
|
| }
|
|
|
| @@ -440,9 +464,9 @@ bool AccessInfoFactory::LookupTransition(Handle<Map> map, Handle<Name> name,
|
| DCHECK(field_type->Is(Type::TaggedPointer()));
|
| }
|
| dependencies()->AssumeMapNotDeprecated(transition_map);
|
| - *access_info =
|
| - PropertyAccessInfo::DataField(Type::Class(map, zone()), field_index,
|
| - field_type, holder, transition_map);
|
| + *access_info = PropertyAccessInfo::DataField(
|
| + Type::Class(map, zone()), field_index, field_type, FieldCheck::kNone,
|
| + holder, transition_map);
|
| return true;
|
| }
|
| return false;
|
|
|