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 #include "src/lookup.h" | 5 #include "src/lookup.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
9 #include "src/elements.h" | 9 #include "src/elements.h" |
10 #include "src/field-type.h" | 10 #include "src/field-type.h" |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 attributes); | 268 attributes); |
269 ReloadPropertyInformation<true>(); | 269 ReloadPropertyInformation<true>(); |
270 } else if (holder->HasFastProperties()) { | 270 } else if (holder->HasFastProperties()) { |
271 Handle<Map> old_map(holder->map(), isolate_); | 271 Handle<Map> old_map(holder->map(), isolate_); |
272 Handle<Map> new_map = Map::ReconfigureExistingProperty( | 272 Handle<Map> new_map = Map::ReconfigureExistingProperty( |
273 old_map, descriptor_number(), i::kData, attributes); | 273 old_map, descriptor_number(), i::kData, attributes); |
274 new_map = Map::PrepareForDataProperty(new_map, descriptor_number(), value); | 274 new_map = Map::PrepareForDataProperty(new_map, descriptor_number(), value); |
275 JSObject::MigrateToMap(holder, new_map); | 275 JSObject::MigrateToMap(holder, new_map); |
276 ReloadPropertyInformation<false>(); | 276 ReloadPropertyInformation<false>(); |
277 } else { | 277 } else { |
278 PropertyDetails details(attributes, v8::internal::DATA, 0, | 278 PropertyDetails details(kData, attributes, 0, PropertyCellType::kMutable); |
279 PropertyCellType::kMutable); | |
280 if (holder->IsJSGlobalObject()) { | 279 if (holder->IsJSGlobalObject()) { |
281 Handle<GlobalDictionary> dictionary(holder->global_dictionary()); | 280 Handle<GlobalDictionary> dictionary(holder->global_dictionary()); |
282 | 281 |
283 Handle<PropertyCell> cell = PropertyCell::PrepareForValue( | 282 Handle<PropertyCell> cell = PropertyCell::PrepareForValue( |
284 dictionary, dictionary_entry(), value, details); | 283 dictionary, dictionary_entry(), value, details); |
285 cell->set_value(*value); | 284 cell->set_value(*value); |
286 property_details_ = cell->property_details(); | 285 property_details_ = cell->property_details(); |
287 } else { | 286 } else { |
288 Handle<NameDictionary> dictionary(holder->property_dictionary()); | 287 Handle<NameDictionary> dictionary(holder->property_dictionary()); |
289 PropertyDetails original_details = | 288 PropertyDetails original_details = |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 global, name(), PropertyCellType::kUninitialized, &entry); | 336 global, name(), PropertyCellType::kUninitialized, &entry); |
338 Handle<GlobalDictionary> dictionary(global->global_dictionary(), | 337 Handle<GlobalDictionary> dictionary(global->global_dictionary(), |
339 isolate_); | 338 isolate_); |
340 DCHECK(cell->value()->IsTheHole(isolate_)); | 339 DCHECK(cell->value()->IsTheHole(isolate_)); |
341 DCHECK(!value->IsTheHole(isolate_)); | 340 DCHECK(!value->IsTheHole(isolate_)); |
342 transition_ = cell; | 341 transition_ = cell; |
343 // Assign an enumeration index to the property and update | 342 // Assign an enumeration index to the property and update |
344 // SetNextEnumerationIndex. | 343 // SetNextEnumerationIndex. |
345 int index = dictionary->NextEnumerationIndex(); | 344 int index = dictionary->NextEnumerationIndex(); |
346 dictionary->SetNextEnumerationIndex(index + 1); | 345 dictionary->SetNextEnumerationIndex(index + 1); |
347 property_details_ = PropertyDetails(attributes, i::DATA, index, | 346 property_details_ = PropertyDetails(kData, attributes, index, |
348 PropertyCellType::kUninitialized); | 347 PropertyCellType::kUninitialized); |
349 PropertyCellType new_type = | 348 PropertyCellType new_type = |
350 PropertyCell::UpdatedType(cell, value, property_details_); | 349 PropertyCell::UpdatedType(cell, value, property_details_); |
351 property_details_ = property_details_.set_cell_type(new_type); | 350 property_details_ = property_details_.set_cell_type(new_type); |
352 cell->set_property_details(property_details_); | 351 cell->set_property_details(property_details_); |
353 number_ = entry; | 352 number_ = entry; |
354 has_property_ = true; | 353 has_property_ = true; |
355 } else { | 354 } else { |
356 // Don't set enumeration index (it will be set during value store). | 355 // Don't set enumeration index (it will be set during value store). |
357 property_details_ = | 356 property_details_ = |
358 PropertyDetails(attributes, i::DATA, 0, PropertyCellType::kNoCell); | 357 PropertyDetails(kData, attributes, 0, PropertyCellType::kNoCell); |
359 transition_ = map; | 358 transition_ = map; |
360 } | 359 } |
361 return; | 360 return; |
362 } | 361 } |
363 | 362 |
364 Handle<Map> transition = | 363 Handle<Map> transition = |
365 Map::TransitionToDataProperty(map, name_, value, attributes, store_mode); | 364 Map::TransitionToDataProperty(map, name_, value, attributes, store_mode); |
366 state_ = TRANSITION; | 365 state_ = TRANSITION; |
367 transition_ = transition; | 366 transition_ = transition; |
368 | 367 |
369 if (transition->is_dictionary_map()) { | 368 if (transition->is_dictionary_map()) { |
370 // Don't set enumeration index (it will be set during value store). | 369 // Don't set enumeration index (it will be set during value store). |
371 property_details_ = | 370 property_details_ = |
372 PropertyDetails(attributes, i::DATA, 0, PropertyCellType::kNoCell); | 371 PropertyDetails(kData, attributes, 0, PropertyCellType::kNoCell); |
373 } else { | 372 } else { |
374 property_details_ = transition->GetLastDescriptorDetails(); | 373 property_details_ = transition->GetLastDescriptorDetails(); |
375 has_property_ = true; | 374 has_property_ = true; |
376 } | 375 } |
377 } | 376 } |
378 | 377 |
379 void LookupIterator::ApplyTransitionToDataProperty(Handle<JSObject> receiver) { | 378 void LookupIterator::ApplyTransitionToDataProperty(Handle<JSObject> receiver) { |
380 DCHECK_EQ(TRANSITION, state_); | 379 DCHECK_EQ(TRANSITION, state_); |
381 | 380 |
382 DCHECK(receiver.is_identical_to(GetStoreTarget())); | 381 DCHECK(receiver.is_identical_to(GetStoreTarget())); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 } | 510 } |
512 #endif | 511 #endif |
513 } | 512 } |
514 | 513 |
515 | 514 |
516 void LookupIterator::TransitionToAccessorPair(Handle<Object> pair, | 515 void LookupIterator::TransitionToAccessorPair(Handle<Object> pair, |
517 PropertyAttributes attributes) { | 516 PropertyAttributes attributes) { |
518 Handle<JSObject> receiver = GetStoreTarget(); | 517 Handle<JSObject> receiver = GetStoreTarget(); |
519 holder_ = receiver; | 518 holder_ = receiver; |
520 | 519 |
521 PropertyDetails details(attributes, ACCESSOR_CONSTANT, 0, | 520 PropertyDetails details(kAccessor, attributes, 0, PropertyCellType::kMutable); |
522 PropertyCellType::kMutable); | |
523 | 521 |
524 if (IsElement()) { | 522 if (IsElement()) { |
525 // TODO(verwaest): Move code into the element accessor. | 523 // TODO(verwaest): Move code into the element accessor. |
526 Handle<SeededNumberDictionary> dictionary = | 524 Handle<SeededNumberDictionary> dictionary = |
527 JSObject::NormalizeElements(receiver); | 525 JSObject::NormalizeElements(receiver); |
528 | 526 |
529 dictionary = SeededNumberDictionary::Set(dictionary, index_, pair, details, | 527 dictionary = SeededNumberDictionary::Set(dictionary, index_, pair, details, |
530 receiver); | 528 receiver); |
531 receiver->RequireSlowElements(*dictionary); | 529 receiver->RequireSlowElements(*dictionary); |
532 | 530 |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 | 872 |
875 // We have found a cached property! Modify the iterator accordingly. | 873 // We have found a cached property! Modify the iterator accordingly. |
876 name_ = maybe_name.ToHandleChecked(); | 874 name_ = maybe_name.ToHandleChecked(); |
877 Restart(); | 875 Restart(); |
878 CHECK_EQ(state(), LookupIterator::DATA); | 876 CHECK_EQ(state(), LookupIterator::DATA); |
879 return true; | 877 return true; |
880 } | 878 } |
881 | 879 |
882 } // namespace internal | 880 } // namespace internal |
883 } // namespace v8 | 881 } // namespace v8 |
OLD | NEW |