OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_LOOKUP_H_ | 5 #ifndef V8_LOOKUP_H_ |
6 #define V8_LOOKUP_H_ | 6 #define V8_LOOKUP_H_ |
7 | 7 |
8 #include "src/factory.h" | 8 #include "src/factory.h" |
9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 // Convience combinations of bits. | 24 // Convience combinations of bits. |
25 CHECK_PROPERTY = 0, | 25 CHECK_PROPERTY = 0, |
26 CHECK_HIDDEN_SKIP_INTERCEPTOR = CHECK_HIDDEN_PROPERTY | CHECK_ACCESS_CHECK, | 26 CHECK_HIDDEN_SKIP_INTERCEPTOR = CHECK_HIDDEN_PROPERTY | CHECK_ACCESS_CHECK, |
27 CHECK_DERIVED_SKIP_INTERCEPTOR = | 27 CHECK_DERIVED_SKIP_INTERCEPTOR = |
28 CHECK_HIDDEN_SKIP_INTERCEPTOR | CHECK_DERIVED_PROPERTY, | 28 CHECK_HIDDEN_SKIP_INTERCEPTOR | CHECK_DERIVED_PROPERTY, |
29 CHECK_DERIVED = CHECK_DERIVED_SKIP_INTERCEPTOR | CHECK_INTERCEPTOR, | 29 CHECK_DERIVED = CHECK_DERIVED_SKIP_INTERCEPTOR | CHECK_INTERCEPTOR, |
30 CHECK_HIDDEN = CHECK_HIDDEN_SKIP_INTERCEPTOR | CHECK_INTERCEPTOR | 30 CHECK_HIDDEN = CHECK_HIDDEN_SKIP_INTERCEPTOR | CHECK_INTERCEPTOR |
31 }; | 31 }; |
32 | 32 |
33 enum State { | 33 enum State { |
| 34 ACCESS_CHECK, |
| 35 INTERCEPTOR, |
| 36 JSPROXY, |
34 NOT_FOUND, | 37 NOT_FOUND, |
35 PROPERTY, | 38 PROPERTY, |
36 INTERCEPTOR, | 39 // Set state_ to BEFORE_PROPERTY to ensure that the next lookup will be a |
37 ACCESS_CHECK, | 40 // PROPERTY lookup. |
38 JSPROXY | 41 BEFORE_PROPERTY = INTERCEPTOR |
39 }; | 42 }; |
40 | 43 |
41 enum PropertyKind { | 44 enum PropertyKind { |
42 DATA, | 45 DATA, |
43 ACCESSOR | 46 ACCESSOR |
44 }; | 47 }; |
45 | 48 |
46 enum PropertyEncoding { | 49 enum PropertyEncoding { |
47 DICTIONARY, | 50 DICTIONARY, |
48 DESCRIPTOR | 51 DESCRIPTOR |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 number_(DescriptorArray::kNotFound) { | 96 number_(DescriptorArray::kNotFound) { |
94 Next(); | 97 Next(); |
95 } | 98 } |
96 | 99 |
97 Isolate* isolate() const { return isolate_; } | 100 Isolate* isolate() const { return isolate_; } |
98 State state() const { return state_; } | 101 State state() const { return state_; } |
99 Handle<Name> name() const { return name_; } | 102 Handle<Name> name() const { return name_; } |
100 | 103 |
101 bool IsFound() const { return state_ != NOT_FOUND; } | 104 bool IsFound() const { return state_ != NOT_FOUND; } |
102 void Next(); | 105 void Next(); |
| 106 void NotFound() { |
| 107 has_property_ = false; |
| 108 state_ = NOT_FOUND; |
| 109 } |
103 | 110 |
104 Heap* heap() const { return isolate_->heap(); } | 111 Heap* heap() const { return isolate_->heap(); } |
105 Factory* factory() const { return isolate_->factory(); } | 112 Factory* factory() const { return isolate_->factory(); } |
106 Handle<Object> GetReceiver() const { | 113 Handle<Object> GetReceiver() const { |
107 return maybe_receiver_.ToHandleChecked(); | 114 return maybe_receiver_.ToHandleChecked(); |
108 } | 115 } |
109 Handle<Map> holder_map() const { return holder_map_; } | 116 Handle<Map> holder_map() const { return holder_map_; } |
110 template <class T> | 117 template <class T> |
111 Handle<T> GetHolder() const { | 118 Handle<T> GetHolder() const { |
112 DCHECK(IsFound()); | 119 DCHECK(IsFound()); |
(...skipping 10 matching lines...) Expand all Loading... |
123 // HasProperty needs to be called before any of the other PROPERTY methods | 130 // HasProperty needs to be called before any of the other PROPERTY methods |
124 // below can be used. It ensures that we are able to provide a definite | 131 // below can be used. It ensures that we are able to provide a definite |
125 // answer, and loads extra information about the property. | 132 // answer, and loads extra information about the property. |
126 bool HasProperty(); | 133 bool HasProperty(); |
127 void PrepareForDataProperty(Handle<Object> value); | 134 void PrepareForDataProperty(Handle<Object> value); |
128 void TransitionToDataProperty(Handle<Object> value, | 135 void TransitionToDataProperty(Handle<Object> value, |
129 PropertyAttributes attributes, | 136 PropertyAttributes attributes, |
130 Object::StoreFromKeyed store_mode); | 137 Object::StoreFromKeyed store_mode); |
131 void ReconfigureDataProperty(Handle<Object> value, | 138 void ReconfigureDataProperty(Handle<Object> value, |
132 PropertyAttributes attributes); | 139 PropertyAttributes attributes); |
| 140 void TransitionToAccessorProperty(AccessorComponent component, |
| 141 Handle<Object> accessor, |
| 142 PropertyAttributes attributes); |
133 PropertyKind property_kind() const { | 143 PropertyKind property_kind() const { |
134 DCHECK(has_property_); | 144 DCHECK(has_property_); |
135 return property_kind_; | 145 return property_kind_; |
136 } | 146 } |
137 PropertyEncoding property_encoding() const { | 147 PropertyEncoding property_encoding() const { |
138 DCHECK(has_property_); | 148 DCHECK(has_property_); |
139 return property_encoding_; | 149 return property_encoding_; |
140 } | 150 } |
141 PropertyDetails property_details() const { | 151 PropertyDetails property_details() const { |
142 DCHECK(has_property_); | 152 DCHECK(has_property_); |
(...skipping 12 matching lines...) Expand all Loading... |
155 void WriteDataValue(Handle<Object> value); | 165 void WriteDataValue(Handle<Object> value); |
156 | 166 |
157 void InternalizeName(); | 167 void InternalizeName(); |
158 | 168 |
159 private: | 169 private: |
160 Handle<Map> GetReceiverMap() const; | 170 Handle<Map> GetReceiverMap() const; |
161 | 171 |
162 MUST_USE_RESULT inline JSReceiver* NextHolder(Map* map); | 172 MUST_USE_RESULT inline JSReceiver* NextHolder(Map* map); |
163 inline State LookupInHolder(Map* map); | 173 inline State LookupInHolder(Map* map); |
164 Handle<Object> FetchValue() const; | 174 Handle<Object> FetchValue() const; |
| 175 void ReloadPropertyInformation(); |
165 | 176 |
166 bool IsBootstrapping() const; | 177 bool IsBootstrapping() const; |
167 | 178 |
168 // Methods that fetch data from the holder ensure they always have a holder. | 179 // Methods that fetch data from the holder ensure they always have a holder. |
169 // This means the receiver needs to be present as opposed to just the receiver | 180 // This means the receiver needs to be present as opposed to just the receiver |
170 // map. Other objects in the prototype chain are transitively guaranteed to be | 181 // map. Other objects in the prototype chain are transitively guaranteed to be |
171 // present via the receiver map. | 182 // present via the receiver map. |
172 bool is_guaranteed_to_have_holder() const { | 183 bool is_guaranteed_to_have_holder() const { |
173 return !maybe_receiver_.is_null(); | 184 return !maybe_receiver_.is_null(); |
174 } | 185 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 MaybeHandle<Object> maybe_receiver_; | 229 MaybeHandle<Object> maybe_receiver_; |
219 MaybeHandle<JSReceiver> maybe_holder_; | 230 MaybeHandle<JSReceiver> maybe_holder_; |
220 | 231 |
221 int number_; | 232 int number_; |
222 }; | 233 }; |
223 | 234 |
224 | 235 |
225 } } // namespace v8::internal | 236 } } // namespace v8::internal |
226 | 237 |
227 #endif // V8_LOOKUP_H_ | 238 #endif // V8_LOOKUP_H_ |
OLD | NEW |