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