OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #include "src/transitions.h" | 5 #include "src/transitions.h" |
6 | 6 |
7 #include "src/objects-inl.h" | 7 #include "src/objects-inl.h" |
8 #include "src/transitions-inl.h" | 8 #include "src/transitions-inl.h" |
9 #include "src/utils.h" | 9 #include "src/utils.h" |
10 | 10 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 152 } |
153 | 153 |
154 SLOW_DCHECK(result->IsSortedNoDuplicates()); | 154 SLOW_DCHECK(result->IsSortedNoDuplicates()); |
155 ReplaceTransitions(map, *result); | 155 ReplaceTransitions(map, *result); |
156 } | 156 } |
157 | 157 |
158 | 158 |
159 // static | 159 // static |
160 Map* TransitionArray::SearchTransition(Map* map, PropertyKind kind, Name* name, | 160 Map* TransitionArray::SearchTransition(Map* map, PropertyKind kind, Name* name, |
161 PropertyAttributes attributes) { | 161 PropertyAttributes attributes) { |
| 162 DCHECK(name->IsUniqueName()); |
162 Object* raw_transitions = map->raw_transitions(); | 163 Object* raw_transitions = map->raw_transitions(); |
163 if (IsSimpleTransition(raw_transitions)) { | 164 if (IsSimpleTransition(raw_transitions)) { |
164 Map* target = GetSimpleTransition(raw_transitions); | 165 Map* target = GetSimpleTransition(raw_transitions); |
165 Name* key = GetSimpleTransitionKey(target); | 166 Name* key = GetSimpleTransitionKey(target); |
166 if (!key->Equals(name)) return NULL; | 167 if (key != name) return nullptr; |
167 PropertyDetails details = GetSimpleTargetDetails(target); | 168 PropertyDetails details = GetSimpleTargetDetails(target); |
168 if (details.attributes() != attributes) return NULL; | 169 if (details.attributes() != attributes) return nullptr; |
169 if (details.kind() != kind) return NULL; | 170 if (details.kind() != kind) return nullptr; |
170 return target; | 171 return target; |
171 } | 172 } |
172 if (IsFullTransitionArray(raw_transitions)) { | 173 if (IsFullTransitionArray(raw_transitions)) { |
173 TransitionArray* transitions = TransitionArray::cast(raw_transitions); | 174 TransitionArray* transitions = TransitionArray::cast(raw_transitions); |
174 int transition = transitions->Search(kind, name, attributes); | 175 int transition = transitions->Search(kind, name, attributes); |
175 if (transition == kNotFound) return NULL; | 176 if (transition == kNotFound) return nullptr; |
176 return transitions->GetTarget(transition); | 177 return transitions->GetTarget(transition); |
177 } | 178 } |
178 return NULL; | 179 return NULL; |
179 } | 180 } |
180 | 181 |
181 | 182 |
182 // static | 183 // static |
183 Map* TransitionArray::SearchSpecial(Map* map, Symbol* name) { | 184 Map* TransitionArray::SearchSpecial(Map* map, Symbol* name) { |
184 Object* raw_transitions = map->raw_transitions(); | 185 Object* raw_transitions = map->raw_transitions(); |
185 if (IsFullTransitionArray(raw_transitions)) { | 186 if (IsFullTransitionArray(raw_transitions)) { |
186 TransitionArray* transitions = TransitionArray::cast(raw_transitions); | 187 TransitionArray* transitions = TransitionArray::cast(raw_transitions); |
187 int transition = transitions->SearchSpecial(name); | 188 int transition = transitions->SearchSpecial(name); |
188 if (transition == kNotFound) return NULL; | 189 if (transition == kNotFound) return NULL; |
189 return transitions->GetTarget(transition); | 190 return transitions->GetTarget(transition); |
190 } | 191 } |
191 return NULL; | 192 return NULL; |
192 } | 193 } |
193 | 194 |
194 | 195 |
195 // static | 196 // static |
196 Handle<Map> TransitionArray::FindTransitionToField(Handle<Map> map, | 197 Handle<Map> TransitionArray::FindTransitionToField(Handle<Map> map, |
197 Handle<Name> name) { | 198 Handle<Name> name) { |
| 199 DCHECK(name->IsUniqueName()); |
198 DisallowHeapAllocation no_gc; | 200 DisallowHeapAllocation no_gc; |
199 Map* target = SearchTransition(*map, kData, *name, NONE); | 201 Map* target = SearchTransition(*map, kData, *name, NONE); |
200 if (target == NULL) return Handle<Map>::null(); | 202 if (target == NULL) return Handle<Map>::null(); |
201 PropertyDetails details = target->GetLastDescriptorDetails(); | 203 PropertyDetails details = target->GetLastDescriptorDetails(); |
202 DCHECK_EQ(NONE, details.attributes()); | 204 DCHECK_EQ(NONE, details.attributes()); |
203 if (details.type() != DATA) return Handle<Map>::null(); | 205 if (details.type() != DATA) return Handle<Map>::null(); |
204 return Handle<Map>(target); | 206 return Handle<Map>(target); |
205 } | 207 } |
206 | 208 |
207 | 209 |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 } | 540 } |
539 if (out_insertion_index != NULL) *out_insertion_index = transition; | 541 if (out_insertion_index != NULL) *out_insertion_index = transition; |
540 return kNotFound; | 542 return kNotFound; |
541 } | 543 } |
542 | 544 |
543 | 545 |
544 int TransitionArray::Search(PropertyKind kind, Name* name, | 546 int TransitionArray::Search(PropertyKind kind, Name* name, |
545 PropertyAttributes attributes, | 547 PropertyAttributes attributes, |
546 int* out_insertion_index) { | 548 int* out_insertion_index) { |
547 int transition = SearchName(name, out_insertion_index); | 549 int transition = SearchName(name, out_insertion_index); |
548 if (transition == kNotFound) { | 550 if (transition == kNotFound) return kNotFound; |
549 return kNotFound; | |
550 } | |
551 return SearchDetails(transition, kind, attributes, out_insertion_index); | 551 return SearchDetails(transition, kind, attributes, out_insertion_index); |
552 } | 552 } |
553 } // namespace internal | 553 } // namespace internal |
554 } // namespace v8 | 554 } // namespace v8 |
OLD | NEW |