OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_ACCESS_INFO_H_ | 5 #ifndef V8_COMPILER_ACCESS_INFO_H_ |
6 #define V8_COMPILER_ACCESS_INFO_H_ | 6 #define V8_COMPILER_ACCESS_INFO_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 | 9 |
10 #include "src/field-index.h" | 10 #include "src/field-index.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 // Forward declarations. | 24 // Forward declarations. |
25 class Type; | 25 class Type; |
26 class TypeCache; | 26 class TypeCache; |
27 | 27 |
28 // Whether we are loading a property or storing to a property. | 28 // Whether we are loading a property or storing to a property. |
29 // For a store during literal creation, do not walk up the prototype chain. | 29 // For a store during literal creation, do not walk up the prototype chain. |
30 enum class AccessMode { kLoad, kStore, kStoreInLiteral }; | 30 enum class AccessMode { kLoad, kStore, kStoreInLiteral }; |
31 | 31 |
32 std::ostream& operator<<(std::ostream&, AccessMode); | 32 std::ostream& operator<<(std::ostream&, AccessMode); |
33 | 33 |
34 typedef std::vector<Handle<Map>> MapList; | |
35 | |
36 // Mapping of transition source to transition target. | 34 // Mapping of transition source to transition target. |
37 typedef std::vector<std::pair<Handle<Map>, Handle<Map>>> MapTransitionList; | 35 typedef std::vector<std::pair<Handle<Map>, Handle<Map>>> MapTransitionList; |
38 | 36 |
39 // This class encapsulates all information required to access a certain element. | 37 // This class encapsulates all information required to access a certain element. |
40 class ElementAccessInfo final { | 38 class ElementAccessInfo final { |
41 public: | 39 public: |
42 ElementAccessInfo(); | 40 ElementAccessInfo(); |
43 ElementAccessInfo(MapList const& receiver_maps, ElementsKind elements_kind); | 41 ElementAccessInfo(MapHandles const& receiver_maps, |
| 42 ElementsKind elements_kind); |
44 | 43 |
45 ElementsKind elements_kind() const { return elements_kind_; } | 44 ElementsKind elements_kind() const { return elements_kind_; } |
46 MapList const& receiver_maps() const { return receiver_maps_; } | 45 MapHandles const& receiver_maps() const { return receiver_maps_; } |
47 MapTransitionList& transitions() { return transitions_; } | 46 MapTransitionList& transitions() { return transitions_; } |
48 MapTransitionList const& transitions() const { return transitions_; } | 47 MapTransitionList const& transitions() const { return transitions_; } |
49 | 48 |
50 private: | 49 private: |
51 ElementsKind elements_kind_; | 50 ElementsKind elements_kind_; |
52 MapList receiver_maps_; | 51 MapHandles receiver_maps_; |
53 MapTransitionList transitions_; | 52 MapTransitionList transitions_; |
54 }; | 53 }; |
55 | 54 |
56 // This class encapsulates all information required to access a certain | 55 // This class encapsulates all information required to access a certain |
57 // object property, either on the object itself or on the prototype chain. | 56 // object property, either on the object itself or on the prototype chain. |
58 class PropertyAccessInfo final { | 57 class PropertyAccessInfo final { |
59 public: | 58 public: |
60 enum Kind { | 59 enum Kind { |
61 kInvalid, | 60 kInvalid, |
62 kNotFound, | 61 kNotFound, |
63 kDataConstant, | 62 kDataConstant, |
64 kDataField, | 63 kDataField, |
65 kDataConstantField, | 64 kDataConstantField, |
66 kAccessorConstant | 65 kAccessorConstant |
67 }; | 66 }; |
68 | 67 |
69 static PropertyAccessInfo NotFound(MapList const& receiver_maps, | 68 static PropertyAccessInfo NotFound(MapHandles const& receiver_maps, |
70 MaybeHandle<JSObject> holder); | 69 MaybeHandle<JSObject> holder); |
71 static PropertyAccessInfo DataConstant(MapList const& receiver_maps, | 70 static PropertyAccessInfo DataConstant(MapHandles const& receiver_maps, |
72 Handle<Object> constant, | 71 Handle<Object> constant, |
73 MaybeHandle<JSObject> holder); | 72 MaybeHandle<JSObject> holder); |
74 static PropertyAccessInfo DataField( | 73 static PropertyAccessInfo DataField( |
75 PropertyConstness constness, MapList const& receiver_maps, | 74 PropertyConstness constness, MapHandles const& receiver_maps, |
76 FieldIndex field_index, MachineRepresentation field_representation, | 75 FieldIndex field_index, MachineRepresentation field_representation, |
77 Type* field_type, MaybeHandle<Map> field_map = MaybeHandle<Map>(), | 76 Type* field_type, MaybeHandle<Map> field_map = MaybeHandle<Map>(), |
78 MaybeHandle<JSObject> holder = MaybeHandle<JSObject>(), | 77 MaybeHandle<JSObject> holder = MaybeHandle<JSObject>(), |
79 MaybeHandle<Map> transition_map = MaybeHandle<Map>()); | 78 MaybeHandle<Map> transition_map = MaybeHandle<Map>()); |
80 static PropertyAccessInfo AccessorConstant(MapList const& receiver_maps, | 79 static PropertyAccessInfo AccessorConstant(MapHandles const& receiver_maps, |
81 Handle<Object> constant, | 80 Handle<Object> constant, |
82 MaybeHandle<JSObject> holder); | 81 MaybeHandle<JSObject> holder); |
83 | 82 |
84 PropertyAccessInfo(); | 83 PropertyAccessInfo(); |
85 | 84 |
86 bool Merge(PropertyAccessInfo const* that, AccessMode access_mode, | 85 bool Merge(PropertyAccessInfo const* that, AccessMode access_mode, |
87 Zone* zone) WARN_UNUSED_RESULT; | 86 Zone* zone) WARN_UNUSED_RESULT; |
88 | 87 |
89 bool IsNotFound() const { return kind() == kNotFound; } | 88 bool IsNotFound() const { return kind() == kNotFound; } |
90 bool IsDataConstant() const { return kind() == kDataConstant; } | 89 bool IsDataConstant() const { return kind() == kDataConstant; } |
91 bool IsDataField() const { return kind() == kDataField; } | 90 bool IsDataField() const { return kind() == kDataField; } |
92 // TODO(ishell): rename to IsDataConstant() once constant field tracking | 91 // TODO(ishell): rename to IsDataConstant() once constant field tracking |
93 // is done. | 92 // is done. |
94 bool IsDataConstantField() const { return kind() == kDataConstantField; } | 93 bool IsDataConstantField() const { return kind() == kDataConstantField; } |
95 bool IsAccessorConstant() const { return kind() == kAccessorConstant; } | 94 bool IsAccessorConstant() const { return kind() == kAccessorConstant; } |
96 | 95 |
97 bool HasTransitionMap() const { return !transition_map().is_null(); } | 96 bool HasTransitionMap() const { return !transition_map().is_null(); } |
98 | 97 |
99 Kind kind() const { return kind_; } | 98 Kind kind() const { return kind_; } |
100 MaybeHandle<JSObject> holder() const { return holder_; } | 99 MaybeHandle<JSObject> holder() const { return holder_; } |
101 MaybeHandle<Map> transition_map() const { return transition_map_; } | 100 MaybeHandle<Map> transition_map() const { return transition_map_; } |
102 Handle<Object> constant() const { return constant_; } | 101 Handle<Object> constant() const { return constant_; } |
103 FieldIndex field_index() const { return field_index_; } | 102 FieldIndex field_index() const { return field_index_; } |
104 Type* field_type() const { return field_type_; } | 103 Type* field_type() const { return field_type_; } |
105 MachineRepresentation field_representation() const { | 104 MachineRepresentation field_representation() const { |
106 return field_representation_; | 105 return field_representation_; |
107 } | 106 } |
108 MaybeHandle<Map> field_map() const { return field_map_; } | 107 MaybeHandle<Map> field_map() const { return field_map_; } |
109 MapList const& receiver_maps() const { return receiver_maps_; } | 108 MapHandles const& receiver_maps() const { return receiver_maps_; } |
110 | 109 |
111 private: | 110 private: |
112 PropertyAccessInfo(MaybeHandle<JSObject> holder, | 111 PropertyAccessInfo(MaybeHandle<JSObject> holder, |
113 MapList const& receiver_maps); | 112 MapHandles const& receiver_maps); |
114 PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, | 113 PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, |
115 Handle<Object> constant, MapList const& receiver_maps); | 114 Handle<Object> constant, MapHandles const& receiver_maps); |
116 PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, | 115 PropertyAccessInfo(Kind kind, MaybeHandle<JSObject> holder, |
117 MaybeHandle<Map> transition_map, FieldIndex field_index, | 116 MaybeHandle<Map> transition_map, FieldIndex field_index, |
118 MachineRepresentation field_representation, | 117 MachineRepresentation field_representation, |
119 Type* field_type, MaybeHandle<Map> field_map, | 118 Type* field_type, MaybeHandle<Map> field_map, |
120 MapList const& receiver_maps); | 119 MapHandles const& receiver_maps); |
121 | 120 |
122 Kind kind_; | 121 Kind kind_; |
123 MapList receiver_maps_; | 122 MapHandles receiver_maps_; |
124 Handle<Object> constant_; | 123 Handle<Object> constant_; |
125 MaybeHandle<Map> transition_map_; | 124 MaybeHandle<Map> transition_map_; |
126 MaybeHandle<JSObject> holder_; | 125 MaybeHandle<JSObject> holder_; |
127 FieldIndex field_index_; | 126 FieldIndex field_index_; |
128 MachineRepresentation field_representation_; | 127 MachineRepresentation field_representation_; |
129 Type* field_type_; | 128 Type* field_type_; |
130 MaybeHandle<Map> field_map_; | 129 MaybeHandle<Map> field_map_; |
131 }; | 130 }; |
132 | 131 |
133 | 132 |
134 // Factory class for {ElementAccessInfo}s and {PropertyAccessInfo}s. | 133 // Factory class for {ElementAccessInfo}s and {PropertyAccessInfo}s. |
135 class AccessInfoFactory final { | 134 class AccessInfoFactory final { |
136 public: | 135 public: |
137 AccessInfoFactory(CompilationDependencies* dependencies, | 136 AccessInfoFactory(CompilationDependencies* dependencies, |
138 Handle<Context> native_context, Zone* zone); | 137 Handle<Context> native_context, Zone* zone); |
139 | 138 |
140 bool ComputeElementAccessInfo(Handle<Map> map, AccessMode access_mode, | 139 bool ComputeElementAccessInfo(Handle<Map> map, AccessMode access_mode, |
141 ElementAccessInfo* access_info); | 140 ElementAccessInfo* access_info); |
142 bool ComputeElementAccessInfos(MapHandleList const& maps, | 141 bool ComputeElementAccessInfos(MapHandles const& maps, AccessMode access_mode, |
143 AccessMode access_mode, | |
144 ZoneVector<ElementAccessInfo>* access_infos); | 142 ZoneVector<ElementAccessInfo>* access_infos); |
145 bool ComputePropertyAccessInfo(Handle<Map> map, Handle<Name> name, | 143 bool ComputePropertyAccessInfo(Handle<Map> map, Handle<Name> name, |
146 AccessMode access_mode, | 144 AccessMode access_mode, |
147 PropertyAccessInfo* access_info); | 145 PropertyAccessInfo* access_info); |
148 bool ComputePropertyAccessInfos(MapHandleList const& maps, Handle<Name> name, | 146 bool ComputePropertyAccessInfos(MapHandles const& maps, Handle<Name> name, |
149 AccessMode access_mode, | 147 AccessMode access_mode, |
150 ZoneVector<PropertyAccessInfo>* access_infos); | 148 ZoneVector<PropertyAccessInfo>* access_infos); |
151 | 149 |
152 private: | 150 private: |
153 bool ConsolidateElementLoad(MapHandleList const& maps, | 151 bool ConsolidateElementLoad(MapHandles const& maps, |
154 ElementAccessInfo* access_info); | 152 ElementAccessInfo* access_info); |
155 bool LookupSpecialFieldAccessor(Handle<Map> map, Handle<Name> name, | 153 bool LookupSpecialFieldAccessor(Handle<Map> map, Handle<Name> name, |
156 PropertyAccessInfo* access_info); | 154 PropertyAccessInfo* access_info); |
157 bool LookupTransition(Handle<Map> map, Handle<Name> name, | 155 bool LookupTransition(Handle<Map> map, Handle<Name> name, |
158 MaybeHandle<JSObject> holder, | 156 MaybeHandle<JSObject> holder, |
159 PropertyAccessInfo* access_info); | 157 PropertyAccessInfo* access_info); |
160 | 158 |
161 CompilationDependencies* dependencies() const { return dependencies_; } | 159 CompilationDependencies* dependencies() const { return dependencies_; } |
162 Factory* factory() const; | 160 Factory* factory() const; |
163 Isolate* isolate() const { return isolate_; } | 161 Isolate* isolate() const { return isolate_; } |
164 Handle<Context> native_context() const { return native_context_; } | 162 Handle<Context> native_context() const { return native_context_; } |
165 Zone* zone() const { return zone_; } | 163 Zone* zone() const { return zone_; } |
166 | 164 |
167 CompilationDependencies* const dependencies_; | 165 CompilationDependencies* const dependencies_; |
168 Handle<Context> const native_context_; | 166 Handle<Context> const native_context_; |
169 Isolate* const isolate_; | 167 Isolate* const isolate_; |
170 TypeCache const& type_cache_; | 168 TypeCache const& type_cache_; |
171 Zone* const zone_; | 169 Zone* const zone_; |
172 | 170 |
173 DISALLOW_COPY_AND_ASSIGN(AccessInfoFactory); | 171 DISALLOW_COPY_AND_ASSIGN(AccessInfoFactory); |
174 }; | 172 }; |
175 | 173 |
176 } // namespace compiler | 174 } // namespace compiler |
177 } // namespace internal | 175 } // namespace internal |
178 } // namespace v8 | 176 } // namespace v8 |
179 | 177 |
180 #endif // V8_COMPILER_ACCESS_INFO_H_ | 178 #endif // V8_COMPILER_ACCESS_INFO_H_ |
OLD | NEW |