Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2183 | 2183 |
| 2184 // If |map| is contained in |maps_list|, returns |map|; otherwise returns NULL. | 2184 // If |map| is contained in |maps_list|, returns |map|; otherwise returns NULL. |
| 2185 static bool ContainsMap(MapList* maps_list, Map* map) { | 2185 static bool ContainsMap(MapList* maps_list, Map* map) { |
| 2186 for (int i = 0; i < maps_list->length(); ++i) { | 2186 for (int i = 0; i < maps_list->length(); ++i) { |
| 2187 if (maps_list->at(i) == map) return true; | 2187 if (maps_list->at(i) == map) return true; |
| 2188 } | 2188 } |
| 2189 return false; | 2189 return false; |
| 2190 } | 2190 } |
| 2191 | 2191 |
| 2192 | 2192 |
| 2193 Handle<Map> Map::FindTransitionedMap(MapHandleList* candidates) { | |
| 2194 MapList raw_candidates(candidates->length()); | |
| 2195 Map* result = FindTransitionedMap(UnwrapHandleList(&raw_candidates, | |
| 2196 candidates)); | |
| 2197 return (result == NULL) ? Handle<Map>::null() : Handle<Map>(result); | |
| 2198 } | |
| 2199 | |
| 2200 | |
| 2193 Map* Map::FindTransitionedMap(MapList* candidates) { | 2201 Map* Map::FindTransitionedMap(MapList* candidates) { |
| 2194 ElementsKind elms_kind = elements_kind(); | 2202 ElementsKind elms_kind = elements_kind(); |
| 2195 if (elms_kind == FAST_DOUBLE_ELEMENTS) { | 2203 if (elms_kind == FAST_DOUBLE_ELEMENTS) { |
| 2196 bool dummy = true; | 2204 bool dummy = true; |
| 2197 Map* fast_map = LookupElementsTransitionMap(FAST_ELEMENTS, &dummy); | 2205 Map* fast_map = LookupElementsTransitionMap(FAST_ELEMENTS, &dummy); |
| 2198 if (fast_map == NULL) return NULL; | 2206 if (fast_map == NULL) return NULL; |
| 2199 if (ContainsMap(candidates, fast_map)) return fast_map; | 2207 if (ContainsMap(candidates, fast_map)) return fast_map; |
| 2200 return NULL; | 2208 return NULL; |
| 2201 } | 2209 } |
| 2202 if (elms_kind == FAST_SMI_ONLY_ELEMENTS) { | 2210 if (elms_kind == FAST_SMI_ONLY_ELEMENTS) { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2390 MaybeObject* maybe_new_descriptors = | 2398 MaybeObject* maybe_new_descriptors = |
| 2391 instance_descriptors()->CopyInsert(&desc, KEEP_TRANSITIONS); | 2399 instance_descriptors()->CopyInsert(&desc, KEEP_TRANSITIONS); |
| 2392 if (!maybe_new_descriptors->ToObject(&new_descriptors)) { | 2400 if (!maybe_new_descriptors->ToObject(&new_descriptors)) { |
| 2393 return maybe_new_descriptors; | 2401 return maybe_new_descriptors; |
| 2394 } | 2402 } |
| 2395 set_instance_descriptors(DescriptorArray::cast(new_descriptors)); | 2403 set_instance_descriptors(DescriptorArray::cast(new_descriptors)); |
| 2396 return this; | 2404 return this; |
| 2397 } | 2405 } |
| 2398 | 2406 |
| 2399 | 2407 |
| 2408 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, | |
| 2409 ElementsKind to_kind) { | |
| 2410 Isolate* isolate = object->GetIsolate(); | |
| 2411 CALL_HEAP_FUNCTION(isolate, | |
| 2412 object->GetElementsTransitionMap(to_kind), | |
| 2413 Map); | |
| 2414 } | |
| 2415 | |
| 2416 | |
| 2400 MaybeObject* JSObject::GetElementsTransitionMap(ElementsKind to_kind) { | 2417 MaybeObject* JSObject::GetElementsTransitionMap(ElementsKind to_kind) { |
| 2401 Map* current_map = map(); | 2418 Map* current_map = map(); |
| 2402 ElementsKind from_kind = current_map->elements_kind(); | 2419 ElementsKind from_kind = current_map->elements_kind(); |
| 2403 | 2420 |
| 2404 if (from_kind == to_kind) return current_map; | 2421 if (from_kind == to_kind) return current_map; |
| 2405 | 2422 |
| 2406 // Only objects with FastProperties can have DescriptorArrays and can track | 2423 // Only objects with FastProperties can have DescriptorArrays and can track |
| 2407 // element-related maps. Also don't add descriptors to maps that are shared. | 2424 // element-related maps. Also don't add descriptors to maps that are shared. |
| 2408 bool safe_to_add_transition = HasFastProperties() && | 2425 bool safe_to_add_transition = HasFastProperties() && |
| 2409 !current_map->IsUndefined() && | 2426 !current_map->IsUndefined() && |
| (...skipping 2707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5117 | 5134 |
| 5118 void CodeCacheHashTable::RemoveByIndex(int index) { | 5135 void CodeCacheHashTable::RemoveByIndex(int index) { |
| 5119 ASSERT(index >= 0); | 5136 ASSERT(index >= 0); |
| 5120 Heap* heap = GetHeap(); | 5137 Heap* heap = GetHeap(); |
| 5121 set(EntryToIndex(index), heap->null_value()); | 5138 set(EntryToIndex(index), heap->null_value()); |
| 5122 set(EntryToIndex(index) + 1, heap->null_value()); | 5139 set(EntryToIndex(index) + 1, heap->null_value()); |
| 5123 ElementRemoved(); | 5140 ElementRemoved(); |
| 5124 } | 5141 } |
| 5125 | 5142 |
| 5126 | 5143 |
| 5144 void PolymorphicCodeCache::Update(Handle<PolymorphicCodeCache> cache, | |
| 5145 MapHandleList* maps, | |
| 5146 Code::Flags flags, | |
| 5147 Handle<Code> code) { | |
| 5148 Isolate* isolate = cache->GetIsolate(); | |
| 5149 List<Map*> raw_maps(maps->length()); | |
| 5150 CALL_HEAP_FUNCTION_VOID( | |
| 5151 isolate, | |
| 5152 (raw_maps.Clear(), | |
|
Kevin Millikin (Chromium)
2011/10/21 10:13:48
That's a bit annoying, but unavoidable. I suppose
| |
| 5153 cache->Update(UnwrapHandleList(&raw_maps, maps), flags, *code))); | |
| 5154 } | |
| 5155 | |
| 5156 | |
| 5127 MaybeObject* PolymorphicCodeCache::Update(MapList* maps, | 5157 MaybeObject* PolymorphicCodeCache::Update(MapList* maps, |
| 5128 Code::Flags flags, | 5158 Code::Flags flags, |
| 5129 Code* code) { | 5159 Code* code) { |
| 5130 // Initialize cache if necessary. | 5160 // Initialize cache if necessary. |
| 5131 if (cache()->IsUndefined()) { | 5161 if (cache()->IsUndefined()) { |
| 5132 Object* result; | 5162 Object* result; |
| 5133 { MaybeObject* maybe_result = | 5163 { MaybeObject* maybe_result = |
| 5134 PolymorphicCodeCacheHashTable::Allocate( | 5164 PolymorphicCodeCacheHashTable::Allocate( |
| 5135 PolymorphicCodeCacheHashTable::kInitialSize); | 5165 PolymorphicCodeCacheHashTable::kInitialSize); |
| 5136 if (!maybe_result->ToObject(&result)) return maybe_result; | 5166 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 5137 } | 5167 } |
| 5138 set_cache(result); | 5168 set_cache(result); |
| 5139 } else { | 5169 } else { |
| 5140 // This entry shouldn't be contained in the cache yet. | 5170 // This entry shouldn't be contained in the cache yet. |
| 5141 ASSERT(PolymorphicCodeCacheHashTable::cast(cache()) | 5171 ASSERT(PolymorphicCodeCacheHashTable::cast(cache()) |
| 5142 ->Lookup(maps, flags)->IsUndefined()); | 5172 ->Lookup(maps, flags)->IsUndefined()); |
| 5143 } | 5173 } |
| 5144 PolymorphicCodeCacheHashTable* hash_table = | 5174 PolymorphicCodeCacheHashTable* hash_table = |
| 5145 PolymorphicCodeCacheHashTable::cast(cache()); | 5175 PolymorphicCodeCacheHashTable::cast(cache()); |
| 5146 Object* new_cache; | 5176 Object* new_cache; |
| 5147 { MaybeObject* maybe_new_cache = hash_table->Put(maps, flags, code); | 5177 { MaybeObject* maybe_new_cache = hash_table->Put(maps, flags, code); |
| 5148 if (!maybe_new_cache->ToObject(&new_cache)) return maybe_new_cache; | 5178 if (!maybe_new_cache->ToObject(&new_cache)) return maybe_new_cache; |
| 5149 } | 5179 } |
| 5150 set_cache(new_cache); | 5180 set_cache(new_cache); |
| 5151 return this; | 5181 return this; |
| 5152 } | 5182 } |
| 5153 | 5183 |
| 5154 | 5184 |
| 5185 Handle<Object> PolymorphicCodeCache::Lookup(MapHandleList* maps, | |
| 5186 Code::Flags flags) { | |
| 5187 List<Map*> raw_maps(maps->length()); | |
| 5188 return Handle<Object>(Lookup(UnwrapHandleList(&raw_maps, maps), flags)); | |
| 5189 } | |
| 5190 | |
| 5191 | |
| 5155 Object* PolymorphicCodeCache::Lookup(MapList* maps, Code::Flags flags) { | 5192 Object* PolymorphicCodeCache::Lookup(MapList* maps, Code::Flags flags) { |
| 5156 if (!cache()->IsUndefined()) { | 5193 if (!cache()->IsUndefined()) { |
| 5157 PolymorphicCodeCacheHashTable* hash_table = | 5194 PolymorphicCodeCacheHashTable* hash_table = |
| 5158 PolymorphicCodeCacheHashTable::cast(cache()); | 5195 PolymorphicCodeCacheHashTable::cast(cache()); |
| 5159 return hash_table->Lookup(maps, flags); | 5196 return hash_table->Lookup(maps, flags); |
| 5160 } else { | 5197 } else { |
| 5161 return GetHeap()->undefined_value(); | 5198 return GetHeap()->undefined_value(); |
| 5162 } | 5199 } |
| 5163 } | 5200 } |
| 5164 | 5201 |
| (...skipping 7417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12582 if (break_point_objects()->IsUndefined()) return 0; | 12619 if (break_point_objects()->IsUndefined()) return 0; |
| 12583 // Single break point. | 12620 // Single break point. |
| 12584 if (!break_point_objects()->IsFixedArray()) return 1; | 12621 if (!break_point_objects()->IsFixedArray()) return 1; |
| 12585 // Multiple break points. | 12622 // Multiple break points. |
| 12586 return FixedArray::cast(break_point_objects())->length(); | 12623 return FixedArray::cast(break_point_objects())->length(); |
| 12587 } | 12624 } |
| 12588 #endif // ENABLE_DEBUGGER_SUPPORT | 12625 #endif // ENABLE_DEBUGGER_SUPPORT |
| 12589 | 12626 |
| 12590 | 12627 |
| 12591 } } // namespace v8::internal | 12628 } } // namespace v8::internal |
| OLD | NEW |