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 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 int enumeration_index; | 650 int enumeration_index; |
651 // Preserve the enumeration index unless the property was deleted. | 651 // Preserve the enumeration index unless the property was deleted. |
652 if (original_details.IsDeleted()) { | 652 if (original_details.IsDeleted()) { |
653 enumeration_index = property_dictionary()->NextEnumerationIndex(); | 653 enumeration_index = property_dictionary()->NextEnumerationIndex(); |
654 property_dictionary()->SetNextEnumerationIndex(enumeration_index + 1); | 654 property_dictionary()->SetNextEnumerationIndex(enumeration_index + 1); |
655 } else { | 655 } else { |
656 enumeration_index = original_details.dictionary_index(); | 656 enumeration_index = original_details.dictionary_index(); |
657 ASSERT(enumeration_index > 0); | 657 ASSERT(enumeration_index > 0); |
658 } | 658 } |
659 | 659 |
660 details = PropertyDetails(details.attributes(), details.type(), | 660 details = PropertyDetails( |
661 Representation::None(), enumeration_index); | 661 details.attributes(), details.type(), enumeration_index); |
662 | 662 |
663 if (IsGlobalObject()) { | 663 if (IsGlobalObject()) { |
664 JSGlobalPropertyCell* cell = | 664 JSGlobalPropertyCell* cell = |
665 JSGlobalPropertyCell::cast(property_dictionary()->ValueAt(entry)); | 665 JSGlobalPropertyCell::cast(property_dictionary()->ValueAt(entry)); |
666 cell->set_value(value); | 666 cell->set_value(value); |
667 // Please note we have to update the property details. | 667 // Please note we have to update the property details. |
668 property_dictionary()->DetailsAtPut(entry, details); | 668 property_dictionary()->DetailsAtPut(entry, details); |
669 } else { | 669 } else { |
670 property_dictionary()->SetEntry(entry, name, value, details); | 670 property_dictionary()->SetEntry(entry, name, value, details); |
671 } | 671 } |
(...skipping 1096 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 1768 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
1769 | 1769 |
1770 return AddSlowProperty(name, value, attributes); | 1770 return AddSlowProperty(name, value, attributes); |
1771 } | 1771 } |
1772 | 1772 |
1773 // Compute the new index for new field. | 1773 // Compute the new index for new field. |
1774 int index = map()->NextFreePropertyIndex(); | 1774 int index = map()->NextFreePropertyIndex(); |
1775 | 1775 |
1776 // Allocate new instance descriptors with (name, index) added | 1776 // Allocate new instance descriptors with (name, index) added |
1777 FieldDescriptor new_field( | 1777 FieldDescriptor new_field( |
1778 name, index, attributes, value->OptimalRepresentation(), 0); | 1778 name, index, attributes, value->OptimalRepresentation()); |
1779 | 1779 |
1780 ASSERT(index < map()->inobject_properties() || | 1780 ASSERT(index < map()->inobject_properties() || |
1781 (index - map()->inobject_properties()) < properties()->length() || | 1781 (index - map()->inobject_properties()) < properties()->length() || |
1782 map()->unused_property_fields() == 0); | 1782 map()->unused_property_fields() == 0); |
1783 | 1783 |
1784 FixedArray* values = NULL; | 1784 FixedArray* values = NULL; |
1785 | 1785 |
1786 if (map()->unused_property_fields() == 0) { | 1786 if (map()->unused_property_fields() == 0) { |
1787 // Make room for the new value | 1787 // Make room for the new value |
1788 MaybeObject* maybe_values = | 1788 MaybeObject* maybe_values = |
(...skipping 18 matching lines...) Expand all Loading... |
1807 set_map(new_map); | 1807 set_map(new_map); |
1808 return FastPropertyAtPut(index, value); | 1808 return FastPropertyAtPut(index, value); |
1809 } | 1809 } |
1810 | 1810 |
1811 | 1811 |
1812 MaybeObject* JSObject::AddConstantFunctionProperty( | 1812 MaybeObject* JSObject::AddConstantFunctionProperty( |
1813 Name* name, | 1813 Name* name, |
1814 JSFunction* function, | 1814 JSFunction* function, |
1815 PropertyAttributes attributes) { | 1815 PropertyAttributes attributes) { |
1816 // Allocate new instance descriptors with (name, function) added | 1816 // Allocate new instance descriptors with (name, function) added |
1817 ConstantFunctionDescriptor d(name, function, attributes, 0); | 1817 ConstantFunctionDescriptor d(name, function, attributes); |
1818 | 1818 |
1819 TransitionFlag flag = | 1819 TransitionFlag flag = |
1820 // Do not add transitions to global objects. | 1820 // Do not add transitions to global objects. |
1821 (IsGlobalObject() || | 1821 (IsGlobalObject() || |
1822 // Don't add transitions to special properties with non-trivial | 1822 // Don't add transitions to special properties with non-trivial |
1823 // attributes. | 1823 // attributes. |
1824 attributes != NONE) | 1824 attributes != NONE) |
1825 ? OMIT_TRANSITION | 1825 ? OMIT_TRANSITION |
1826 : INSERT_TRANSITION; | 1826 : INSERT_TRANSITION; |
1827 | 1827 |
(...skipping 15 matching lines...) Expand all Loading... |
1843 Object* store_value = value; | 1843 Object* store_value = value; |
1844 if (IsGlobalObject()) { | 1844 if (IsGlobalObject()) { |
1845 // In case name is an orphaned property reuse the cell. | 1845 // In case name is an orphaned property reuse the cell. |
1846 int entry = dict->FindEntry(name); | 1846 int entry = dict->FindEntry(name); |
1847 if (entry != NameDictionary::kNotFound) { | 1847 if (entry != NameDictionary::kNotFound) { |
1848 store_value = dict->ValueAt(entry); | 1848 store_value = dict->ValueAt(entry); |
1849 JSGlobalPropertyCell::cast(store_value)->set_value(value); | 1849 JSGlobalPropertyCell::cast(store_value)->set_value(value); |
1850 // Assign an enumeration index to the property and update | 1850 // Assign an enumeration index to the property and update |
1851 // SetNextEnumerationIndex. | 1851 // SetNextEnumerationIndex. |
1852 int index = dict->NextEnumerationIndex(); | 1852 int index = dict->NextEnumerationIndex(); |
1853 PropertyDetails details = PropertyDetails( | 1853 PropertyDetails details = PropertyDetails(attributes, NORMAL, index); |
1854 attributes, NORMAL, Representation::None(), index); | |
1855 dict->SetNextEnumerationIndex(index + 1); | 1854 dict->SetNextEnumerationIndex(index + 1); |
1856 dict->SetEntry(entry, name, store_value, details); | 1855 dict->SetEntry(entry, name, store_value, details); |
1857 return value; | 1856 return value; |
1858 } | 1857 } |
1859 Heap* heap = GetHeap(); | 1858 Heap* heap = GetHeap(); |
1860 { MaybeObject* maybe_store_value = | 1859 { MaybeObject* maybe_store_value = |
1861 heap->AllocateJSGlobalPropertyCell(value); | 1860 heap->AllocateJSGlobalPropertyCell(value); |
1862 if (!maybe_store_value->ToObject(&store_value)) return maybe_store_value; | 1861 if (!maybe_store_value->ToObject(&store_value)) return maybe_store_value; |
1863 } | 1862 } |
1864 JSGlobalPropertyCell::cast(store_value)->set_value(value); | 1863 JSGlobalPropertyCell::cast(store_value)->set_value(value); |
1865 } | 1864 } |
1866 PropertyDetails details = PropertyDetails( | 1865 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
1867 attributes, NORMAL, Representation::None()); | |
1868 Object* result; | 1866 Object* result; |
1869 { MaybeObject* maybe_result = dict->Add(name, store_value, details); | 1867 { MaybeObject* maybe_result = dict->Add(name, store_value, details); |
1870 if (!maybe_result->ToObject(&result)) return maybe_result; | 1868 if (!maybe_result->ToObject(&result)) return maybe_result; |
1871 } | 1869 } |
1872 if (dict != result) set_properties(NameDictionary::cast(result)); | 1870 if (dict != result) set_properties(NameDictionary::cast(result)); |
1873 return value; | 1871 return value; |
1874 } | 1872 } |
1875 | 1873 |
1876 | 1874 |
1877 MaybeObject* JSObject::AddProperty(Name* name, | 1875 MaybeObject* JSObject::AddProperty(Name* name, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 Object* value, | 1996 Object* value, |
1999 PropertyAttributes attributes) { | 1997 PropertyAttributes attributes) { |
2000 NameDictionary* dictionary = property_dictionary(); | 1998 NameDictionary* dictionary = property_dictionary(); |
2001 int old_index = dictionary->FindEntry(name); | 1999 int old_index = dictionary->FindEntry(name); |
2002 int new_enumeration_index = 0; // 0 means "Use the next available index." | 2000 int new_enumeration_index = 0; // 0 means "Use the next available index." |
2003 if (old_index != -1) { | 2001 if (old_index != -1) { |
2004 // All calls to ReplaceSlowProperty have had all transitions removed. | 2002 // All calls to ReplaceSlowProperty have had all transitions removed. |
2005 new_enumeration_index = dictionary->DetailsAt(old_index).dictionary_index(); | 2003 new_enumeration_index = dictionary->DetailsAt(old_index).dictionary_index(); |
2006 } | 2004 } |
2007 | 2005 |
2008 PropertyDetails new_details( | 2006 PropertyDetails new_details(attributes, NORMAL, new_enumeration_index); |
2009 attributes, NORMAL, Representation::None(), new_enumeration_index); | |
2010 return SetNormalizedProperty(name, value, new_details); | 2007 return SetNormalizedProperty(name, value, new_details); |
2011 } | 2008 } |
2012 | 2009 |
2013 | 2010 |
2014 MaybeObject* JSObject::ConvertTransitionToMapTransition( | 2011 MaybeObject* JSObject::ConvertTransitionToMapTransition( |
2015 int transition_index, | 2012 int transition_index, |
2016 Name* name, | 2013 Name* name, |
2017 Object* new_value, | 2014 Object* new_value, |
2018 PropertyAttributes attributes) { | 2015 PropertyAttributes attributes) { |
2019 Map* old_map = map(); | 2016 Map* old_map = map(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2066 if (map()->unused_property_fields() == 0 && | 2063 if (map()->unused_property_fields() == 0 && |
2067 TooManyFastProperties(properties()->length(), MAY_BE_STORE_FROM_KEYED)) { | 2064 TooManyFastProperties(properties()->length(), MAY_BE_STORE_FROM_KEYED)) { |
2068 Object* obj; | 2065 Object* obj; |
2069 MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); | 2066 MaybeObject* maybe_obj = NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0); |
2070 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2067 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
2071 return ReplaceSlowProperty(name, new_value, attributes); | 2068 return ReplaceSlowProperty(name, new_value, attributes); |
2072 } | 2069 } |
2073 | 2070 |
2074 int index = map()->NextFreePropertyIndex(); | 2071 int index = map()->NextFreePropertyIndex(); |
2075 FieldDescriptor new_field( | 2072 FieldDescriptor new_field( |
2076 name, index, attributes, new_value->OptimalRepresentation(), 0); | 2073 name, index, attributes, new_value->OptimalRepresentation()); |
2077 | 2074 |
2078 // Make a new map for the object. | 2075 // Make a new map for the object. |
2079 Map* new_map; | 2076 Map* new_map; |
2080 MaybeObject* maybe_new_map = map()->CopyInsertDescriptor(&new_field, | 2077 MaybeObject* maybe_new_map = map()->CopyInsertDescriptor(&new_field, |
2081 OMIT_TRANSITION); | 2078 OMIT_TRANSITION); |
2082 if (!maybe_new_map->To(&new_map)) return maybe_new_map; | 2079 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
2083 | 2080 |
2084 // Make new properties array if necessary. | 2081 // Make new properties array if necessary. |
2085 FixedArray* new_properties = NULL; | 2082 FixedArray* new_properties = NULL; |
2086 int new_unused_property_fields = map()->unused_property_fields() - 1; | 2083 int new_unused_property_fields = map()->unused_property_fields() - 1; |
(...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3751 bool is_observed = FLAG_harmony_observation && self->map()->is_observed(); | 3748 bool is_observed = FLAG_harmony_observation && self->map()->is_observed(); |
3752 if (is_observed) { | 3749 if (is_observed) { |
3753 if (lookup.IsDataProperty()) old_value = Object::GetProperty(self, name); | 3750 if (lookup.IsDataProperty()) old_value = Object::GetProperty(self, name); |
3754 old_attributes = lookup.GetAttributes(); | 3751 old_attributes = lookup.GetAttributes(); |
3755 } | 3752 } |
3756 | 3753 |
3757 // Check of IsReadOnly removed from here in clone. | 3754 // Check of IsReadOnly removed from here in clone. |
3758 MaybeObject* result = *value; | 3755 MaybeObject* result = *value; |
3759 switch (lookup.type()) { | 3756 switch (lookup.type()) { |
3760 case NORMAL: { | 3757 case NORMAL: { |
3761 PropertyDetails details = PropertyDetails( | 3758 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
3762 attributes, NORMAL, Representation::None()); | |
3763 result = self->SetNormalizedProperty(*name, *value, details); | 3759 result = self->SetNormalizedProperty(*name, *value, details); |
3764 break; | 3760 break; |
3765 } | 3761 } |
3766 case FIELD: { | 3762 case FIELD: { |
3767 Representation representation = lookup.representation(); | 3763 Representation representation = lookup.representation(); |
3768 if (!value->FitsRepresentation(representation)) { | 3764 if (!value->FitsRepresentation(representation)) { |
3769 MaybeObject* maybe_failure = self->GeneralizeFieldRepresentation( | 3765 MaybeObject* maybe_failure = self->GeneralizeFieldRepresentation( |
3770 lookup.GetDescriptorIndex(), value->OptimalRepresentation()); | 3766 lookup.GetDescriptorIndex(), value->OptimalRepresentation()); |
3771 if (maybe_failure->IsFailure()) return maybe_failure; | 3767 if (maybe_failure->IsFailure()) return maybe_failure; |
3772 } | 3768 } |
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4211 NameDictionary* dictionary; | 4207 NameDictionary* dictionary; |
4212 MaybeObject* maybe_dictionary = | 4208 MaybeObject* maybe_dictionary = |
4213 NameDictionary::Allocate(GetHeap(), property_count); | 4209 NameDictionary::Allocate(GetHeap(), property_count); |
4214 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 4210 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
4215 | 4211 |
4216 DescriptorArray* descs = map_of_this->instance_descriptors(); | 4212 DescriptorArray* descs = map_of_this->instance_descriptors(); |
4217 for (int i = 0; i < real_size; i++) { | 4213 for (int i = 0; i < real_size; i++) { |
4218 PropertyDetails details = descs->GetDetails(i); | 4214 PropertyDetails details = descs->GetDetails(i); |
4219 switch (details.type()) { | 4215 switch (details.type()) { |
4220 case CONSTANT_FUNCTION: { | 4216 case CONSTANT_FUNCTION: { |
4221 PropertyDetails d = PropertyDetails(details.attributes(), | 4217 PropertyDetails d = PropertyDetails( |
4222 NORMAL, | 4218 details.attributes(), NORMAL, i + 1); |
4223 Representation::None(), | |
4224 details.descriptor_index()); | |
4225 Object* value = descs->GetConstantFunction(i); | 4219 Object* value = descs->GetConstantFunction(i); |
4226 MaybeObject* maybe_dictionary = | 4220 MaybeObject* maybe_dictionary = |
4227 dictionary->Add(descs->GetKey(i), value, d); | 4221 dictionary->Add(descs->GetKey(i), value, d); |
4228 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 4222 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
4229 break; | 4223 break; |
4230 } | 4224 } |
4231 case FIELD: { | 4225 case FIELD: { |
4232 PropertyDetails d = PropertyDetails(details.attributes(), | 4226 PropertyDetails d = PropertyDetails( |
4233 NORMAL, | 4227 details.attributes(), NORMAL, i + 1); |
4234 Representation::None(), | |
4235 details.descriptor_index()); | |
4236 Object* value = FastPropertyAt(descs->GetFieldIndex(i)); | 4228 Object* value = FastPropertyAt(descs->GetFieldIndex(i)); |
4237 MaybeObject* maybe_dictionary = | 4229 MaybeObject* maybe_dictionary = |
4238 dictionary->Add(descs->GetKey(i), value, d); | 4230 dictionary->Add(descs->GetKey(i), value, d); |
4239 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 4231 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
4240 break; | 4232 break; |
4241 } | 4233 } |
4242 case CALLBACKS: { | 4234 case CALLBACKS: { |
4243 Object* value = descs->GetCallbacksObject(i); | 4235 Object* value = descs->GetCallbacksObject(i); |
4244 PropertyDetails d = PropertyDetails(details.attributes(), | 4236 PropertyDetails d = PropertyDetails( |
4245 CALLBACKS, | 4237 details.attributes(), CALLBACKS, i + 1); |
4246 Representation::None(), | |
4247 details.descriptor_index()); | |
4248 MaybeObject* maybe_dictionary = | 4238 MaybeObject* maybe_dictionary = |
4249 dictionary->Add(descs->GetKey(i), value, d); | 4239 dictionary->Add(descs->GetKey(i), value, d); |
4250 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 4240 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
4251 break; | 4241 break; |
4252 } | 4242 } |
4253 case INTERCEPTOR: | 4243 case INTERCEPTOR: |
4254 break; | 4244 break; |
4255 case HANDLER: | 4245 case HANDLER: |
4256 case NORMAL: | 4246 case NORMAL: |
4257 case TRANSITION: | 4247 case TRANSITION: |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4373 // exceed the capacity of new space, and we would fail repeatedly | 4363 // exceed the capacity of new space, and we would fail repeatedly |
4374 // trying to convert the FixedDoubleArray. | 4364 // trying to convert the FixedDoubleArray. |
4375 MaybeObject* maybe_value_object = | 4365 MaybeObject* maybe_value_object = |
4376 GetHeap()->AllocateHeapNumber(double_array->get_scalar(i), TENURED); | 4366 GetHeap()->AllocateHeapNumber(double_array->get_scalar(i), TENURED); |
4377 if (!maybe_value_object->ToObject(&value)) return maybe_value_object; | 4367 if (!maybe_value_object->ToObject(&value)) return maybe_value_object; |
4378 } | 4368 } |
4379 } else { | 4369 } else { |
4380 ASSERT(old_map->has_fast_smi_or_object_elements()); | 4370 ASSERT(old_map->has_fast_smi_or_object_elements()); |
4381 value = FixedArray::cast(array)->get(i); | 4371 value = FixedArray::cast(array)->get(i); |
4382 } | 4372 } |
4383 PropertyDetails details = PropertyDetails( | 4373 PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); |
4384 NONE, NORMAL, Representation::None()); | |
4385 if (!value->IsTheHole()) { | 4374 if (!value->IsTheHole()) { |
4386 Object* result; | 4375 Object* result; |
4387 MaybeObject* maybe_result = | 4376 MaybeObject* maybe_result = |
4388 dictionary->AddNumberEntry(i, value, details); | 4377 dictionary->AddNumberEntry(i, value, details); |
4389 if (!maybe_result->ToObject(&result)) return maybe_result; | 4378 if (!maybe_result->ToObject(&result)) return maybe_result; |
4390 dictionary = SeededNumberDictionary::cast(result); | 4379 dictionary = SeededNumberDictionary::cast(result); |
4391 } | 4380 } |
4392 } | 4381 } |
4393 | 4382 |
4394 // Switch to using the dictionary as the backing storage for elements. | 4383 // Switch to using the dictionary as the backing storage for elements. |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5445 PropertyAttributes attributes) { | 5434 PropertyAttributes attributes) { |
5446 int entry = dictionary->FindEntry(index); | 5435 int entry = dictionary->FindEntry(index); |
5447 if (entry != SeededNumberDictionary::kNotFound) { | 5436 if (entry != SeededNumberDictionary::kNotFound) { |
5448 Object* result = dictionary->ValueAt(entry); | 5437 Object* result = dictionary->ValueAt(entry); |
5449 PropertyDetails details = dictionary->DetailsAt(entry); | 5438 PropertyDetails details = dictionary->DetailsAt(entry); |
5450 if (details.type() == CALLBACKS && result->IsAccessorPair()) { | 5439 if (details.type() == CALLBACKS && result->IsAccessorPair()) { |
5451 ASSERT(!details.IsDontDelete()); | 5440 ASSERT(!details.IsDontDelete()); |
5452 if (details.attributes() != attributes) { | 5441 if (details.attributes() != attributes) { |
5453 dictionary->DetailsAtPut( | 5442 dictionary->DetailsAtPut( |
5454 entry, | 5443 entry, |
5455 PropertyDetails( | 5444 PropertyDetails(attributes, CALLBACKS, index)); |
5456 attributes, CALLBACKS, Representation::None(), index)); | |
5457 } | 5445 } |
5458 AccessorPair::cast(result)->SetComponents(getter, setter); | 5446 AccessorPair::cast(result)->SetComponents(getter, setter); |
5459 return true; | 5447 return true; |
5460 } | 5448 } |
5461 } | 5449 } |
5462 return false; | 5450 return false; |
5463 } | 5451 } |
5464 | 5452 |
5465 | 5453 |
5466 MaybeObject* JSObject::DefineElementAccessor(uint32_t index, | 5454 MaybeObject* JSObject::DefineElementAccessor(uint32_t index, |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5607 } | 5595 } |
5608 } | 5596 } |
5609 | 5597 |
5610 return true; | 5598 return true; |
5611 } | 5599 } |
5612 | 5600 |
5613 | 5601 |
5614 MaybeObject* JSObject::SetElementCallback(uint32_t index, | 5602 MaybeObject* JSObject::SetElementCallback(uint32_t index, |
5615 Object* structure, | 5603 Object* structure, |
5616 PropertyAttributes attributes) { | 5604 PropertyAttributes attributes) { |
5617 PropertyDetails details = PropertyDetails( | 5605 PropertyDetails details = PropertyDetails(attributes, CALLBACKS, 0); |
5618 attributes, CALLBACKS, Representation::None()); | |
5619 | 5606 |
5620 // Normalize elements to make this operation simple. | 5607 // Normalize elements to make this operation simple. |
5621 SeededNumberDictionary* dictionary; | 5608 SeededNumberDictionary* dictionary; |
5622 { MaybeObject* maybe_dictionary = NormalizeElements(); | 5609 { MaybeObject* maybe_dictionary = NormalizeElements(); |
5623 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 5610 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
5624 } | 5611 } |
5625 ASSERT(HasDictionaryElements() || HasDictionaryArgumentsElements()); | 5612 ASSERT(HasDictionaryElements() || HasDictionaryArgumentsElements()); |
5626 | 5613 |
5627 // Update the dictionary with the new CALLBACKS property. | 5614 // Update the dictionary with the new CALLBACKS property. |
5628 { MaybeObject* maybe_dictionary = dictionary->Set(index, structure, details); | 5615 { MaybeObject* maybe_dictionary = dictionary->Set(index, structure, details); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5666 ASSERT(new_map->is_dictionary_map()); | 5653 ASSERT(new_map->is_dictionary_map()); |
5667 | 5654 |
5668 set_map(new_map); | 5655 set_map(new_map); |
5669 // When running crankshaft, changing the map is not enough. We | 5656 // When running crankshaft, changing the map is not enough. We |
5670 // need to deoptimize all functions that rely on this global | 5657 // need to deoptimize all functions that rely on this global |
5671 // object. | 5658 // object. |
5672 Deoptimizer::DeoptimizeGlobalObject(this); | 5659 Deoptimizer::DeoptimizeGlobalObject(this); |
5673 } | 5660 } |
5674 | 5661 |
5675 // Update the dictionary with the new CALLBACKS property. | 5662 // Update the dictionary with the new CALLBACKS property. |
5676 PropertyDetails details = PropertyDetails( | 5663 PropertyDetails details = PropertyDetails(attributes, CALLBACKS, 0); |
5677 attributes, CALLBACKS, Representation::None()); | |
5678 maybe_ok = SetNormalizedProperty(name, structure, details); | 5664 maybe_ok = SetNormalizedProperty(name, structure, details); |
5679 if (maybe_ok->IsFailure()) return maybe_ok; | 5665 if (maybe_ok->IsFailure()) return maybe_ok; |
5680 | 5666 |
5681 return GetHeap()->undefined_value(); | 5667 return GetHeap()->undefined_value(); |
5682 } | 5668 } |
5683 | 5669 |
5684 | 5670 |
5685 void JSObject::DefineAccessor(Handle<JSObject> object, | 5671 void JSObject::DefineAccessor(Handle<JSObject> object, |
5686 Handle<Name> name, | 5672 Handle<Name> name, |
5687 Handle<Object> getter, | 5673 Handle<Object> getter, |
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6329 MaybeObject* Map::CopyAddDescriptor(Descriptor* descriptor, | 6315 MaybeObject* Map::CopyAddDescriptor(Descriptor* descriptor, |
6330 TransitionFlag flag) { | 6316 TransitionFlag flag) { |
6331 DescriptorArray* descriptors = instance_descriptors(); | 6317 DescriptorArray* descriptors = instance_descriptors(); |
6332 | 6318 |
6333 // Ensure the key is unique. | 6319 // Ensure the key is unique. |
6334 MaybeObject* maybe_failure = descriptor->KeyToUniqueName(); | 6320 MaybeObject* maybe_failure = descriptor->KeyToUniqueName(); |
6335 if (maybe_failure->IsFailure()) return maybe_failure; | 6321 if (maybe_failure->IsFailure()) return maybe_failure; |
6336 | 6322 |
6337 int old_size = NumberOfOwnDescriptors(); | 6323 int old_size = NumberOfOwnDescriptors(); |
6338 int new_size = old_size + 1; | 6324 int new_size = old_size + 1; |
6339 descriptor->SetEnumerationIndex(new_size); | |
6340 | 6325 |
6341 if (flag == INSERT_TRANSITION && | 6326 if (flag == INSERT_TRANSITION && |
6342 owns_descriptors() && | 6327 owns_descriptors() && |
6343 CanHaveMoreTransitions()) { | 6328 CanHaveMoreTransitions()) { |
6344 return ShareDescriptor(descriptors, descriptor); | 6329 return ShareDescriptor(descriptors, descriptor); |
6345 } | 6330 } |
6346 | 6331 |
6347 DescriptorArray* new_descriptors; | 6332 DescriptorArray* new_descriptors; |
6348 MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size, 1); | 6333 MaybeObject* maybe_descriptors = DescriptorArray::Allocate(old_size, 1); |
6349 if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors; | 6334 if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6414 // Ensure the key is unique. | 6399 // Ensure the key is unique. |
6415 MaybeObject* maybe_failure = descriptor->KeyToUniqueName(); | 6400 MaybeObject* maybe_failure = descriptor->KeyToUniqueName(); |
6416 if (maybe_failure->IsFailure()) return maybe_failure; | 6401 if (maybe_failure->IsFailure()) return maybe_failure; |
6417 | 6402 |
6418 Name* key = descriptor->GetKey(); | 6403 Name* key = descriptor->GetKey(); |
6419 ASSERT(key == descriptors->GetKey(insertion_index)); | 6404 ASSERT(key == descriptors->GetKey(insertion_index)); |
6420 | 6405 |
6421 int new_size = NumberOfOwnDescriptors(); | 6406 int new_size = NumberOfOwnDescriptors(); |
6422 ASSERT(0 <= insertion_index && insertion_index < new_size); | 6407 ASSERT(0 <= insertion_index && insertion_index < new_size); |
6423 | 6408 |
6424 PropertyDetails details = descriptors->GetDetails(insertion_index); | 6409 ASSERT_LT(insertion_index, new_size); |
6425 ASSERT_LE(details.descriptor_index(), new_size); | |
6426 descriptor->SetEnumerationIndex(details.descriptor_index()); | |
6427 | 6410 |
6428 DescriptorArray* new_descriptors; | 6411 DescriptorArray* new_descriptors; |
6429 MaybeObject* maybe_descriptors = DescriptorArray::Allocate(new_size); | 6412 MaybeObject* maybe_descriptors = DescriptorArray::Allocate(new_size); |
6430 if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors; | 6413 if (!maybe_descriptors->To(&new_descriptors)) return maybe_descriptors; |
6431 DescriptorArray::WhitenessWitness witness(new_descriptors); | 6414 DescriptorArray::WhitenessWitness witness(new_descriptors); |
6432 | 6415 |
6433 for (int i = 0; i < new_size; ++i) { | 6416 for (int i = 0; i < new_size; ++i) { |
6434 if (i == insertion_index) { | 6417 if (i == insertion_index) { |
6435 new_descriptors->Set(i, descriptor, witness); | 6418 new_descriptors->Set(i, descriptor, witness); |
6436 } else { | 6419 } else { |
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7312 | 7295 |
7313 if (details.type() == FIELD || other_details.type() == FIELD || | 7296 if (details.type() == FIELD || other_details.type() == FIELD || |
7314 (details.type() == CONSTANT_FUNCTION && | 7297 (details.type() == CONSTANT_FUNCTION && |
7315 other_details.type() == CONSTANT_FUNCTION && | 7298 other_details.type() == CONSTANT_FUNCTION && |
7316 GetValue(descriptor) != other->GetValue(descriptor))) { | 7299 GetValue(descriptor) != other->GetValue(descriptor))) { |
7317 Representation representation = | 7300 Representation representation = |
7318 details.representation().generalize(other_details.representation()); | 7301 details.representation().generalize(other_details.representation()); |
7319 FieldDescriptor d(key, | 7302 FieldDescriptor d(key, |
7320 current_offset++, | 7303 current_offset++, |
7321 details.attributes(), | 7304 details.attributes(), |
7322 representation, | 7305 representation); |
7323 descriptor + 1); | |
7324 result->Set(descriptor, &d, witness); | 7306 result->Set(descriptor, &d, witness); |
7325 } else { | 7307 } else { |
7326 result->CopyFrom(descriptor, other, descriptor, witness); | 7308 result->CopyFrom(descriptor, other, descriptor, witness); |
7327 } | 7309 } |
7328 } | 7310 } |
7329 | 7311 |
7330 // |valid| -> |new_size| | 7312 // |valid| -> |new_size| |
7331 for (; descriptor < new_size; descriptor++) { | 7313 for (; descriptor < new_size; descriptor++) { |
7332 PropertyDetails details = other->GetDetails(descriptor); | 7314 PropertyDetails details = other->GetDetails(descriptor); |
7333 if (details.type() == FIELD) { | 7315 if (details.type() == FIELD) { |
7334 Name* key = other->GetKey(descriptor); | 7316 Name* key = other->GetKey(descriptor); |
7335 FieldDescriptor d(key, | 7317 FieldDescriptor d(key, |
7336 current_offset++, | 7318 current_offset++, |
7337 details.attributes(), | 7319 details.attributes(), |
7338 details.representation(), | 7320 details.representation()); |
7339 descriptor + 1); | |
7340 result->Set(descriptor, &d, witness); | 7321 result->Set(descriptor, &d, witness); |
7341 } else { | 7322 } else { |
7342 result->CopyFrom(descriptor, other, descriptor, witness); | 7323 result->CopyFrom(descriptor, other, descriptor, witness); |
7343 } | 7324 } |
7344 } | 7325 } |
7345 | 7326 |
7346 result->Sort(); | 7327 result->Sort(); |
7347 return result; | 7328 return result; |
7348 } | 7329 } |
7349 | 7330 |
(...skipping 3844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11194 Object* element = dictionary->ValueAt(entry); | 11175 Object* element = dictionary->ValueAt(entry); |
11195 PropertyDetails details = dictionary->DetailsAt(entry); | 11176 PropertyDetails details = dictionary->DetailsAt(entry); |
11196 if (details.type() == CALLBACKS && set_mode == SET_PROPERTY) { | 11177 if (details.type() == CALLBACKS && set_mode == SET_PROPERTY) { |
11197 return SetElementWithCallback(element, index, *value, this, strict_mode); | 11178 return SetElementWithCallback(element, index, *value, this, strict_mode); |
11198 } else { | 11179 } else { |
11199 dictionary->UpdateMaxNumberKey(index); | 11180 dictionary->UpdateMaxNumberKey(index); |
11200 // If a value has not been initialized we allow writing to it even if it | 11181 // If a value has not been initialized we allow writing to it even if it |
11201 // is read-only (a declared const that has not been initialized). If a | 11182 // is read-only (a declared const that has not been initialized). If a |
11202 // value is being defined we skip attribute checks completely. | 11183 // value is being defined we skip attribute checks completely. |
11203 if (set_mode == DEFINE_PROPERTY) { | 11184 if (set_mode == DEFINE_PROPERTY) { |
11204 details = PropertyDetails(attributes, NORMAL, Representation::None(), | 11185 details = PropertyDetails( |
11205 details.dictionary_index()); | 11186 attributes, NORMAL, details.dictionary_index()); |
11206 dictionary->DetailsAtPut(entry, details); | 11187 dictionary->DetailsAtPut(entry, details); |
11207 } else if (details.IsReadOnly() && !element->IsTheHole()) { | 11188 } else if (details.IsReadOnly() && !element->IsTheHole()) { |
11208 if (strict_mode == kNonStrictMode) { | 11189 if (strict_mode == kNonStrictMode) { |
11209 return isolate->heap()->undefined_value(); | 11190 return isolate->heap()->undefined_value(); |
11210 } else { | 11191 } else { |
11211 Handle<Object> holder(this, isolate); | 11192 Handle<Object> holder(this, isolate); |
11212 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11193 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
11213 Handle<Object> args[2] = { number, holder }; | 11194 Handle<Object> args[2] = { number, holder }; |
11214 Handle<Object> error = | 11195 Handle<Object> error = |
11215 isolate->factory()->NewTypeError("strict_read_only_property", | 11196 isolate->factory()->NewTypeError("strict_read_only_property", |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11247 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 11228 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); |
11248 Handle<String> name = isolate->factory()->NumberToString(number); | 11229 Handle<String> name = isolate->factory()->NumberToString(number); |
11249 Handle<Object> args[1] = { name }; | 11230 Handle<Object> args[1] = { name }; |
11250 Handle<Object> error = | 11231 Handle<Object> error = |
11251 isolate->factory()->NewTypeError("object_not_extensible", | 11232 isolate->factory()->NewTypeError("object_not_extensible", |
11252 HandleVector(args, 1)); | 11233 HandleVector(args, 1)); |
11253 return isolate->Throw(*error); | 11234 return isolate->Throw(*error); |
11254 } | 11235 } |
11255 } | 11236 } |
11256 FixedArrayBase* new_dictionary; | 11237 FixedArrayBase* new_dictionary; |
11257 PropertyDetails details = PropertyDetails( | 11238 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
11258 attributes, NORMAL, Representation::None()); | |
11259 MaybeObject* maybe = dictionary->AddNumberEntry(index, *value, details); | 11239 MaybeObject* maybe = dictionary->AddNumberEntry(index, *value, details); |
11260 if (!maybe->To(&new_dictionary)) return maybe; | 11240 if (!maybe->To(&new_dictionary)) return maybe; |
11261 if (*dictionary != SeededNumberDictionary::cast(new_dictionary)) { | 11241 if (*dictionary != SeededNumberDictionary::cast(new_dictionary)) { |
11262 if (is_arguments) { | 11242 if (is_arguments) { |
11263 elements->set(1, new_dictionary); | 11243 elements->set(1, new_dictionary); |
11264 } else { | 11244 } else { |
11265 self->set_elements(new_dictionary); | 11245 self->set_elements(new_dictionary); |
11266 } | 11246 } |
11267 dictionary = | 11247 dictionary = |
11268 handle(SeededNumberDictionary::cast(new_dictionary), isolate); | 11248 handle(SeededNumberDictionary::cast(new_dictionary), isolate); |
(...skipping 1973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13242 // Adding an entry with the key beyond smi-range requires | 13222 // Adding an entry with the key beyond smi-range requires |
13243 // allocation. Bailout. | 13223 // allocation. Bailout. |
13244 return Smi::FromInt(-1); | 13224 return Smi::FromInt(-1); |
13245 } | 13225 } |
13246 new_dict->AddNumberEntry(key, value, details)->ToObjectUnchecked(); | 13226 new_dict->AddNumberEntry(key, value, details)->ToObjectUnchecked(); |
13247 } | 13227 } |
13248 } | 13228 } |
13249 } | 13229 } |
13250 | 13230 |
13251 uint32_t result = pos; | 13231 uint32_t result = pos; |
13252 PropertyDetails no_details = PropertyDetails( | 13232 PropertyDetails no_details = PropertyDetails(NONE, NORMAL, 0); |
13253 NONE, NORMAL, Representation::None()); | |
13254 Heap* heap = GetHeap(); | 13233 Heap* heap = GetHeap(); |
13255 while (undefs > 0) { | 13234 while (undefs > 0) { |
13256 if (pos > static_cast<uint32_t>(Smi::kMaxValue)) { | 13235 if (pos > static_cast<uint32_t>(Smi::kMaxValue)) { |
13257 // Adding an entry with the key beyond smi-range requires | 13236 // Adding an entry with the key beyond smi-range requires |
13258 // allocation. Bailout. | 13237 // allocation. Bailout. |
13259 return Smi::FromInt(-1); | 13238 return Smi::FromInt(-1); |
13260 } | 13239 } |
13261 new_dict->AddNumberEntry(pos, heap->undefined_value(), no_details)-> | 13240 new_dict->AddNumberEntry(pos, heap->undefined_value(), no_details)-> |
13262 ToObjectUnchecked(); | 13241 ToObjectUnchecked(); |
13263 pos++; | 13242 pos++; |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13626 MaybeObject* GlobalObject::EnsurePropertyCell(Name* name) { | 13605 MaybeObject* GlobalObject::EnsurePropertyCell(Name* name) { |
13627 ASSERT(!HasFastProperties()); | 13606 ASSERT(!HasFastProperties()); |
13628 int entry = property_dictionary()->FindEntry(name); | 13607 int entry = property_dictionary()->FindEntry(name); |
13629 if (entry == NameDictionary::kNotFound) { | 13608 if (entry == NameDictionary::kNotFound) { |
13630 Heap* heap = GetHeap(); | 13609 Heap* heap = GetHeap(); |
13631 Object* cell; | 13610 Object* cell; |
13632 { MaybeObject* maybe_cell = | 13611 { MaybeObject* maybe_cell = |
13633 heap->AllocateJSGlobalPropertyCell(heap->the_hole_value()); | 13612 heap->AllocateJSGlobalPropertyCell(heap->the_hole_value()); |
13634 if (!maybe_cell->ToObject(&cell)) return maybe_cell; | 13613 if (!maybe_cell->ToObject(&cell)) return maybe_cell; |
13635 } | 13614 } |
13636 PropertyDetails details(NONE, NORMAL, Representation::None()); | 13615 PropertyDetails details(NONE, NORMAL, 0); |
13637 details = details.AsDeleted(); | 13616 details = details.AsDeleted(); |
13638 Object* dictionary; | 13617 Object* dictionary; |
13639 { MaybeObject* maybe_dictionary = | 13618 { MaybeObject* maybe_dictionary = |
13640 property_dictionary()->Add(name, cell, details); | 13619 property_dictionary()->Add(name, cell, details); |
13641 if (!maybe_dictionary->ToObject(&dictionary)) return maybe_dictionary; | 13620 if (!maybe_dictionary->ToObject(&dictionary)) return maybe_dictionary; |
13642 } | 13621 } |
13643 set_properties(NameDictionary::cast(dictionary)); | 13622 set_properties(NameDictionary::cast(dictionary)); |
13644 return cell; | 13623 return cell; |
13645 } else { | 13624 } else { |
13646 Object* value = property_dictionary()->ValueAt(entry); | 13625 Object* value = property_dictionary()->ValueAt(entry); |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14069 } | 14048 } |
14070 | 14049 |
14071 // Update the dictionary with new indices. | 14050 // Update the dictionary with new indices. |
14072 capacity = HashTable<Shape, Key>::Capacity(); | 14051 capacity = HashTable<Shape, Key>::Capacity(); |
14073 pos = 0; | 14052 pos = 0; |
14074 for (int i = 0; i < capacity; i++) { | 14053 for (int i = 0; i < capacity; i++) { |
14075 if (Dictionary<Shape, Key>::IsKey(Dictionary<Shape, Key>::KeyAt(i))) { | 14054 if (Dictionary<Shape, Key>::IsKey(Dictionary<Shape, Key>::KeyAt(i))) { |
14076 int enum_index = Smi::cast(enumeration_order->get(pos++))->value(); | 14055 int enum_index = Smi::cast(enumeration_order->get(pos++))->value(); |
14077 PropertyDetails details = DetailsAt(i); | 14056 PropertyDetails details = DetailsAt(i); |
14078 PropertyDetails new_details = PropertyDetails( | 14057 PropertyDetails new_details = PropertyDetails( |
14079 details.attributes(), details.type(), | 14058 details.attributes(), details.type(), enum_index); |
14080 Representation::None(), enum_index); | |
14081 DetailsAtPut(i, new_details); | 14059 DetailsAtPut(i, new_details); |
14082 } | 14060 } |
14083 } | 14061 } |
14084 | 14062 |
14085 // Set the next enumeration index. | 14063 // Set the next enumeration index. |
14086 SetNextEnumerationIndex(PropertyDetails::kInitialIndex+length); | 14064 SetNextEnumerationIndex(PropertyDetails::kInitialIndex+length); |
14087 return this; | 14065 return this; |
14088 } | 14066 } |
14089 | 14067 |
14090 template<typename Shape, typename Key> | 14068 template<typename Shape, typename Key> |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14136 // Check whether the dictionary should be extended. | 14114 // Check whether the dictionary should be extended. |
14137 Object* obj; | 14115 Object* obj; |
14138 { MaybeObject* maybe_obj = EnsureCapacity(1, key); | 14116 { MaybeObject* maybe_obj = EnsureCapacity(1, key); |
14139 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 14117 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
14140 } | 14118 } |
14141 | 14119 |
14142 Object* k; | 14120 Object* k; |
14143 { MaybeObject* maybe_k = Shape::AsObject(this->GetHeap(), key); | 14121 { MaybeObject* maybe_k = Shape::AsObject(this->GetHeap(), key); |
14144 if (!maybe_k->ToObject(&k)) return maybe_k; | 14122 if (!maybe_k->ToObject(&k)) return maybe_k; |
14145 } | 14123 } |
14146 PropertyDetails details = PropertyDetails( | 14124 PropertyDetails details = PropertyDetails(NONE, NORMAL, 0); |
14147 NONE, NORMAL, Representation::None()); | |
14148 | 14125 |
14149 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, | 14126 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, |
14150 Dictionary<Shape, Key>::Hash(key)); | 14127 Dictionary<Shape, Key>::Hash(key)); |
14151 } | 14128 } |
14152 | 14129 |
14153 | 14130 |
14154 template<typename Shape, typename Key> | 14131 template<typename Shape, typename Key> |
14155 MaybeObject* Dictionary<Shape, Key>::Add(Key key, | 14132 MaybeObject* Dictionary<Shape, Key>::Add(Key key, |
14156 Object* value, | 14133 Object* value, |
14157 PropertyDetails details) { | 14134 PropertyDetails details) { |
14158 ASSERT(details.dictionary_index() == details.descriptor_index()); | |
14159 | |
14160 // Valdate key is absent. | 14135 // Valdate key is absent. |
14161 SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound)); | 14136 SLOW_ASSERT((this->FindEntry(key) == Dictionary<Shape, Key>::kNotFound)); |
14162 // Check whether the dictionary should be extended. | 14137 // Check whether the dictionary should be extended. |
14163 Object* obj; | 14138 Object* obj; |
14164 { MaybeObject* maybe_obj = EnsureCapacity(1, key); | 14139 { MaybeObject* maybe_obj = EnsureCapacity(1, key); |
14165 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 14140 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
14166 } | 14141 } |
14167 | 14142 |
14168 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, | 14143 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, |
14169 Dictionary<Shape, Key>::Hash(key)); | 14144 Dictionary<Shape, Key>::Hash(key)); |
(...skipping 13 matching lines...) Expand all Loading... |
14183 } | 14158 } |
14184 | 14159 |
14185 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); | 14160 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); |
14186 // Insert element at empty or deleted entry | 14161 // Insert element at empty or deleted entry |
14187 if (!details.IsDeleted() && | 14162 if (!details.IsDeleted() && |
14188 details.dictionary_index() == 0 && | 14163 details.dictionary_index() == 0 && |
14189 Shape::kIsEnumerable) { | 14164 Shape::kIsEnumerable) { |
14190 // Assign an enumeration index to the property and update | 14165 // Assign an enumeration index to the property and update |
14191 // SetNextEnumerationIndex. | 14166 // SetNextEnumerationIndex. |
14192 int index = NextEnumerationIndex(); | 14167 int index = NextEnumerationIndex(); |
14193 details = PropertyDetails(details.attributes(), details.type(), | 14168 details = PropertyDetails(details.attributes(), details.type(), index); |
14194 Representation::None(), index); | |
14195 SetNextEnumerationIndex(index + 1); | 14169 SetNextEnumerationIndex(index + 1); |
14196 } | 14170 } |
14197 SetEntry(entry, k, value, details); | 14171 SetEntry(entry, k, value, details); |
14198 ASSERT((Dictionary<Shape, Key>::KeyAt(entry)->IsNumber() || | 14172 ASSERT((Dictionary<Shape, Key>::KeyAt(entry)->IsNumber() || |
14199 Dictionary<Shape, Key>::KeyAt(entry)->IsName())); | 14173 Dictionary<Shape, Key>::KeyAt(entry)->IsName())); |
14200 HashTable<Shape, Key>::ElementAdded(); | 14174 HashTable<Shape, Key>::ElementAdded(); |
14201 return this; | 14175 return this; |
14202 } | 14176 } |
14203 | 14177 |
14204 | 14178 |
(...skipping 21 matching lines...) Expand all Loading... |
14226 PropertyDetails details) { | 14200 PropertyDetails details) { |
14227 UpdateMaxNumberKey(key); | 14201 UpdateMaxNumberKey(key); |
14228 SLOW_ASSERT(this->FindEntry(key) == kNotFound); | 14202 SLOW_ASSERT(this->FindEntry(key) == kNotFound); |
14229 return Add(key, value, details); | 14203 return Add(key, value, details); |
14230 } | 14204 } |
14231 | 14205 |
14232 | 14206 |
14233 MaybeObject* UnseededNumberDictionary::AddNumberEntry(uint32_t key, | 14207 MaybeObject* UnseededNumberDictionary::AddNumberEntry(uint32_t key, |
14234 Object* value) { | 14208 Object* value) { |
14235 SLOW_ASSERT(this->FindEntry(key) == kNotFound); | 14209 SLOW_ASSERT(this->FindEntry(key) == kNotFound); |
14236 return Add(key, value, PropertyDetails(NONE, NORMAL, Representation::None())); | 14210 return Add(key, value, PropertyDetails(NONE, NORMAL, 0)); |
14237 } | 14211 } |
14238 | 14212 |
14239 | 14213 |
14240 MaybeObject* SeededNumberDictionary::AtNumberPut(uint32_t key, Object* value) { | 14214 MaybeObject* SeededNumberDictionary::AtNumberPut(uint32_t key, Object* value) { |
14241 UpdateMaxNumberKey(key); | 14215 UpdateMaxNumberKey(key); |
14242 return AtPut(key, value); | 14216 return AtPut(key, value); |
14243 } | 14217 } |
14244 | 14218 |
14245 | 14219 |
14246 MaybeObject* UnseededNumberDictionary::AtNumberPut(uint32_t key, | 14220 MaybeObject* UnseededNumberDictionary::AtNumberPut(uint32_t key, |
(...skipping 24 matching lines...) Expand all Loading... |
14271 | 14245 |
14272 | 14246 |
14273 MaybeObject* SeededNumberDictionary::Set(uint32_t key, | 14247 MaybeObject* SeededNumberDictionary::Set(uint32_t key, |
14274 Object* value, | 14248 Object* value, |
14275 PropertyDetails details) { | 14249 PropertyDetails details) { |
14276 int entry = FindEntry(key); | 14250 int entry = FindEntry(key); |
14277 if (entry == kNotFound) return AddNumberEntry(key, value, details); | 14251 if (entry == kNotFound) return AddNumberEntry(key, value, details); |
14278 // Preserve enumeration index. | 14252 // Preserve enumeration index. |
14279 details = PropertyDetails(details.attributes(), | 14253 details = PropertyDetails(details.attributes(), |
14280 details.type(), | 14254 details.type(), |
14281 Representation::None(), | |
14282 DetailsAt(entry).dictionary_index()); | 14255 DetailsAt(entry).dictionary_index()); |
14283 MaybeObject* maybe_object_key = | 14256 MaybeObject* maybe_object_key = |
14284 SeededNumberDictionaryShape::AsObject(GetHeap(), key); | 14257 SeededNumberDictionaryShape::AsObject(GetHeap(), key); |
14285 Object* object_key; | 14258 Object* object_key; |
14286 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; | 14259 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; |
14287 SetEntry(entry, object_key, value, details); | 14260 SetEntry(entry, object_key, value, details); |
14288 return this; | 14261 return this; |
14289 } | 14262 } |
14290 | 14263 |
14291 | 14264 |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14524 if (k->IsSymbol()) { | 14497 if (k->IsSymbol()) { |
14525 key = Symbol::cast(k); | 14498 key = Symbol::cast(k); |
14526 } else { | 14499 } else { |
14527 // Ensure the key is a unique name before writing into the | 14500 // Ensure the key is a unique name before writing into the |
14528 // instance descriptor. | 14501 // instance descriptor. |
14529 MaybeObject* maybe_key = heap->InternalizeString(String::cast(k)); | 14502 MaybeObject* maybe_key = heap->InternalizeString(String::cast(k)); |
14530 if (!maybe_key->To(&key)) return maybe_key; | 14503 if (!maybe_key->To(&key)) return maybe_key; |
14531 } | 14504 } |
14532 | 14505 |
14533 PropertyDetails details = DetailsAt(i); | 14506 PropertyDetails details = DetailsAt(i); |
14534 ASSERT(details.descriptor_index() == details.dictionary_index()); | 14507 int enumeration_index = details.dictionary_index(); |
14535 int enumeration_index = details.descriptor_index(); | |
14536 PropertyType type = details.type(); | 14508 PropertyType type = details.type(); |
14537 | 14509 |
14538 if (value->IsJSFunction()) { | 14510 if (value->IsJSFunction()) { |
14539 ConstantFunctionDescriptor d(key, | 14511 ConstantFunctionDescriptor d(key, |
14540 JSFunction::cast(value), | 14512 JSFunction::cast(value), |
14541 details.attributes(), | 14513 details.attributes()); |
14542 enumeration_index); | |
14543 descriptors->Set(enumeration_index - 1, &d, witness); | 14514 descriptors->Set(enumeration_index - 1, &d, witness); |
14544 } else if (type == NORMAL) { | 14515 } else if (type == NORMAL) { |
14545 if (current_offset < inobject_props) { | 14516 if (current_offset < inobject_props) { |
14546 obj->InObjectPropertyAtPut(current_offset, | 14517 obj->InObjectPropertyAtPut(current_offset, |
14547 value, | 14518 value, |
14548 UPDATE_WRITE_BARRIER); | 14519 UPDATE_WRITE_BARRIER); |
14549 } else { | 14520 } else { |
14550 int offset = current_offset - inobject_props; | 14521 int offset = current_offset - inobject_props; |
14551 fields->set(offset, value); | 14522 fields->set(offset, value); |
14552 } | 14523 } |
14553 FieldDescriptor d(key, | 14524 FieldDescriptor d(key, |
14554 current_offset++, | 14525 current_offset++, |
14555 details.attributes(), | 14526 details.attributes(), |
14556 // TODO(verwaest): value->OptimalRepresentation(); | 14527 // TODO(verwaest): value->OptimalRepresentation(); |
14557 Representation::Tagged(), | 14528 Representation::Tagged()); |
14558 enumeration_index); | |
14559 descriptors->Set(enumeration_index - 1, &d, witness); | 14529 descriptors->Set(enumeration_index - 1, &d, witness); |
14560 } else if (type == CALLBACKS) { | 14530 } else if (type == CALLBACKS) { |
14561 CallbacksDescriptor d(key, | 14531 CallbacksDescriptor d(key, |
14562 value, | 14532 value, |
14563 details.attributes(), | 14533 details.attributes()); |
14564 enumeration_index); | |
14565 descriptors->Set(enumeration_index - 1, &d, witness); | 14534 descriptors->Set(enumeration_index - 1, &d, witness); |
14566 } else { | 14535 } else { |
14567 UNREACHABLE(); | 14536 UNREACHABLE(); |
14568 } | 14537 } |
14569 } | 14538 } |
14570 } | 14539 } |
14571 ASSERT(current_offset == number_of_fields); | 14540 ASSERT(current_offset == number_of_fields); |
14572 | 14541 |
14573 descriptors->Sort(); | 14542 descriptors->Sort(); |
14574 | 14543 |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15139 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 15108 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
15140 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 15109 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
15141 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 15110 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
15142 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 15111 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
15143 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 15112 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
15144 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 15113 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
15145 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 15114 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
15146 } | 15115 } |
15147 | 15116 |
15148 } } // namespace v8::internal | 15117 } } // namespace v8::internal |
OLD | NEW |