OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 if (object->IsGlobalObject()) { | 622 if (object->IsGlobalObject()) { |
623 Handle<PropertyCell> cell(PropertyCell::cast( | 623 Handle<PropertyCell> cell(PropertyCell::cast( |
624 property_dictionary->ValueAt(result->GetDictionaryEntry()))); | 624 property_dictionary->ValueAt(result->GetDictionaryEntry()))); |
625 PropertyCell::SetValueInferType(cell, value); | 625 PropertyCell::SetValueInferType(cell, value); |
626 } else { | 626 } else { |
627 property_dictionary->ValueAtPut(result->GetDictionaryEntry(), *value); | 627 property_dictionary->ValueAtPut(result->GetDictionaryEntry(), *value); |
628 } | 628 } |
629 } | 629 } |
630 | 630 |
631 | 631 |
632 // TODO(mstarzinger): Temporary wrapper until handlified. | |
633 static Handle<NameDictionary> NameDictionaryAdd(Handle<NameDictionary> dict, | |
634 Handle<Name> name, | |
635 Handle<Object> value, | |
636 PropertyDetails details) { | |
637 CALL_HEAP_FUNCTION(dict->GetIsolate(), | |
638 dict->Add(*name, *value, details), | |
639 NameDictionary); | |
640 } | |
641 | |
642 | |
643 void JSObject::SetNormalizedProperty(Handle<JSObject> object, | 632 void JSObject::SetNormalizedProperty(Handle<JSObject> object, |
644 Handle<Name> name, | 633 Handle<Name> name, |
645 Handle<Object> value, | 634 Handle<Object> value, |
646 PropertyDetails details) { | 635 PropertyDetails details) { |
647 ASSERT(!object->HasFastProperties()); | 636 ASSERT(!object->HasFastProperties()); |
648 Handle<NameDictionary> property_dictionary(object->property_dictionary()); | 637 Handle<NameDictionary> property_dictionary(object->property_dictionary()); |
649 | 638 |
650 if (!name->IsUniqueName()) { | 639 if (!name->IsUniqueName()) { |
651 name = object->GetIsolate()->factory()->InternalizeString( | 640 name = object->GetIsolate()->factory()->InternalizeString( |
652 Handle<String>::cast(name)); | 641 Handle<String>::cast(name)); |
653 } | 642 } |
654 | 643 |
655 int entry = property_dictionary->FindEntry(*name); | 644 int entry = property_dictionary->FindEntry(*name); |
656 if (entry == NameDictionary::kNotFound) { | 645 if (entry == NameDictionary::kNotFound) { |
657 Handle<Object> store_value = value; | 646 Handle<Object> store_value = value; |
658 if (object->IsGlobalObject()) { | 647 if (object->IsGlobalObject()) { |
659 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); | 648 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); |
660 } | 649 } |
661 | 650 |
662 property_dictionary = | 651 property_dictionary = NameDictionary::AddNameEntry( |
663 NameDictionaryAdd(property_dictionary, name, store_value, details); | 652 property_dictionary, name, store_value, details); |
664 object->set_properties(*property_dictionary); | 653 object->set_properties(*property_dictionary); |
665 return; | 654 return; |
666 } | 655 } |
667 | 656 |
668 PropertyDetails original_details = property_dictionary->DetailsAt(entry); | 657 PropertyDetails original_details = property_dictionary->DetailsAt(entry); |
669 int enumeration_index; | 658 int enumeration_index; |
670 // Preserve the enumeration index unless the property was deleted. | 659 // Preserve the enumeration index unless the property was deleted. |
671 if (original_details.IsDeleted()) { | 660 if (original_details.IsDeleted()) { |
672 enumeration_index = property_dictionary->NextEnumerationIndex(); | 661 enumeration_index = property_dictionary->NextEnumerationIndex(); |
673 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); | 662 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); |
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1933 PropertyDetails details = PropertyDetails(attributes, NORMAL, index); | 1922 PropertyDetails details = PropertyDetails(attributes, NORMAL, index); |
1934 dict->SetNextEnumerationIndex(index + 1); | 1923 dict->SetNextEnumerationIndex(index + 1); |
1935 dict->SetEntry(entry, *name, *cell, details); | 1924 dict->SetEntry(entry, *name, *cell, details); |
1936 return; | 1925 return; |
1937 } | 1926 } |
1938 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell(value); | 1927 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell(value); |
1939 PropertyCell::SetValueInferType(cell, value); | 1928 PropertyCell::SetValueInferType(cell, value); |
1940 value = cell; | 1929 value = cell; |
1941 } | 1930 } |
1942 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); | 1931 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
1943 Handle<NameDictionary> result = NameDictionaryAdd(dict, name, value, details); | 1932 Handle<NameDictionary> result = |
| 1933 NameDictionary::AddNameEntry(dict, name, value, details); |
1944 if (*dict != *result) object->set_properties(*result); | 1934 if (*dict != *result) object->set_properties(*result); |
1945 } | 1935 } |
1946 | 1936 |
1947 | 1937 |
1948 MaybeHandle<Object> JSObject::AddProperty( | 1938 MaybeHandle<Object> JSObject::AddProperty( |
1949 Handle<JSObject> object, | 1939 Handle<JSObject> object, |
1950 Handle<Name> name, | 1940 Handle<Name> name, |
1951 Handle<Object> value, | 1941 Handle<Object> value, |
1952 PropertyAttributes attributes, | 1942 PropertyAttributes attributes, |
1953 StrictMode strict_mode, | 1943 StrictMode strict_mode, |
(...skipping 2538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4492 | 4482 |
4493 Handle<DescriptorArray> descs(map->instance_descriptors()); | 4483 Handle<DescriptorArray> descs(map->instance_descriptors()); |
4494 for (int i = 0; i < real_size; i++) { | 4484 for (int i = 0; i < real_size; i++) { |
4495 PropertyDetails details = descs->GetDetails(i); | 4485 PropertyDetails details = descs->GetDetails(i); |
4496 switch (details.type()) { | 4486 switch (details.type()) { |
4497 case CONSTANT: { | 4487 case CONSTANT: { |
4498 Handle<Name> key(descs->GetKey(i)); | 4488 Handle<Name> key(descs->GetKey(i)); |
4499 Handle<Object> value(descs->GetConstant(i), isolate); | 4489 Handle<Object> value(descs->GetConstant(i), isolate); |
4500 PropertyDetails d = PropertyDetails( | 4490 PropertyDetails d = PropertyDetails( |
4501 details.attributes(), NORMAL, i + 1); | 4491 details.attributes(), NORMAL, i + 1); |
4502 dictionary = NameDictionaryAdd(dictionary, key, value, d); | 4492 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); |
4503 break; | 4493 break; |
4504 } | 4494 } |
4505 case FIELD: { | 4495 case FIELD: { |
4506 Handle<Name> key(descs->GetKey(i)); | 4496 Handle<Name> key(descs->GetKey(i)); |
4507 Handle<Object> value( | 4497 Handle<Object> value( |
4508 object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); | 4498 object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); |
4509 PropertyDetails d = | 4499 PropertyDetails d = |
4510 PropertyDetails(details.attributes(), NORMAL, i + 1); | 4500 PropertyDetails(details.attributes(), NORMAL, i + 1); |
4511 dictionary = NameDictionaryAdd(dictionary, key, value, d); | 4501 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); |
4512 break; | 4502 break; |
4513 } | 4503 } |
4514 case CALLBACKS: { | 4504 case CALLBACKS: { |
4515 Handle<Name> key(descs->GetKey(i)); | 4505 Handle<Name> key(descs->GetKey(i)); |
4516 Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 4506 Handle<Object> value(descs->GetCallbacksObject(i), isolate); |
4517 PropertyDetails d = PropertyDetails( | 4507 PropertyDetails d = PropertyDetails( |
4518 details.attributes(), CALLBACKS, i + 1); | 4508 details.attributes(), CALLBACKS, i + 1); |
4519 dictionary = NameDictionaryAdd(dictionary, key, value, d); | 4509 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); |
4520 break; | 4510 break; |
4521 } | 4511 } |
4522 case INTERCEPTOR: | 4512 case INTERCEPTOR: |
4523 break; | 4513 break; |
4524 case HANDLER: | 4514 case HANDLER: |
4525 case NORMAL: | 4515 case NORMAL: |
4526 case NONEXISTENT: | 4516 case NONEXISTENT: |
4527 UNREACHABLE(); | 4517 UNREACHABLE(); |
4528 break; | 4518 break; |
4529 } | 4519 } |
(...skipping 9754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14284 template | 14274 template |
14285 int Dictionary<SeededNumberDictionaryShape, uint32_t>::NumberOfEnumElements(); | 14275 int Dictionary<SeededNumberDictionaryShape, uint32_t>::NumberOfEnumElements(); |
14286 | 14276 |
14287 template | 14277 template |
14288 int Dictionary<NameDictionaryShape, Name*>::NumberOfEnumElements(); | 14278 int Dictionary<NameDictionaryShape, Name*>::NumberOfEnumElements(); |
14289 | 14279 |
14290 template | 14280 template |
14291 int HashTable<SeededNumberDictionaryShape, uint32_t>::FindEntry(uint32_t); | 14281 int HashTable<SeededNumberDictionaryShape, uint32_t>::FindEntry(uint32_t); |
14292 | 14282 |
14293 | 14283 |
| 14284 Handle<NameDictionary> NameDictionary::AddNameEntry(Handle<NameDictionary> dict, |
| 14285 Handle<Name> name, |
| 14286 Handle<Object> value, |
| 14287 PropertyDetails details) { |
| 14288 CALL_HEAP_FUNCTION(dict->GetIsolate(), |
| 14289 dict->Add(*name, *value, details), |
| 14290 NameDictionary); |
| 14291 } |
| 14292 |
| 14293 |
14294 Handle<Object> JSObject::PrepareSlowElementsForSort( | 14294 Handle<Object> JSObject::PrepareSlowElementsForSort( |
14295 Handle<JSObject> object, uint32_t limit) { | 14295 Handle<JSObject> object, uint32_t limit) { |
14296 CALL_HEAP_FUNCTION(object->GetIsolate(), | 14296 CALL_HEAP_FUNCTION(object->GetIsolate(), |
14297 object->PrepareSlowElementsForSort(limit), | 14297 object->PrepareSlowElementsForSort(limit), |
14298 Object); | 14298 Object); |
14299 } | 14299 } |
14300 | 14300 |
14301 | 14301 |
14302 // Collates undefined and unexisting elements below limit from position | 14302 // Collates undefined and unexisting elements below limit from position |
14303 // zero of the elements. The object stays in Dictionary mode. | 14303 // zero of the elements. The object stays in Dictionary mode. |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14815 Handle<JSGlobalObject> global, | 14815 Handle<JSGlobalObject> global, |
14816 Handle<Name> name) { | 14816 Handle<Name> name) { |
14817 ASSERT(!global->HasFastProperties()); | 14817 ASSERT(!global->HasFastProperties()); |
14818 int entry = global->property_dictionary()->FindEntry(*name); | 14818 int entry = global->property_dictionary()->FindEntry(*name); |
14819 if (entry == NameDictionary::kNotFound) { | 14819 if (entry == NameDictionary::kNotFound) { |
14820 Isolate* isolate = global->GetIsolate(); | 14820 Isolate* isolate = global->GetIsolate(); |
14821 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell( | 14821 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell( |
14822 isolate->factory()->the_hole_value()); | 14822 isolate->factory()->the_hole_value()); |
14823 PropertyDetails details(NONE, NORMAL, 0); | 14823 PropertyDetails details(NONE, NORMAL, 0); |
14824 details = details.AsDeleted(); | 14824 details = details.AsDeleted(); |
14825 Handle<NameDictionary> dictionary = NameDictionaryAdd( | 14825 Handle<NameDictionary> dictionary = NameDictionary::AddNameEntry( |
14826 handle(global->property_dictionary()), name, cell, details); | 14826 handle(global->property_dictionary()), name, cell, details); |
14827 global->set_properties(*dictionary); | 14827 global->set_properties(*dictionary); |
14828 return cell; | 14828 return cell; |
14829 } else { | 14829 } else { |
14830 Object* value = global->property_dictionary()->ValueAt(entry); | 14830 Object* value = global->property_dictionary()->ValueAt(entry); |
14831 ASSERT(value->IsPropertyCell()); | 14831 ASSERT(value->IsPropertyCell()); |
14832 return handle(PropertyCell::cast(value)); | 14832 return handle(PropertyCell::cast(value)); |
14833 } | 14833 } |
14834 } | 14834 } |
14835 | 14835 |
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16482 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16482 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16483 static const char* error_messages_[] = { | 16483 static const char* error_messages_[] = { |
16484 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16484 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16485 }; | 16485 }; |
16486 #undef ERROR_MESSAGES_TEXTS | 16486 #undef ERROR_MESSAGES_TEXTS |
16487 return error_messages_[reason]; | 16487 return error_messages_[reason]; |
16488 } | 16488 } |
16489 | 16489 |
16490 | 16490 |
16491 } } // namespace v8::internal | 16491 } } // namespace v8::internal |
OLD | NEW |