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 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 Handle<String>::cast(name)); | 660 Handle<String>::cast(name)); |
661 } | 661 } |
662 | 662 |
663 int entry = property_dictionary->FindEntry(*name); | 663 int entry = property_dictionary->FindEntry(*name); |
664 if (entry == NameDictionary::kNotFound) { | 664 if (entry == NameDictionary::kNotFound) { |
665 Handle<Object> store_value = value; | 665 Handle<Object> store_value = value; |
666 if (object->IsGlobalObject()) { | 666 if (object->IsGlobalObject()) { |
667 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); | 667 store_value = object->GetIsolate()->factory()->NewPropertyCell(value); |
668 } | 668 } |
669 | 669 |
670 property_dictionary = NameDictionary::AddNameEntry( | 670 property_dictionary = NameDictionary::Add( |
671 property_dictionary, name, store_value, details); | 671 property_dictionary, *name, store_value, details); |
672 object->set_properties(*property_dictionary); | 672 object->set_properties(*property_dictionary); |
673 return; | 673 return; |
674 } | 674 } |
675 | 675 |
676 PropertyDetails original_details = property_dictionary->DetailsAt(entry); | 676 PropertyDetails original_details = property_dictionary->DetailsAt(entry); |
677 int enumeration_index; | 677 int enumeration_index; |
678 // Preserve the enumeration index unless the property was deleted. | 678 // Preserve the enumeration index unless the property was deleted. |
679 if (original_details.IsDeleted()) { | 679 if (original_details.IsDeleted()) { |
680 enumeration_index = property_dictionary->NextEnumerationIndex(); | 680 enumeration_index = property_dictionary->NextEnumerationIndex(); |
681 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); | 681 property_dictionary->SetNextEnumerationIndex(enumeration_index + 1); |
(...skipping 1253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1935 dict->SetNextEnumerationIndex(index + 1); | 1935 dict->SetNextEnumerationIndex(index + 1); |
1936 dict->SetEntry(entry, *name, *cell, details); | 1936 dict->SetEntry(entry, *name, *cell, details); |
1937 return; | 1937 return; |
1938 } | 1938 } |
1939 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell(value); | 1939 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell(value); |
1940 PropertyCell::SetValueInferType(cell, value); | 1940 PropertyCell::SetValueInferType(cell, value); |
1941 value = cell; | 1941 value = cell; |
1942 } | 1942 } |
1943 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); | 1943 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
1944 Handle<NameDictionary> result = | 1944 Handle<NameDictionary> result = |
1945 NameDictionary::AddNameEntry(dict, name, value, details); | 1945 NameDictionary::Add(dict, *name, value, details); |
1946 if (*dict != *result) object->set_properties(*result); | 1946 if (*dict != *result) object->set_properties(*result); |
1947 } | 1947 } |
1948 | 1948 |
1949 | 1949 |
1950 MaybeHandle<Object> JSObject::AddProperty( | 1950 MaybeHandle<Object> JSObject::AddProperty( |
1951 Handle<JSObject> object, | 1951 Handle<JSObject> object, |
1952 Handle<Name> name, | 1952 Handle<Name> name, |
1953 Handle<Object> value, | 1953 Handle<Object> value, |
1954 PropertyAttributes attributes, | 1954 PropertyAttributes attributes, |
1955 StrictMode strict_mode, | 1955 StrictMode strict_mode, |
(...skipping 2678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4634 | 4634 |
4635 Handle<DescriptorArray> descs(map->instance_descriptors()); | 4635 Handle<DescriptorArray> descs(map->instance_descriptors()); |
4636 for (int i = 0; i < real_size; i++) { | 4636 for (int i = 0; i < real_size; i++) { |
4637 PropertyDetails details = descs->GetDetails(i); | 4637 PropertyDetails details = descs->GetDetails(i); |
4638 switch (details.type()) { | 4638 switch (details.type()) { |
4639 case CONSTANT: { | 4639 case CONSTANT: { |
4640 Handle<Name> key(descs->GetKey(i)); | 4640 Handle<Name> key(descs->GetKey(i)); |
4641 Handle<Object> value(descs->GetConstant(i), isolate); | 4641 Handle<Object> value(descs->GetConstant(i), isolate); |
4642 PropertyDetails d = PropertyDetails( | 4642 PropertyDetails d = PropertyDetails( |
4643 details.attributes(), NORMAL, i + 1); | 4643 details.attributes(), NORMAL, i + 1); |
4644 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); | 4644 dictionary = NameDictionary::Add(dictionary, *key, value, d); |
4645 break; | 4645 break; |
4646 } | 4646 } |
4647 case FIELD: { | 4647 case FIELD: { |
4648 Handle<Name> key(descs->GetKey(i)); | 4648 Handle<Name> key(descs->GetKey(i)); |
4649 Handle<Object> value( | 4649 Handle<Object> value( |
4650 object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); | 4650 object->RawFastPropertyAt(descs->GetFieldIndex(i)), isolate); |
4651 PropertyDetails d = | 4651 PropertyDetails d = |
4652 PropertyDetails(details.attributes(), NORMAL, i + 1); | 4652 PropertyDetails(details.attributes(), NORMAL, i + 1); |
4653 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); | 4653 dictionary = NameDictionary::Add(dictionary, *key, value, d); |
4654 break; | 4654 break; |
4655 } | 4655 } |
4656 case CALLBACKS: { | 4656 case CALLBACKS: { |
4657 Handle<Name> key(descs->GetKey(i)); | 4657 Handle<Name> key(descs->GetKey(i)); |
4658 Handle<Object> value(descs->GetCallbacksObject(i), isolate); | 4658 Handle<Object> value(descs->GetCallbacksObject(i), isolate); |
4659 PropertyDetails d = PropertyDetails( | 4659 PropertyDetails d = PropertyDetails( |
4660 details.attributes(), CALLBACKS, i + 1); | 4660 details.attributes(), CALLBACKS, i + 1); |
4661 dictionary = NameDictionary::AddNameEntry(dictionary, key, value, d); | 4661 dictionary = NameDictionary::Add(dictionary, *key, value, d); |
4662 break; | 4662 break; |
4663 } | 4663 } |
4664 case INTERCEPTOR: | 4664 case INTERCEPTOR: |
4665 break; | 4665 break; |
4666 case HANDLER: | 4666 case HANDLER: |
4667 case NORMAL: | 4667 case NORMAL: |
4668 case NONEXISTENT: | 4668 case NONEXISTENT: |
4669 UNREACHABLE(); | 4669 UNREACHABLE(); |
4670 break; | 4670 break; |
4671 } | 4671 } |
(...skipping 10294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14966 CopyKeysTo( | 14966 CopyKeysTo( |
14967 FixedArray*, | 14967 FixedArray*, |
14968 int, | 14968 int, |
14969 PropertyAttributes, | 14969 PropertyAttributes, |
14970 Dictionary<NameDictionary, NameDictionaryShape, Name*>::SortMode); | 14970 Dictionary<NameDictionary, NameDictionaryShape, Name*>::SortMode); |
14971 | 14971 |
14972 template int | 14972 template int |
14973 Dictionary<NameDictionary, NameDictionaryShape, Name*>:: | 14973 Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
14974 NumberOfElementsFilterAttributes(PropertyAttributes); | 14974 NumberOfElementsFilterAttributes(PropertyAttributes); |
14975 | 14975 |
14976 template MaybeObject* | 14976 template Handle<NameDictionary> |
14977 Dictionary<NameDictionary, NameDictionaryShape, Name*>::Add( | 14977 Dictionary<NameDictionary, NameDictionaryShape, Name*>::Add( |
14978 Name*, Object*, PropertyDetails); | 14978 Handle<NameDictionary>, Name*, Handle<Object>, PropertyDetails); |
14979 | 14979 |
14980 template MaybeObject* | 14980 template MaybeObject* |
14981 Dictionary<NameDictionary, NameDictionaryShape, Name*>:: | 14981 Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
14982 GenerateNewEnumerationIndices(); | 14982 GenerateNewEnumerationIndices(); |
14983 | 14983 |
14984 template int | 14984 template int |
14985 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14985 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14986 NumberOfElementsFilterAttributes(PropertyAttributes); | 14986 NumberOfElementsFilterAttributes(PropertyAttributes); |
14987 | 14987 |
14988 template MaybeObject* | 14988 template Handle<SeededNumberDictionary> |
14989 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>::Add( | 14989 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14990 uint32_t, Object*, PropertyDetails); | 14990 Add(Handle<SeededNumberDictionary>, |
| 14991 uint32_t, |
| 14992 Handle<Object>, |
| 14993 PropertyDetails); |
14991 | 14994 |
14992 template MaybeObject* | 14995 template Handle<UnseededNumberDictionary> |
14993 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: | 14996 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
14994 Add(uint32_t, Object*, PropertyDetails); | 14997 Add(Handle<UnseededNumberDictionary>, |
| 14998 uint32_t, |
| 14999 Handle<Object>, |
| 15000 PropertyDetails); |
14995 | 15001 |
14996 template MaybeObject* | 15002 template MaybeObject* |
14997 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 15003 Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14998 EnsureCapacity(int, uint32_t); | 15004 EnsureCapacity(int, uint32_t); |
14999 | 15005 |
15000 template MaybeObject* | 15006 template MaybeObject* |
15001 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: | 15007 Dictionary<UnseededNumberDictionary, UnseededNumberDictionaryShape, uint32_t>:: |
15002 EnsureCapacity(int, uint32_t); | 15008 EnsureCapacity(int, uint32_t); |
15003 | 15009 |
15004 template MaybeObject* | 15010 template MaybeObject* |
(...skipping 18 matching lines...) Expand all Loading... |
15023 | 15029 |
15024 template | 15030 template |
15025 int Dictionary<NameDictionary, NameDictionaryShape, Name*>:: | 15031 int Dictionary<NameDictionary, NameDictionaryShape, Name*>:: |
15026 NumberOfEnumElements(); | 15032 NumberOfEnumElements(); |
15027 | 15033 |
15028 template | 15034 template |
15029 int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 15035 int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
15030 FindEntry(uint32_t); | 15036 FindEntry(uint32_t); |
15031 | 15037 |
15032 | 15038 |
15033 Handle<NameDictionary> NameDictionary::AddNameEntry(Handle<NameDictionary> dict, | |
15034 Handle<Name> name, | |
15035 Handle<Object> value, | |
15036 PropertyDetails details) { | |
15037 CALL_HEAP_FUNCTION(dict->GetIsolate(), | |
15038 dict->Add(*name, *value, details), | |
15039 NameDictionary); | |
15040 } | |
15041 | |
15042 | |
15043 Handle<Object> JSObject::PrepareSlowElementsForSort( | 15039 Handle<Object> JSObject::PrepareSlowElementsForSort( |
15044 Handle<JSObject> object, uint32_t limit) { | 15040 Handle<JSObject> object, uint32_t limit) { |
15045 ASSERT(object->HasDictionaryElements()); | 15041 ASSERT(object->HasDictionaryElements()); |
15046 Isolate* isolate = object->GetIsolate(); | 15042 Isolate* isolate = object->GetIsolate(); |
15047 // Must stay in dictionary mode, either because of requires_slow_elements, | 15043 // Must stay in dictionary mode, either because of requires_slow_elements, |
15048 // or because we are not going to sort (and therefore compact) all of the | 15044 // or because we are not going to sort (and therefore compact) all of the |
15049 // elements. | 15045 // elements. |
15050 Handle<SeededNumberDictionary> dict(object->element_dictionary(), isolate); | 15046 Handle<SeededNumberDictionary> dict(object->element_dictionary(), isolate); |
15051 Handle<SeededNumberDictionary> new_dict = | 15047 Handle<SeededNumberDictionary> new_dict = |
15052 isolate->factory()->NewSeededNumberDictionary(dict->NumberOfElements()); | 15048 isolate->factory()->NewSeededNumberDictionary(dict->NumberOfElements()); |
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15473 Handle<JSGlobalObject> global, | 15469 Handle<JSGlobalObject> global, |
15474 Handle<Name> name) { | 15470 Handle<Name> name) { |
15475 ASSERT(!global->HasFastProperties()); | 15471 ASSERT(!global->HasFastProperties()); |
15476 int entry = global->property_dictionary()->FindEntry(*name); | 15472 int entry = global->property_dictionary()->FindEntry(*name); |
15477 if (entry == NameDictionary::kNotFound) { | 15473 if (entry == NameDictionary::kNotFound) { |
15478 Isolate* isolate = global->GetIsolate(); | 15474 Isolate* isolate = global->GetIsolate(); |
15479 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell( | 15475 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell( |
15480 isolate->factory()->the_hole_value()); | 15476 isolate->factory()->the_hole_value()); |
15481 PropertyDetails details(NONE, NORMAL, 0); | 15477 PropertyDetails details(NONE, NORMAL, 0); |
15482 details = details.AsDeleted(); | 15478 details = details.AsDeleted(); |
15483 Handle<NameDictionary> dictionary = NameDictionary::AddNameEntry( | 15479 Handle<NameDictionary> dictionary = NameDictionary::Add( |
15484 handle(global->property_dictionary()), name, cell, details); | 15480 handle(global->property_dictionary()), *name, cell, details); |
15485 global->set_properties(*dictionary); | 15481 global->set_properties(*dictionary); |
15486 return cell; | 15482 return cell; |
15487 } else { | 15483 } else { |
15488 Object* value = global->property_dictionary()->ValueAt(entry); | 15484 Object* value = global->property_dictionary()->ValueAt(entry); |
15489 ASSERT(value->IsPropertyCell()); | 15485 ASSERT(value->IsPropertyCell()); |
15490 return handle(PropertyCell::cast(value)); | 15486 return handle(PropertyCell::cast(value)); |
15491 } | 15487 } |
15492 } | 15488 } |
15493 | 15489 |
15494 | 15490 |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15953 Handle<Object> k = Shape::AsHandle(dictionary->GetIsolate(), key); | 15949 Handle<Object> k = Shape::AsHandle(dictionary->GetIsolate(), key); |
15954 // TODO(ishell): Figure out if it is necessary to call AsHandle() here. | 15950 // TODO(ishell): Figure out if it is necessary to call AsHandle() here. |
15955 USE(k); | 15951 USE(k); |
15956 PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); | 15952 PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); |
15957 | 15953 |
15958 return AddEntry(dictionary, key, value, details, dictionary->Hash(key)); | 15954 return AddEntry(dictionary, key, value, details, dictionary->Hash(key)); |
15959 } | 15955 } |
15960 | 15956 |
15961 | 15957 |
15962 template<typename Derived, typename Shape, typename Key> | 15958 template<typename Derived, typename Shape, typename Key> |
15963 MaybeObject* Dictionary<Derived, Shape, Key>::Add( | 15959 Handle<Derived> Dictionary<Derived, Shape, Key>::Add( |
| 15960 Handle<Derived> dictionary, |
15964 Key key, | 15961 Key key, |
15965 Object* value, | 15962 Handle<Object> value, |
15966 PropertyDetails details) { | 15963 PropertyDetails details) { |
15967 // Valdate key is absent. | 15964 // Valdate key is absent. |
15968 SLOW_ASSERT((this->FindEntry(key) == Dictionary::kNotFound)); | 15965 SLOW_ASSERT((dictionary->FindEntry(key) == Dictionary::kNotFound)); |
15969 // Check whether the dictionary should be extended. | 15966 // Check whether the dictionary should be extended. |
15970 Object* obj; | 15967 dictionary = EnsureCapacity(dictionary, 1, key); |
15971 { MaybeObject* maybe_obj = EnsureCapacity(1, key); | |
15972 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | |
15973 } | |
15974 | 15968 |
15975 return Dictionary::cast(obj)->AddEntry( | 15969 return AddEntry(dictionary, key, value, details, dictionary->Hash(key)); |
15976 key, value, details, Dictionary::Hash(key)); | |
15977 } | 15970 } |
15978 | 15971 |
15979 | 15972 |
15980 // Add a key, value pair to the dictionary. | 15973 // Add a key, value pair to the dictionary. |
15981 template<typename Derived, typename Shape, typename Key> | 15974 template<typename Derived, typename Shape, typename Key> |
15982 Handle<Derived> Dictionary<Derived, Shape, Key>::AddEntry( | 15975 Handle<Derived> Dictionary<Derived, Shape, Key>::AddEntry( |
15983 Handle<Derived> dictionary, | 15976 Handle<Derived> dictionary, |
15984 Key key, | 15977 Key key, |
15985 Handle<Object> value, | 15978 Handle<Object> value, |
15986 PropertyDetails details, | 15979 PropertyDetails details, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16042 } | 16035 } |
16043 | 16036 |
16044 | 16037 |
16045 Handle<SeededNumberDictionary> SeededNumberDictionary::AddNumberEntry( | 16038 Handle<SeededNumberDictionary> SeededNumberDictionary::AddNumberEntry( |
16046 Handle<SeededNumberDictionary> dictionary, | 16039 Handle<SeededNumberDictionary> dictionary, |
16047 uint32_t key, | 16040 uint32_t key, |
16048 Handle<Object> value, | 16041 Handle<Object> value, |
16049 PropertyDetails details) { | 16042 PropertyDetails details) { |
16050 dictionary->UpdateMaxNumberKey(key); | 16043 dictionary->UpdateMaxNumberKey(key); |
16051 SLOW_ASSERT(dictionary->FindEntry(key) == kNotFound); | 16044 SLOW_ASSERT(dictionary->FindEntry(key) == kNotFound); |
16052 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), | 16045 return Add(dictionary, key, value, details); |
16053 dictionary->Add(key, *value, details), | |
16054 SeededNumberDictionary); | |
16055 } | 16046 } |
16056 | 16047 |
16057 | 16048 |
16058 Handle<UnseededNumberDictionary> UnseededNumberDictionary::AddNumberEntry( | 16049 Handle<UnseededNumberDictionary> UnseededNumberDictionary::AddNumberEntry( |
16059 Handle<UnseededNumberDictionary> dictionary, | 16050 Handle<UnseededNumberDictionary> dictionary, |
16060 uint32_t key, | 16051 uint32_t key, |
16061 Handle<Object> value) { | 16052 Handle<Object> value) { |
16062 SLOW_ASSERT(dictionary->FindEntry(key) == kNotFound); | 16053 SLOW_ASSERT(dictionary->FindEntry(key) == kNotFound); |
16063 CALL_HEAP_FUNCTION(dictionary->GetIsolate(), | 16054 return Add(dictionary, key, value, PropertyDetails(NONE, NORMAL, 0)); |
16064 dictionary->Add( | |
16065 key, *value, PropertyDetails(NONE, NORMAL, 0)), | |
16066 UnseededNumberDictionary); | |
16067 } | 16055 } |
16068 | 16056 |
16069 | 16057 |
16070 Handle<SeededNumberDictionary> SeededNumberDictionary::AtNumberPut( | 16058 Handle<SeededNumberDictionary> SeededNumberDictionary::AtNumberPut( |
16071 Handle<SeededNumberDictionary> dictionary, | 16059 Handle<SeededNumberDictionary> dictionary, |
16072 uint32_t key, | 16060 uint32_t key, |
16073 Handle<Object> value) { | 16061 Handle<Object> value) { |
16074 dictionary->UpdateMaxNumberKey(key); | 16062 dictionary->UpdateMaxNumberKey(key); |
16075 return AtPut(dictionary, key, value); | 16063 return AtPut(dictionary, key, value); |
16076 } | 16064 } |
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17422 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17410 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17423 static const char* error_messages_[] = { | 17411 static const char* error_messages_[] = { |
17424 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17412 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17425 }; | 17413 }; |
17426 #undef ERROR_MESSAGES_TEXTS | 17414 #undef ERROR_MESSAGES_TEXTS |
17427 return error_messages_[reason]; | 17415 return error_messages_[reason]; |
17428 } | 17416 } |
17429 | 17417 |
17430 | 17418 |
17431 } } // namespace v8::internal | 17419 } } // namespace v8::internal |
OLD | NEW |