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(); |
| + } |
| } |
| } |