Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: src/lookup.h

Issue 539083002: Get rid of special property_encoding flag on the LookupIterator (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ic/ic.cc ('k') | src/lookup.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 25 matching lines...) Expand all
36 NOT_FOUND, 36 NOT_FOUND,
37 UNKNOWN, // Dictionary-mode holder map without a holder. 37 UNKNOWN, // Dictionary-mode holder map without a holder.
38 ACCESSOR, 38 ACCESSOR,
39 DATA, 39 DATA,
40 TRANSITION, 40 TRANSITION,
41 // Set state_ to BEFORE_PROPERTY to ensure that the next lookup will be a 41 // Set state_ to BEFORE_PROPERTY to ensure that the next lookup will be a
42 // PROPERTY lookup. 42 // PROPERTY lookup.
43 BEFORE_PROPERTY = INTERCEPTOR 43 BEFORE_PROPERTY = INTERCEPTOR
44 }; 44 };
45 45
46 enum PropertyEncoding {
47 DICTIONARY,
48 DESCRIPTOR
49 };
50
51 LookupIterator(Handle<Object> receiver, Handle<Name> name, 46 LookupIterator(Handle<Object> receiver, Handle<Name> name,
52 Configuration configuration = PROTOTYPE_CHAIN) 47 Configuration configuration = PROTOTYPE_CHAIN)
53 : configuration_(ComputeConfiguration(configuration, name)), 48 : configuration_(ComputeConfiguration(configuration, name)),
54 state_(NOT_FOUND), 49 state_(NOT_FOUND),
55 property_encoding_(DESCRIPTOR),
56 property_details_(NONE, NORMAL, Representation::None()), 50 property_details_(NONE, NORMAL, Representation::None()),
57 isolate_(name->GetIsolate()), 51 isolate_(name->GetIsolate()),
58 name_(name), 52 name_(name),
59 maybe_receiver_(receiver), 53 maybe_receiver_(receiver),
60 number_(DescriptorArray::kNotFound) { 54 number_(DescriptorArray::kNotFound) {
61 Handle<JSReceiver> root = GetRoot(); 55 Handle<JSReceiver> root = GetRoot();
62 holder_map_ = handle(root->map(), isolate_); 56 holder_map_ = handle(root->map(), isolate_);
63 maybe_holder_ = root; 57 maybe_holder_ = root;
64 Next(); 58 Next();
65 } 59 }
66 60
67 LookupIterator(Handle<Object> receiver, Handle<Name> name, 61 LookupIterator(Handle<Object> receiver, Handle<Name> name,
68 Handle<JSReceiver> holder, 62 Handle<JSReceiver> holder,
69 Configuration configuration = PROTOTYPE_CHAIN) 63 Configuration configuration = PROTOTYPE_CHAIN)
70 : configuration_(ComputeConfiguration(configuration, name)), 64 : configuration_(ComputeConfiguration(configuration, name)),
71 state_(NOT_FOUND), 65 state_(NOT_FOUND),
72 property_encoding_(DESCRIPTOR),
73 property_details_(NONE, NORMAL, Representation::None()), 66 property_details_(NONE, NORMAL, Representation::None()),
74 isolate_(name->GetIsolate()), 67 isolate_(name->GetIsolate()),
75 name_(name), 68 name_(name),
76 holder_map_(holder->map(), isolate_), 69 holder_map_(holder->map(), isolate_),
77 maybe_receiver_(receiver), 70 maybe_receiver_(receiver),
78 maybe_holder_(holder), 71 maybe_holder_(holder),
79 number_(DescriptorArray::kNotFound) { 72 number_(DescriptorArray::kNotFound) {
80 Next(); 73 Next();
81 } 74 }
82 75
83 Isolate* isolate() const { return isolate_; } 76 Isolate* isolate() const { return isolate_; }
84 State state() const { return state_; } 77 State state() const { return state_; }
85 Handle<Name> name() const { return name_; } 78 Handle<Name> name() const { return name_; }
86 79
87 bool IsFound() const { return state_ != NOT_FOUND; } 80 bool IsFound() const { return state_ != NOT_FOUND; }
88 void Next(); 81 void Next();
89 void NotFound() { 82 void NotFound() {
90 has_property_ = false; 83 has_property_ = false;
91 state_ = NOT_FOUND; 84 state_ = NOT_FOUND;
92 } 85 }
93 86
94 Factory* factory() const { return isolate_->factory(); } 87 Factory* factory() const { return isolate_->factory(); }
95 Handle<Object> GetReceiver() const { 88 Handle<Object> GetReceiver() const {
96 return maybe_receiver_.ToHandleChecked(); 89 return maybe_receiver_.ToHandleChecked();
97 } 90 }
98 Handle<JSObject> GetStoreTarget() const; 91 Handle<JSObject> GetStoreTarget() const;
99 Handle<Map> holder_map() const { return holder_map_; } 92 bool is_dictionary_holder() const { return holder_map_->is_dictionary_map(); }
100 Handle<Map> transition_map() const { 93 Handle<Map> transition_map() const {
101 DCHECK_EQ(TRANSITION, state_); 94 DCHECK_EQ(TRANSITION, state_);
102 return transition_map_; 95 return transition_map_;
103 } 96 }
104 template <class T> 97 template <class T>
105 Handle<T> GetHolder() const { 98 Handle<T> GetHolder() const {
106 DCHECK(IsFound()); 99 DCHECK(IsFound());
107 return Handle<T>::cast(maybe_holder_.ToHandleChecked()); 100 return Handle<T>::cast(maybe_holder_.ToHandleChecked());
108 } 101 }
109 Handle<JSReceiver> GetRoot() const; 102 Handle<JSReceiver> GetRoot() const;
(...skipping 15 matching lines...) Expand all
125 has_property_ = true; 118 has_property_ = true;
126 } 119 }
127 return cacheable; 120 return cacheable;
128 } 121 }
129 void ApplyTransitionToDataProperty(); 122 void ApplyTransitionToDataProperty();
130 void ReconfigureDataProperty(Handle<Object> value, 123 void ReconfigureDataProperty(Handle<Object> value,
131 PropertyAttributes attributes); 124 PropertyAttributes attributes);
132 void TransitionToAccessorProperty(AccessorComponent component, 125 void TransitionToAccessorProperty(AccessorComponent component,
133 Handle<Object> accessor, 126 Handle<Object> accessor,
134 PropertyAttributes attributes); 127 PropertyAttributes attributes);
135 PropertyEncoding property_encoding() const {
136 DCHECK(has_property_);
137 return property_encoding_;
138 }
139 PropertyDetails property_details() const { 128 PropertyDetails property_details() const {
140 DCHECK(has_property_); 129 DCHECK(has_property_);
141 return property_details_; 130 return property_details_;
142 } 131 }
143 bool IsConfigurable() const { return property_details().IsConfigurable(); } 132 bool IsConfigurable() const { return property_details().IsConfigurable(); }
144 bool IsReadOnly() const { return property_details().IsReadOnly(); } 133 bool IsReadOnly() const { return property_details().IsReadOnly(); }
145 Representation representation() const { 134 Representation representation() const {
146 return property_details().representation(); 135 return property_details().representation();
147 } 136 }
148 FieldIndex GetFieldIndex() const; 137 FieldIndex GetFieldIndex() const;
(...skipping 25 matching lines...) Expand all
174 } 163 }
175 bool check_hidden() const { return (configuration_ & kHidden) != 0; } 164 bool check_hidden() const { return (configuration_ & kHidden) != 0; }
176 bool check_interceptor() const { 165 bool check_interceptor() const {
177 return !IsBootstrapping() && (configuration_ & kInterceptor) != 0; 166 return !IsBootstrapping() && (configuration_ & kInterceptor) != 0;
178 } 167 }
179 bool check_prototype_chain() const { 168 bool check_prototype_chain() const {
180 return (configuration_ & kPrototypeChain) != 0; 169 return (configuration_ & kPrototypeChain) != 0;
181 } 170 }
182 int descriptor_number() const { 171 int descriptor_number() const {
183 DCHECK(has_property_); 172 DCHECK(has_property_);
184 DCHECK_EQ(DESCRIPTOR, property_encoding_); 173 DCHECK(!holder_map_->is_dictionary_map());
185 return number_; 174 return number_;
186 } 175 }
187 int dictionary_entry() const { 176 int dictionary_entry() const {
188 DCHECK(has_property_); 177 DCHECK(has_property_);
189 DCHECK_EQ(DICTIONARY, property_encoding_); 178 DCHECK(holder_map_->is_dictionary_map());
190 return number_; 179 return number_;
191 } 180 }
192 181
193 static Configuration ComputeConfiguration( 182 static Configuration ComputeConfiguration(
194 Configuration configuration, Handle<Name> name) { 183 Configuration configuration, Handle<Name> name) {
195 if (name->IsOwn()) { 184 if (name->IsOwn()) {
196 return static_cast<Configuration>(configuration & HIDDEN); 185 return static_cast<Configuration>(configuration & HIDDEN);
197 } else { 186 } else {
198 return configuration; 187 return configuration;
199 } 188 }
200 } 189 }
201 190
202 // If configuration_ becomes mutable, update 191 // If configuration_ becomes mutable, update
203 // HolderIsReceiverOrHiddenPrototype. 192 // HolderIsReceiverOrHiddenPrototype.
204 Configuration configuration_; 193 Configuration configuration_;
205 State state_; 194 State state_;
206 bool has_property_; 195 bool has_property_;
207 PropertyEncoding property_encoding_;
208 PropertyDetails property_details_; 196 PropertyDetails property_details_;
209 Isolate* isolate_; 197 Isolate* isolate_;
210 Handle<Name> name_; 198 Handle<Name> name_;
211 Handle<Map> holder_map_; 199 Handle<Map> holder_map_;
212 Handle<Map> transition_map_; 200 Handle<Map> transition_map_;
213 MaybeHandle<Object> maybe_receiver_; 201 MaybeHandle<Object> maybe_receiver_;
214 MaybeHandle<JSReceiver> maybe_holder_; 202 MaybeHandle<JSReceiver> maybe_holder_;
215 203
216 int number_; 204 int number_;
217 }; 205 };
218 206
219 207
220 } } // namespace v8::internal 208 } } // namespace v8::internal
221 209
222 #endif // V8_LOOKUP_H_ 210 #endif // V8_LOOKUP_H_
OLDNEW
« no previous file with comments | « src/ic/ic.cc ('k') | src/lookup.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698