diff options
Diffstat (limited to 'deps/v8/src/compiler/access-info.h')
-rw-r--r-- | deps/v8/src/compiler/access-info.h | 62 |
1 files changed, 28 insertions, 34 deletions
diff --git a/deps/v8/src/compiler/access-info.h b/deps/v8/src/compiler/access-info.h index cae119140a..daa872286f 100644 --- a/deps/v8/src/compiler/access-info.h +++ b/deps/v8/src/compiler/access-info.h @@ -19,7 +19,6 @@ class CompilationDependencies; class Factory; class TypeCache; - namespace compiler { // Whether we are loading a property or storing to a property. @@ -27,64 +26,61 @@ enum class AccessMode { kLoad, kStore }; std::ostream& operator<<(std::ostream&, AccessMode); +typedef std::vector<Handle<Map>> MapList; // Mapping of transition source to transition target. typedef std::vector<std::pair<Handle<Map>, Handle<Map>>> MapTransitionList; - // This class encapsulates all information required to access a certain element. class ElementAccessInfo final { public: ElementAccessInfo(); - ElementAccessInfo(Type* receiver_type, ElementsKind elements_kind, - MaybeHandle<JSObject> holder); + ElementAccessInfo(MapList const& receiver_maps, ElementsKind elements_kind); - MaybeHandle<JSObject> holder() const { return holder_; } ElementsKind elements_kind() const { return elements_kind_; } - Type* receiver_type() const { return receiver_type_; } + MapList const& receiver_maps() const { return receiver_maps_; } MapTransitionList& transitions() { return transitions_; } MapTransitionList const& transitions() const { return transitions_; } private: ElementsKind elements_kind_; - MaybeHandle<JSObject> holder_; - Type* receiver_type_; + MapList receiver_maps_; MapTransitionList transitions_; }; - -// Additional checks that need to be perform for data field accesses. -enum class FieldCheck : uint8_t { - // No additional checking needed. - kNone, - // Check that the [[ViewedArrayBuffer]] of {JSArrayBufferView}s - // was not neutered. - kJSArrayBufferViewBufferNotNeutered, -}; - - // This class encapsulates all information required to access a certain // object property, either on the object itself or on the prototype chain. class PropertyAccessInfo final { public: - enum Kind { kInvalid, kNotFound, kDataConstant, kDataField }; - - static PropertyAccessInfo NotFound(Type* receiver_type, + enum Kind { + kInvalid, + kNotFound, + kDataConstant, + kDataField, + kAccessorConstant + }; + + static PropertyAccessInfo NotFound(MapList const& receiver_maps, MaybeHandle<JSObject> holder); - static PropertyAccessInfo DataConstant(Type* receiver_type, + static PropertyAccessInfo DataConstant(MapList const& receiver_maps, Handle<Object> constant, MaybeHandle<JSObject> holder); static PropertyAccessInfo DataField( - Type* receiver_type, FieldIndex field_index, Type* field_type, - FieldCheck field_check = FieldCheck::kNone, + MapList const& receiver_maps, FieldIndex field_index, Type* field_type, MaybeHandle<JSObject> holder = MaybeHandle<JSObject>(), MaybeHandle<Map> transition_map = MaybeHandle<Map>()); + static PropertyAccessInfo AccessorConstant(MapList const& receiver_maps, + Handle<Object> constant, + MaybeHandle<JSObject> holder); PropertyAccessInfo(); + bool Merge(PropertyAccessInfo const* that) WARN_UNUSED_RESULT; + bool IsNotFound() const { return kind() == kNotFound; } bool IsDataConstant() const { return kind() == kDataConstant; } bool IsDataField() const { return kind() == kDataField; } + bool IsAccessorConstant() const { return kind() == kAccessorConstant; } bool HasTransitionMap() const { return !transition_map().is_null(); } @@ -92,27 +88,25 @@ class PropertyAccessInfo final { MaybeHandle<JSObject> holder() const { return holder_; } MaybeHandle<Map> transition_map() const { return transition_map_; } Handle<Object> constant() const { return constant_; } - FieldCheck field_check() const { return field_check_; } FieldIndex field_index() const { return field_index_; } Type* field_type() const { return field_type_; } - Type* receiver_type() const { return receiver_type_; } + MapList const& receiver_maps() const { return receiver_maps_; } private: - PropertyAccessInfo(MaybeHandle<JSObject> holder, Type* receiver_type); - PropertyAccessInfo(MaybeHandle<JSObject> holder, Handle<Object> constant, - Type* receiver_type); + PropertyAccessInfo(MaybeHandle<JSObject> holder, + MapList const& receiver_maps); + PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, + Handle<Object> constant, MapList const& receiver_maps); PropertyAccessInfo(MaybeHandle<JSObject> holder, MaybeHandle<Map> transition_map, FieldIndex field_index, - FieldCheck field_check, Type* field_type, - Type* receiver_type); + Type* field_type, MapList const& receiver_maps); Kind kind_; - Type* receiver_type_; + MapList receiver_maps_; Handle<Object> constant_; MaybeHandle<Map> transition_map_; MaybeHandle<JSObject> holder_; FieldIndex field_index_; - FieldCheck field_check_; Type* field_type_; }; |