| 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 3707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3718 | 3718 |
| 3719 // Allocate new content. | 3719 // Allocate new content. |
| 3720 int real_size = map_of_this->NumberOfOwnDescriptors(); | 3720 int real_size = map_of_this->NumberOfOwnDescriptors(); |
| 3721 int property_count = real_size; | 3721 int property_count = real_size; |
| 3722 if (expected_additional_properties > 0) { | 3722 if (expected_additional_properties > 0) { |
| 3723 property_count += expected_additional_properties; | 3723 property_count += expected_additional_properties; |
| 3724 } else { | 3724 } else { |
| 3725 property_count += 2; // Make space for two more properties. | 3725 property_count += 2; // Make space for two more properties. |
| 3726 } | 3726 } |
| 3727 NameDictionary* dictionary; | 3727 NameDictionary* dictionary; |
| 3728 MaybeObject* maybe_dictionary = NameDictionary::Allocate(property_count); | 3728 MaybeObject* maybe_dictionary = |
| 3729 NameDictionary::Allocate(GetHeap(), property_count); |
| 3729 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; | 3730 if (!maybe_dictionary->To(&dictionary)) return maybe_dictionary; |
| 3730 | 3731 |
| 3731 DescriptorArray* descs = map_of_this->instance_descriptors(); | 3732 DescriptorArray* descs = map_of_this->instance_descriptors(); |
| 3732 for (int i = 0; i < real_size; i++) { | 3733 for (int i = 0; i < real_size; i++) { |
| 3733 PropertyDetails details = descs->GetDetails(i); | 3734 PropertyDetails details = descs->GetDetails(i); |
| 3734 switch (details.type()) { | 3735 switch (details.type()) { |
| 3735 case CONSTANT_FUNCTION: { | 3736 case CONSTANT_FUNCTION: { |
| 3736 PropertyDetails d = PropertyDetails(details.attributes(), | 3737 PropertyDetails d = PropertyDetails(details.attributes(), |
| 3737 NORMAL, | 3738 NORMAL, |
| 3738 details.descriptor_index()); | 3739 details.descriptor_index()); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3856 HasFastArgumentsElements()); | 3857 HasFastArgumentsElements()); |
| 3857 // Compute the effective length and allocate a new backing store. | 3858 // Compute the effective length and allocate a new backing store. |
| 3858 int length = IsJSArray() | 3859 int length = IsJSArray() |
| 3859 ? Smi::cast(JSArray::cast(this)->length())->value() | 3860 ? Smi::cast(JSArray::cast(this)->length())->value() |
| 3860 : array->length(); | 3861 : array->length(); |
| 3861 int old_capacity = 0; | 3862 int old_capacity = 0; |
| 3862 int used_elements = 0; | 3863 int used_elements = 0; |
| 3863 GetElementsCapacityAndUsage(&old_capacity, &used_elements); | 3864 GetElementsCapacityAndUsage(&old_capacity, &used_elements); |
| 3864 SeededNumberDictionary* dictionary = NULL; | 3865 SeededNumberDictionary* dictionary = NULL; |
| 3865 { Object* object; | 3866 { Object* object; |
| 3866 MaybeObject* maybe = SeededNumberDictionary::Allocate(used_elements); | 3867 MaybeObject* maybe = |
| 3868 SeededNumberDictionary::Allocate(GetHeap(), used_elements); |
| 3867 if (!maybe->ToObject(&object)) return maybe; | 3869 if (!maybe->ToObject(&object)) return maybe; |
| 3868 dictionary = SeededNumberDictionary::cast(object); | 3870 dictionary = SeededNumberDictionary::cast(object); |
| 3869 } | 3871 } |
| 3870 | 3872 |
| 3871 // Copy the elements to the new backing store. | 3873 // Copy the elements to the new backing store. |
| 3872 bool has_double_elements = array->IsFixedDoubleArray(); | 3874 bool has_double_elements = array->IsFixedDoubleArray(); |
| 3873 for (int i = 0; i < length; i++) { | 3875 for (int i = 0; i < length; i++) { |
| 3874 Object* value = NULL; | 3876 Object* value = NULL; |
| 3875 if (has_double_elements) { | 3877 if (has_double_elements) { |
| 3876 FixedDoubleArray* double_array = FixedDoubleArray::cast(array); | 3878 FixedDoubleArray* double_array = FixedDoubleArray::cast(array); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4142 } | 4144 } |
| 4143 | 4145 |
| 4144 if (init_option == ONLY_RETURN_INLINE_VALUE || | 4146 if (init_option == ONLY_RETURN_INLINE_VALUE || |
| 4145 inline_value->IsHashTable()) { | 4147 inline_value->IsHashTable()) { |
| 4146 return inline_value; | 4148 return inline_value; |
| 4147 } | 4149 } |
| 4148 | 4150 |
| 4149 ObjectHashTable* hashtable; | 4151 ObjectHashTable* hashtable; |
| 4150 static const int kInitialCapacity = 4; | 4152 static const int kInitialCapacity = 4; |
| 4151 MaybeObject* maybe_obj = | 4153 MaybeObject* maybe_obj = |
| 4152 ObjectHashTable::Allocate(kInitialCapacity, | 4154 ObjectHashTable::Allocate(GetHeap(), |
| 4155 kInitialCapacity, |
| 4153 ObjectHashTable::USE_CUSTOM_MINIMUM_CAPACITY); | 4156 ObjectHashTable::USE_CUSTOM_MINIMUM_CAPACITY); |
| 4154 if (!maybe_obj->To<ObjectHashTable>(&hashtable)) return maybe_obj; | 4157 if (!maybe_obj->To<ObjectHashTable>(&hashtable)) return maybe_obj; |
| 4155 | 4158 |
| 4156 if (inline_value->IsSmi()) { | 4159 if (inline_value->IsSmi()) { |
| 4157 // We were storing the identity hash inline and now allocated an actual | 4160 // We were storing the identity hash inline and now allocated an actual |
| 4158 // dictionary. Put the identity hash into the new dictionary. | 4161 // dictionary. Put the identity hash into the new dictionary. |
| 4159 MaybeObject* insert_result = | 4162 MaybeObject* insert_result = |
| 4160 hashtable->Put(GetHeap()->identity_hash_string(), inline_value); | 4163 hashtable->Put(GetHeap()->identity_hash_string(), inline_value); |
| 4161 ObjectHashTable* new_table; | 4164 ObjectHashTable* new_table; |
| 4162 if (!insert_result->To(&new_table)) return insert_result; | 4165 if (!insert_result->To(&new_table)) return insert_result; |
| (...skipping 1866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6029 | 6032 |
| 6030 MaybeObject* CodeCache::Update(Name* name, Code* code) { | 6033 MaybeObject* CodeCache::Update(Name* name, Code* code) { |
| 6031 // The number of monomorphic stubs for normal load/store/call IC's can grow to | 6034 // The number of monomorphic stubs for normal load/store/call IC's can grow to |
| 6032 // a large number and therefore they need to go into a hash table. They are | 6035 // a large number and therefore they need to go into a hash table. They are |
| 6033 // used to load global properties from cells. | 6036 // used to load global properties from cells. |
| 6034 if (code->type() == Code::NORMAL) { | 6037 if (code->type() == Code::NORMAL) { |
| 6035 // Make sure that a hash table is allocated for the normal load code cache. | 6038 // Make sure that a hash table is allocated for the normal load code cache. |
| 6036 if (normal_type_cache()->IsUndefined()) { | 6039 if (normal_type_cache()->IsUndefined()) { |
| 6037 Object* result; | 6040 Object* result; |
| 6038 { MaybeObject* maybe_result = | 6041 { MaybeObject* maybe_result = |
| 6039 CodeCacheHashTable::Allocate(CodeCacheHashTable::kInitialSize); | 6042 CodeCacheHashTable::Allocate(GetHeap(), |
| 6043 CodeCacheHashTable::kInitialSize); |
| 6040 if (!maybe_result->ToObject(&result)) return maybe_result; | 6044 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 6041 } | 6045 } |
| 6042 set_normal_type_cache(result); | 6046 set_normal_type_cache(result); |
| 6043 } | 6047 } |
| 6044 return UpdateNormalTypeCache(name, code); | 6048 return UpdateNormalTypeCache(name, code); |
| 6045 } else { | 6049 } else { |
| 6046 ASSERT(default_cache()->IsFixedArray()); | 6050 ASSERT(default_cache()->IsFixedArray()); |
| 6047 return UpdateDefaultCache(name, code); | 6051 return UpdateDefaultCache(name, code); |
| 6048 } | 6052 } |
| 6049 } | 6053 } |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6310 | 6314 |
| 6311 | 6315 |
| 6312 MaybeObject* PolymorphicCodeCache::Update(MapHandleList* maps, | 6316 MaybeObject* PolymorphicCodeCache::Update(MapHandleList* maps, |
| 6313 Code::Flags flags, | 6317 Code::Flags flags, |
| 6314 Code* code) { | 6318 Code* code) { |
| 6315 // Initialize cache if necessary. | 6319 // Initialize cache if necessary. |
| 6316 if (cache()->IsUndefined()) { | 6320 if (cache()->IsUndefined()) { |
| 6317 Object* result; | 6321 Object* result; |
| 6318 { MaybeObject* maybe_result = | 6322 { MaybeObject* maybe_result = |
| 6319 PolymorphicCodeCacheHashTable::Allocate( | 6323 PolymorphicCodeCacheHashTable::Allocate( |
| 6324 GetHeap(), |
| 6320 PolymorphicCodeCacheHashTable::kInitialSize); | 6325 PolymorphicCodeCacheHashTable::kInitialSize); |
| 6321 if (!maybe_result->ToObject(&result)) return maybe_result; | 6326 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 6322 } | 6327 } |
| 6323 set_cache(result); | 6328 set_cache(result); |
| 6324 } else { | 6329 } else { |
| 6325 // This entry shouldn't be contained in the cache yet. | 6330 // This entry shouldn't be contained in the cache yet. |
| 6326 ASSERT(PolymorphicCodeCacheHashTable::cast(cache()) | 6331 ASSERT(PolymorphicCodeCacheHashTable::cast(cache()) |
| 6327 ->Lookup(maps, flags)->IsUndefined()); | 6332 ->Lookup(maps, flags)->IsUndefined()); |
| 6328 } | 6333 } |
| 6329 PolymorphicCodeCacheHashTable* hash_table = | 6334 PolymorphicCodeCacheHashTable* hash_table = |
| (...skipping 5736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12066 | 12071 |
| 12067 template<typename Shape, typename Key> | 12072 template<typename Shape, typename Key> |
| 12068 void HashTable<Shape, Key>::IterateElements(ObjectVisitor* v) { | 12073 void HashTable<Shape, Key>::IterateElements(ObjectVisitor* v) { |
| 12069 IteratePointers(v, | 12074 IteratePointers(v, |
| 12070 kElementsStartOffset, | 12075 kElementsStartOffset, |
| 12071 kHeaderSize + length() * kPointerSize); | 12076 kHeaderSize + length() * kPointerSize); |
| 12072 } | 12077 } |
| 12073 | 12078 |
| 12074 | 12079 |
| 12075 template<typename Shape, typename Key> | 12080 template<typename Shape, typename Key> |
| 12076 MaybeObject* HashTable<Shape, Key>::Allocate(int at_least_space_for, | 12081 MaybeObject* HashTable<Shape, Key>::Allocate(Heap* heap, |
| 12082 int at_least_space_for, |
| 12077 MinimumCapacity capacity_option, | 12083 MinimumCapacity capacity_option, |
| 12078 PretenureFlag pretenure) { | 12084 PretenureFlag pretenure) { |
| 12079 ASSERT(!capacity_option || IS_POWER_OF_TWO(at_least_space_for)); | 12085 ASSERT(!capacity_option || IS_POWER_OF_TWO(at_least_space_for)); |
| 12080 int capacity = (capacity_option == USE_CUSTOM_MINIMUM_CAPACITY) | 12086 int capacity = (capacity_option == USE_CUSTOM_MINIMUM_CAPACITY) |
| 12081 ? at_least_space_for | 12087 ? at_least_space_for |
| 12082 : ComputeCapacity(at_least_space_for); | 12088 : ComputeCapacity(at_least_space_for); |
| 12083 if (capacity > HashTable::kMaxCapacity) { | 12089 if (capacity > HashTable::kMaxCapacity) { |
| 12084 return Failure::OutOfMemoryException(0x10); | 12090 return Failure::OutOfMemoryException(0x10); |
| 12085 } | 12091 } |
| 12086 | 12092 |
| 12087 Object* obj; | 12093 Object* obj; |
| 12088 { MaybeObject* maybe_obj = Isolate::Current()->heap()-> | 12094 { MaybeObject* maybe_obj = |
| 12089 AllocateHashTable(EntryToIndex(capacity), pretenure); | 12095 heap-> AllocateHashTable(EntryToIndex(capacity), pretenure); |
| 12090 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 12096 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 12091 } | 12097 } |
| 12092 HashTable::cast(obj)->SetNumberOfElements(0); | 12098 HashTable::cast(obj)->SetNumberOfElements(0); |
| 12093 HashTable::cast(obj)->SetNumberOfDeletedElements(0); | 12099 HashTable::cast(obj)->SetNumberOfDeletedElements(0); |
| 12094 HashTable::cast(obj)->SetCapacity(capacity); | 12100 HashTable::cast(obj)->SetCapacity(capacity); |
| 12095 return obj; | 12101 return obj; |
| 12096 } | 12102 } |
| 12097 | 12103 |
| 12098 | 12104 |
| 12099 // Find entry for key otherwise return kNotFound. | 12105 // Find entry for key otherwise return kNotFound. |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12181 if (nod <= (capacity - nof) >> 1) { | 12187 if (nod <= (capacity - nof) >> 1) { |
| 12182 int needed_free = nof >> 1; | 12188 int needed_free = nof >> 1; |
| 12183 if (nof + needed_free <= capacity) return this; | 12189 if (nof + needed_free <= capacity) return this; |
| 12184 } | 12190 } |
| 12185 | 12191 |
| 12186 const int kMinCapacityForPretenure = 256; | 12192 const int kMinCapacityForPretenure = 256; |
| 12187 bool pretenure = | 12193 bool pretenure = |
| 12188 (capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this); | 12194 (capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this); |
| 12189 Object* obj; | 12195 Object* obj; |
| 12190 { MaybeObject* maybe_obj = | 12196 { MaybeObject* maybe_obj = |
| 12191 Allocate(nof * 2, | 12197 Allocate(GetHeap(), |
| 12198 nof * 2, |
| 12192 USE_DEFAULT_MINIMUM_CAPACITY, | 12199 USE_DEFAULT_MINIMUM_CAPACITY, |
| 12193 pretenure ? TENURED : NOT_TENURED); | 12200 pretenure ? TENURED : NOT_TENURED); |
| 12194 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 12201 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 12195 } | 12202 } |
| 12196 | 12203 |
| 12197 return Rehash(HashTable::cast(obj), key); | 12204 return Rehash(HashTable::cast(obj), key); |
| 12198 } | 12205 } |
| 12199 | 12206 |
| 12200 | 12207 |
| 12201 template<typename Shape, typename Key> | 12208 template<typename Shape, typename Key> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 12212 // lower than room for 16 elements. | 12219 // lower than room for 16 elements. |
| 12213 int at_least_room_for = nof; | 12220 int at_least_room_for = nof; |
| 12214 if (at_least_room_for < 16) return this; | 12221 if (at_least_room_for < 16) return this; |
| 12215 | 12222 |
| 12216 const int kMinCapacityForPretenure = 256; | 12223 const int kMinCapacityForPretenure = 256; |
| 12217 bool pretenure = | 12224 bool pretenure = |
| 12218 (at_least_room_for > kMinCapacityForPretenure) && | 12225 (at_least_room_for > kMinCapacityForPretenure) && |
| 12219 !GetHeap()->InNewSpace(this); | 12226 !GetHeap()->InNewSpace(this); |
| 12220 Object* obj; | 12227 Object* obj; |
| 12221 { MaybeObject* maybe_obj = | 12228 { MaybeObject* maybe_obj = |
| 12222 Allocate(at_least_room_for, | 12229 Allocate(GetHeap(), |
| 12230 at_least_room_for, |
| 12223 USE_DEFAULT_MINIMUM_CAPACITY, | 12231 USE_DEFAULT_MINIMUM_CAPACITY, |
| 12224 pretenure ? TENURED : NOT_TENURED); | 12232 pretenure ? TENURED : NOT_TENURED); |
| 12225 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 12233 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 12226 } | 12234 } |
| 12227 | 12235 |
| 12228 return Rehash(HashTable::cast(obj), key); | 12236 return Rehash(HashTable::cast(obj), key); |
| 12229 } | 12237 } |
| 12230 | 12238 |
| 12231 | 12239 |
| 12232 template<typename Shape, typename Key> | 12240 template<typename Shape, typename Key> |
| (...skipping 23 matching lines...) Expand all Loading... |
| 12256 | 12264 |
| 12257 template class HashTable<ObjectHashTableShape<2>, Object*>; | 12265 template class HashTable<ObjectHashTableShape<2>, Object*>; |
| 12258 | 12266 |
| 12259 template class Dictionary<NameDictionaryShape, Name*>; | 12267 template class Dictionary<NameDictionaryShape, Name*>; |
| 12260 | 12268 |
| 12261 template class Dictionary<SeededNumberDictionaryShape, uint32_t>; | 12269 template class Dictionary<SeededNumberDictionaryShape, uint32_t>; |
| 12262 | 12270 |
| 12263 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>; | 12271 template class Dictionary<UnseededNumberDictionaryShape, uint32_t>; |
| 12264 | 12272 |
| 12265 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: | 12273 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
| 12266 Allocate(int at_least_space_for); | 12274 Allocate(Heap* heap, int at_least_space_for); |
| 12267 | 12275 |
| 12268 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: | 12276 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
| 12269 Allocate(int at_least_space_for); | 12277 Allocate(Heap* heap, int at_least_space_for); |
| 12270 | 12278 |
| 12271 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Allocate(int n); | 12279 template MaybeObject* Dictionary<NameDictionaryShape, Name*>:: |
| 12280 Allocate(Heap* heap, int n); |
| 12272 | 12281 |
| 12273 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::AtPut( | 12282 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::AtPut( |
| 12274 uint32_t, Object*); | 12283 uint32_t, Object*); |
| 12275 | 12284 |
| 12276 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: | 12285 template MaybeObject* Dictionary<UnseededNumberDictionaryShape, uint32_t>:: |
| 12277 AtPut(uint32_t, Object*); | 12286 AtPut(uint32_t, Object*); |
| 12278 | 12287 |
| 12279 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: | 12288 template Object* Dictionary<SeededNumberDictionaryShape, uint32_t>:: |
| 12280 SlowReverseLookup(Object* value); | 12289 SlowReverseLookup(Object* value); |
| 12281 | 12290 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12367 // Allocate space for result before we start mutating the object. | 12376 // Allocate space for result before we start mutating the object. |
| 12368 Object* new_double; | 12377 Object* new_double; |
| 12369 { MaybeObject* maybe_new_double = GetHeap()->AllocateHeapNumber(0.0); | 12378 { MaybeObject* maybe_new_double = GetHeap()->AllocateHeapNumber(0.0); |
| 12370 if (!maybe_new_double->ToObject(&new_double)) return maybe_new_double; | 12379 if (!maybe_new_double->ToObject(&new_double)) return maybe_new_double; |
| 12371 } | 12380 } |
| 12372 result_double = HeapNumber::cast(new_double); | 12381 result_double = HeapNumber::cast(new_double); |
| 12373 } | 12382 } |
| 12374 | 12383 |
| 12375 Object* obj; | 12384 Object* obj; |
| 12376 { MaybeObject* maybe_obj = | 12385 { MaybeObject* maybe_obj = |
| 12377 SeededNumberDictionary::Allocate(dict->NumberOfElements()); | 12386 SeededNumberDictionary::Allocate(GetHeap(), dict->NumberOfElements()); |
| 12378 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 12387 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 12379 } | 12388 } |
| 12380 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj); | 12389 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj); |
| 12381 | 12390 |
| 12382 AssertNoAllocation no_alloc; | 12391 AssertNoAllocation no_alloc; |
| 12383 | 12392 |
| 12384 uint32_t pos = 0; | 12393 uint32_t pos = 0; |
| 12385 uint32_t undefs = 0; | 12394 uint32_t undefs = 0; |
| 12386 int capacity = dict->Capacity(); | 12395 int capacity = dict->Capacity(); |
| 12387 for (int i = 0; i < capacity; i++) { | 12396 for (int i = 0; i < capacity; i++) { |
| (...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13151 MapCache* cache = reinterpret_cast<MapCache*>(obj); | 13160 MapCache* cache = reinterpret_cast<MapCache*>(obj); |
| 13152 int entry = cache->FindInsertionEntry(key.Hash()); | 13161 int entry = cache->FindInsertionEntry(key.Hash()); |
| 13153 cache->set(EntryToIndex(entry), array); | 13162 cache->set(EntryToIndex(entry), array); |
| 13154 cache->set(EntryToIndex(entry) + 1, value); | 13163 cache->set(EntryToIndex(entry) + 1, value); |
| 13155 cache->ElementAdded(); | 13164 cache->ElementAdded(); |
| 13156 return cache; | 13165 return cache; |
| 13157 } | 13166 } |
| 13158 | 13167 |
| 13159 | 13168 |
| 13160 template<typename Shape, typename Key> | 13169 template<typename Shape, typename Key> |
| 13161 MaybeObject* Dictionary<Shape, Key>::Allocate(int at_least_space_for) { | 13170 MaybeObject* Dictionary<Shape, Key>::Allocate(Heap* heap, |
| 13171 int at_least_space_for) { |
| 13162 Object* obj; | 13172 Object* obj; |
| 13163 { MaybeObject* maybe_obj = | 13173 { MaybeObject* maybe_obj = |
| 13164 HashTable<Shape, Key>::Allocate(at_least_space_for); | 13174 HashTable<Shape, Key>::Allocate(heap, at_least_space_for); |
| 13165 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 13175 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 13166 } | 13176 } |
| 13167 // Initialize the next enumeration index. | 13177 // Initialize the next enumeration index. |
| 13168 Dictionary<Shape, Key>::cast(obj)-> | 13178 Dictionary<Shape, Key>::cast(obj)-> |
| 13169 SetNextEnumerationIndex(PropertyDetails::kInitialIndex); | 13179 SetNextEnumerationIndex(PropertyDetails::kInitialIndex); |
| 13170 return obj; | 13180 return obj; |
| 13171 } | 13181 } |
| 13172 | 13182 |
| 13173 | 13183 |
| 13174 void NameDictionary::DoGenerateNewEnumerationIndices( | 13184 void NameDictionary::DoGenerateNewEnumerationIndices( |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13282 return this; | 13292 return this; |
| 13283 } | 13293 } |
| 13284 | 13294 |
| 13285 // Check whether the dictionary should be extended. | 13295 // Check whether the dictionary should be extended. |
| 13286 Object* obj; | 13296 Object* obj; |
| 13287 { MaybeObject* maybe_obj = EnsureCapacity(1, key); | 13297 { MaybeObject* maybe_obj = EnsureCapacity(1, key); |
| 13288 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 13298 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| 13289 } | 13299 } |
| 13290 | 13300 |
| 13291 Object* k; | 13301 Object* k; |
| 13292 { MaybeObject* maybe_k = Shape::AsObject(key); | 13302 { MaybeObject* maybe_k = Shape::AsObject(this->GetIsolate(), key); |
| 13293 if (!maybe_k->ToObject(&k)) return maybe_k; | 13303 if (!maybe_k->ToObject(&k)) return maybe_k; |
| 13294 } | 13304 } |
| 13295 PropertyDetails details = PropertyDetails(NONE, NORMAL); | 13305 PropertyDetails details = PropertyDetails(NONE, NORMAL); |
| 13296 | 13306 |
| 13297 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, | 13307 return Dictionary<Shape, Key>::cast(obj)->AddEntry(key, value, details, |
| 13298 Dictionary<Shape, Key>::Hash(key)); | 13308 Dictionary<Shape, Key>::Hash(key)); |
| 13299 } | 13309 } |
| 13300 | 13310 |
| 13301 | 13311 |
| 13302 template<typename Shape, typename Key> | 13312 template<typename Shape, typename Key> |
| (...skipping 16 matching lines...) Expand all Loading... |
| 13319 | 13329 |
| 13320 | 13330 |
| 13321 // Add a key, value pair to the dictionary. | 13331 // Add a key, value pair to the dictionary. |
| 13322 template<typename Shape, typename Key> | 13332 template<typename Shape, typename Key> |
| 13323 MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key, | 13333 MaybeObject* Dictionary<Shape, Key>::AddEntry(Key key, |
| 13324 Object* value, | 13334 Object* value, |
| 13325 PropertyDetails details, | 13335 PropertyDetails details, |
| 13326 uint32_t hash) { | 13336 uint32_t hash) { |
| 13327 // Compute the key object. | 13337 // Compute the key object. |
| 13328 Object* k; | 13338 Object* k; |
| 13329 { MaybeObject* maybe_k = Shape::AsObject(key); | 13339 { MaybeObject* maybe_k = Shape::AsObject(this->GetIsolate(), key); |
| 13330 if (!maybe_k->ToObject(&k)) return maybe_k; | 13340 if (!maybe_k->ToObject(&k)) return maybe_k; |
| 13331 } | 13341 } |
| 13332 | 13342 |
| 13333 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); | 13343 uint32_t entry = Dictionary<Shape, Key>::FindInsertionEntry(hash); |
| 13334 // Insert element at empty or deleted entry | 13344 // Insert element at empty or deleted entry |
| 13335 if (!details.IsDeleted() && | 13345 if (!details.IsDeleted() && |
| 13336 details.dictionary_index() == 0 && | 13346 details.dictionary_index() == 0 && |
| 13337 Shape::kIsEnumerable) { | 13347 Shape::kIsEnumerable) { |
| 13338 // Assign an enumeration index to the property and update | 13348 // Assign an enumeration index to the property and update |
| 13339 // SetNextEnumerationIndex. | 13349 // SetNextEnumerationIndex. |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13419 | 13429 |
| 13420 MaybeObject* SeededNumberDictionary::Set(uint32_t key, | 13430 MaybeObject* SeededNumberDictionary::Set(uint32_t key, |
| 13421 Object* value, | 13431 Object* value, |
| 13422 PropertyDetails details) { | 13432 PropertyDetails details) { |
| 13423 int entry = FindEntry(key); | 13433 int entry = FindEntry(key); |
| 13424 if (entry == kNotFound) return AddNumberEntry(key, value, details); | 13434 if (entry == kNotFound) return AddNumberEntry(key, value, details); |
| 13425 // Preserve enumeration index. | 13435 // Preserve enumeration index. |
| 13426 details = PropertyDetails(details.attributes(), | 13436 details = PropertyDetails(details.attributes(), |
| 13427 details.type(), | 13437 details.type(), |
| 13428 DetailsAt(entry).dictionary_index()); | 13438 DetailsAt(entry).dictionary_index()); |
| 13429 MaybeObject* maybe_object_key = SeededNumberDictionaryShape::AsObject(key); | 13439 MaybeObject* maybe_object_key = |
| 13440 SeededNumberDictionaryShape::AsObject(GetIsolate(), key); |
| 13430 Object* object_key; | 13441 Object* object_key; |
| 13431 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; | 13442 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; |
| 13432 SetEntry(entry, object_key, value, details); | 13443 SetEntry(entry, object_key, value, details); |
| 13433 return this; | 13444 return this; |
| 13434 } | 13445 } |
| 13435 | 13446 |
| 13436 | 13447 |
| 13437 MaybeObject* UnseededNumberDictionary::Set(uint32_t key, | 13448 MaybeObject* UnseededNumberDictionary::Set(uint32_t key, |
| 13438 Object* value) { | 13449 Object* value) { |
| 13439 int entry = FindEntry(key); | 13450 int entry = FindEntry(key); |
| 13440 if (entry == kNotFound) return AddNumberEntry(key, value); | 13451 if (entry == kNotFound) return AddNumberEntry(key, value); |
| 13441 MaybeObject* maybe_object_key = UnseededNumberDictionaryShape::AsObject(key); | 13452 MaybeObject* maybe_object_key = |
| 13453 UnseededNumberDictionaryShape::AsObject(GetIsolate(), key); |
| 13442 Object* object_key; | 13454 Object* object_key; |
| 13443 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; | 13455 if (!maybe_object_key->ToObject(&object_key)) return maybe_object_key; |
| 13444 SetEntry(entry, object_key, value); | 13456 SetEntry(entry, object_key, value); |
| 13445 return this; | 13457 return this; |
| 13446 } | 13458 } |
| 13447 | 13459 |
| 13448 | 13460 |
| 13449 | 13461 |
| 13450 template<typename Shape, typename Key> | 13462 template<typename Shape, typename Key> |
| 13451 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( | 13463 int Dictionary<Shape, Key>::NumberOfElementsFilterAttributes( |
| (...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14279 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 14291 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 14280 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 14292 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 14281 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 14293 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 14282 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 14294 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 14283 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 14295 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 14284 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 14296 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 14285 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 14297 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 14286 } | 14298 } |
| 14287 | 14299 |
| 14288 } } // namespace v8::internal | 14300 } } // namespace v8::internal |
| OLD | NEW |