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_PROPERTY_H_ | 5 #ifndef V8_PROPERTY_H_ |
6 #define V8_PROPERTY_H_ | 6 #define V8_PROPERTY_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 | 9 |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 details_(attributes, type, representation, field_index) { } | 66 details_(attributes, type, representation, field_index) { } |
67 | 67 |
68 friend class DescriptorArray; | 68 friend class DescriptorArray; |
69 friend class Map; | 69 friend class Map; |
70 }; | 70 }; |
71 | 71 |
72 | 72 |
73 std::ostream& operator<<(std::ostream& os, const Descriptor& d); | 73 std::ostream& operator<<(std::ostream& os, const Descriptor& d); |
74 | 74 |
75 | 75 |
76 class FieldDescriptor FINAL : public Descriptor { | 76 class DataDescriptor FINAL : public Descriptor { |
77 public: | 77 public: |
78 FieldDescriptor(Handle<Name> key, | 78 DataDescriptor(Handle<Name> key, int field_index, |
79 int field_index, | 79 PropertyAttributes attributes, Representation representation) |
80 PropertyAttributes attributes, | 80 : Descriptor(key, HeapType::Any(key->GetIsolate()), attributes, DATA, |
81 Representation representation) | 81 representation, field_index) {} |
82 : Descriptor(key, HeapType::Any(key->GetIsolate()), attributes, | 82 DataDescriptor(Handle<Name> key, int field_index, Handle<HeapType> field_type, |
83 FIELD, representation, field_index) {} | 83 PropertyAttributes attributes, Representation representation) |
84 FieldDescriptor(Handle<Name> key, | 84 : Descriptor(key, field_type, attributes, DATA, representation, |
85 int field_index, | 85 field_index) {} |
86 Handle<HeapType> field_type, | |
87 PropertyAttributes attributes, | |
88 Representation representation) | |
89 : Descriptor(key, field_type, attributes, FIELD, | |
90 representation, field_index) { } | |
91 }; | 86 }; |
92 | 87 |
93 | 88 |
94 class ConstantDescriptor FINAL : public Descriptor { | 89 class DataConstantDescriptor FINAL : public Descriptor { |
95 public: | 90 public: |
96 ConstantDescriptor(Handle<Name> key, | 91 DataConstantDescriptor(Handle<Name> key, Handle<Object> value, |
97 Handle<Object> value, | 92 PropertyAttributes attributes) |
98 PropertyAttributes attributes) | 93 : Descriptor(key, value, attributes, DATA_CONSTANT, |
99 : Descriptor(key, value, attributes, CONSTANT, | |
100 value->OptimalRepresentation()) {} | 94 value->OptimalRepresentation()) {} |
101 }; | 95 }; |
102 | 96 |
103 | 97 |
104 class CallbacksDescriptor FINAL : public Descriptor { | 98 class AccessorConstantDescriptor FINAL : public Descriptor { |
105 public: | 99 public: |
106 CallbacksDescriptor(Handle<Name> key, | 100 AccessorConstantDescriptor(Handle<Name> key, Handle<Object> foreign, |
107 Handle<Object> foreign, | 101 PropertyAttributes attributes) |
108 PropertyAttributes attributes) | 102 : Descriptor(key, foreign, attributes, ACCESSOR_CONSTANT, |
109 : Descriptor(key, foreign, attributes, CALLBACKS, | |
110 Representation::Tagged()) {} | 103 Representation::Tagged()) {} |
111 }; | 104 }; |
112 | 105 |
113 | 106 |
114 class LookupResult FINAL BASE_EMBEDDED { | 107 class LookupResult FINAL BASE_EMBEDDED { |
115 public: | 108 public: |
116 explicit LookupResult(Isolate* isolate) | 109 explicit LookupResult(Isolate* isolate) |
117 : isolate_(isolate), | 110 : isolate_(isolate), |
118 next_(isolate->top_lookup_result()), | 111 next_(isolate->top_lookup_result()), |
119 lookup_type_(NOT_FOUND), | 112 lookup_type_(NOT_FOUND), |
120 holder_(NULL), | 113 holder_(NULL), |
121 transition_(NULL), | 114 transition_(NULL), |
122 details_(NONE, FIELD, Representation::None()) { | 115 details_(NONE, DATA, Representation::None()) { |
123 isolate->set_top_lookup_result(this); | 116 isolate->set_top_lookup_result(this); |
124 } | 117 } |
125 | 118 |
126 ~LookupResult() { | 119 ~LookupResult() { |
127 DCHECK(isolate()->top_lookup_result() == this); | 120 DCHECK(isolate()->top_lookup_result() == this); |
128 isolate()->set_top_lookup_result(next_); | 121 isolate()->set_top_lookup_result(next_); |
129 } | 122 } |
130 | 123 |
131 Isolate* isolate() const { return isolate_; } | 124 Isolate* isolate() const { return isolate_; } |
132 | 125 |
133 void DescriptorResult(JSObject* holder, PropertyDetails details, int number) { | 126 void DescriptorResult(JSObject* holder, PropertyDetails details, int number) { |
134 lookup_type_ = DESCRIPTOR_TYPE; | 127 lookup_type_ = DESCRIPTOR_TYPE; |
135 holder_ = holder; | 128 holder_ = holder; |
136 transition_ = NULL; | 129 transition_ = NULL; |
137 details_ = details; | 130 details_ = details; |
138 number_ = number; | 131 number_ = number; |
139 } | 132 } |
140 | 133 |
141 void TransitionResult(JSObject* holder, Map* target) { | 134 void TransitionResult(JSObject* holder, Map* target) { |
142 lookup_type_ = TRANSITION_TYPE; | 135 lookup_type_ = TRANSITION_TYPE; |
143 number_ = target->LastAdded(); | 136 number_ = target->LastAdded(); |
144 details_ = target->instance_descriptors()->GetDetails(number_); | 137 details_ = target->instance_descriptors()->GetDetails(number_); |
145 holder_ = holder; | 138 holder_ = holder; |
146 transition_ = target; | 139 transition_ = target; |
147 } | 140 } |
148 | 141 |
149 void NotFound() { | 142 void NotFound() { |
150 lookup_type_ = NOT_FOUND; | 143 lookup_type_ = NOT_FOUND; |
151 details_ = PropertyDetails(NONE, FIELD, 0); | 144 details_ = PropertyDetails(NONE, DATA, 0); |
152 holder_ = NULL; | 145 holder_ = NULL; |
153 transition_ = NULL; | 146 transition_ = NULL; |
154 } | 147 } |
155 | 148 |
156 Representation representation() const { | 149 Representation representation() const { |
157 DCHECK(IsFound()); | 150 DCHECK(IsFound()); |
158 return details_.representation(); | 151 return details_.representation(); |
159 } | 152 } |
160 | 153 |
161 // Property callbacks does not include transitions to callbacks. | 154 // Property callbacks does not include transitions to callbacks. |
162 bool IsPropertyCallbacks() const { | 155 bool IsAccessorConstant() const { |
163 return !IsTransition() && details_.type() == CALLBACKS; | 156 return !IsTransition() && details_.type() == ACCESSOR_CONSTANT; |
164 } | 157 } |
165 | 158 |
166 bool IsReadOnly() const { | 159 bool IsReadOnly() const { |
167 DCHECK(IsFound()); | 160 DCHECK(IsFound()); |
168 return details_.IsReadOnly(); | 161 return details_.IsReadOnly(); |
169 } | 162 } |
170 | 163 |
171 bool IsField() const { | 164 bool IsData() const { |
172 return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == FIELD; | 165 return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == DATA; |
173 } | 166 } |
174 | 167 |
175 bool IsConstant() const { | 168 bool IsDataConstant() const { |
176 return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == CONSTANT; | 169 return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == DATA_CONSTANT; |
177 } | 170 } |
178 | 171 |
179 bool IsConfigurable() const { return details_.IsConfigurable(); } | 172 bool IsConfigurable() const { return details_.IsConfigurable(); } |
180 bool IsFound() const { return lookup_type_ != NOT_FOUND; } | 173 bool IsFound() const { return lookup_type_ != NOT_FOUND; } |
181 bool IsTransition() const { return lookup_type_ == TRANSITION_TYPE; } | 174 bool IsTransition() const { return lookup_type_ == TRANSITION_TYPE; } |
182 | 175 |
183 // Is the result is a property excluding transitions and the null descriptor? | 176 // Is the result is a property excluding transitions and the null descriptor? |
184 bool IsProperty() const { | 177 bool IsProperty() const { |
185 return IsFound() && !IsTransition(); | 178 return IsFound() && !IsTransition(); |
186 } | 179 } |
187 | 180 |
188 Map* GetTransitionTarget() const { | 181 Map* GetTransitionTarget() const { |
189 DCHECK(IsTransition()); | 182 DCHECK(IsTransition()); |
190 return transition_; | 183 return transition_; |
191 } | 184 } |
192 | 185 |
193 bool IsTransitionToField() const { | 186 bool IsTransitionToData() const { |
194 return IsTransition() && details_.type() == FIELD; | 187 return IsTransition() && details_.type() == DATA; |
195 } | 188 } |
196 | 189 |
197 int GetLocalFieldIndexFromMap(Map* map) const { | 190 int GetLocalFieldIndexFromMap(Map* map) const { |
198 return GetFieldIndexFromMap(map) - map->inobject_properties(); | 191 return GetFieldIndexFromMap(map) - map->inobject_properties(); |
199 } | 192 } |
200 | 193 |
201 Object* GetConstantFromMap(Map* map) const { | 194 Object* GetConstantFromMap(Map* map) const { |
202 DCHECK(details_.type() == CONSTANT); | 195 DCHECK(details_.type() == DATA_CONSTANT); |
203 return GetValueFromMap(map); | 196 return GetValueFromMap(map); |
204 } | 197 } |
205 | 198 |
206 Object* GetValueFromMap(Map* map) const { | 199 Object* GetValueFromMap(Map* map) const { |
207 DCHECK(lookup_type_ == DESCRIPTOR_TYPE || | 200 DCHECK(lookup_type_ == DESCRIPTOR_TYPE || |
208 lookup_type_ == TRANSITION_TYPE); | 201 lookup_type_ == TRANSITION_TYPE); |
209 DCHECK(number_ < map->NumberOfOwnDescriptors()); | 202 DCHECK(number_ < map->NumberOfOwnDescriptors()); |
210 return map->instance_descriptors()->GetValue(number_); | 203 return map->instance_descriptors()->GetValue(number_); |
211 } | 204 } |
212 | 205 |
(...skipping 30 matching lines...) Expand all Loading... |
243 Map* transition_; | 236 Map* transition_; |
244 int number_; | 237 int number_; |
245 PropertyDetails details_; | 238 PropertyDetails details_; |
246 }; | 239 }; |
247 | 240 |
248 | 241 |
249 std::ostream& operator<<(std::ostream& os, const LookupResult& r); | 242 std::ostream& operator<<(std::ostream& os, const LookupResult& r); |
250 } } // namespace v8::internal | 243 } } // namespace v8::internal |
251 | 244 |
252 #endif // V8_PROPERTY_H_ | 245 #endif // V8_PROPERTY_H_ |
OLD | NEW |