Chromium Code Reviews| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index 11c8ffcacdd5483351e8915cd8261f95b861eceb..aa6e2808b46d283c5178cbff07f05da6db8ebdbd 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -9631,46 +9631,42 @@ void SharedFunctionInfo::ClearOptimizedCodeMap() { | 
| } | 
| -void SharedFunctionInfo::EvictFromOptimizedCodeMap(Context* context, | 
| +void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code, | 
| const char* reason) { | 
| - ASSERT(context->IsNativeContext()); | 
| if (optimized_code_map()->IsSmi()) return; | 
| + int i; | 
| + bool removed_entry = false; | 
| FixedArray* code_map = FixedArray::cast(optimized_code_map()); | 
| - int dst = kEntriesStart; | 
| - int length = code_map->length(); | 
| - for (int src = kEntriesStart; src < length; src += kEntryLength) { | 
| - Context* context_key = Context::cast(code_map->get(src)); | 
| - ASSERT(context->IsNativeContext()); | 
| - if (context_key == context) { | 
| + for (i = kEntriesStart; i < code_map->length(); i += kEntryLength) { | 
| 
 
titzer
2014/03/03 12:02:44
This code is relying on the code appearing only on
 
 | 
| + ASSERT(code_map->get(i)->IsNativeContext()); | 
| + if (Code::cast(code_map->get(i + 1)) == optimized_code) { | 
| 
 
titzer
2014/03/03 12:02:44
Please use kCachedCodeOffset here.
 
 | 
| if (FLAG_trace_opt) { | 
| PrintF("[evicting entry from optimizing code map (%s) for ", reason); | 
| ShortPrint(); | 
| - BailoutId osr(Smi::cast(code_map->get(src + kOsrAstIdOffset))->value()); | 
| - if (osr.IsNone()) { | 
| - PrintF("]\n"); | 
| - } else { | 
| - PrintF(" (osr ast id %d)]\n", osr.ToInt()); | 
| - } | 
| + PrintF("]\n"); | 
| } | 
| - continue; | 
| - } | 
| - if (dst != src) { | 
| - code_map->set(dst + kContextOffset, | 
| - code_map->get(src + kContextOffset)); | 
| - code_map->set(dst + kCachedCodeOffset, | 
| - code_map->get(src + kCachedCodeOffset)); | 
| - code_map->set(dst + kLiteralsOffset, | 
| - code_map->get(src + kLiteralsOffset)); | 
| - code_map->set(dst + kOsrAstIdOffset, | 
| - code_map->get(src + kOsrAstIdOffset)); | 
| + removed_entry = true; | 
| + break; | 
| } | 
| - dst += kEntryLength; | 
| } | 
| - if (dst != length) { | 
| + while (i < (code_map->length() - kEntryLength)) { | 
| + code_map->set(i + kContextOffset, | 
| + code_map->get(i + kContextOffset + kEntryLength)); | 
| + code_map->set(i + kCachedCodeOffset, | 
| + code_map->get(i + kCachedCodeOffset + kEntryLength)); | 
| + code_map->set(i + kLiteralsOffset, | 
| + code_map->get(i + kLiteralsOffset + kEntryLength)); | 
| + code_map->set(i + kOsrAstIdOffset, | 
| + code_map->get(i + kOsrAstIdOffset + kEntryLength)); | 
| + i += kEntryLength; | 
| + } | 
| + if (removed_entry) { | 
| // Always trim even when array is cleared because of heap verifier. | 
| - RightTrimFixedArray<FROM_MUTATOR>(GetHeap(), code_map, length - dst); | 
| - if (code_map->length() == kEntriesStart) ClearOptimizedCodeMap(); | 
| + RightTrimFixedArray<FROM_MUTATOR>(GetHeap(), code_map, kEntryLength); | 
| + if (code_map->length() == kEntriesStart) { | 
| + ClearOptimizedCodeMap(); | 
| + } | 
| } | 
| } |