From 81f1b0bdfdf3f68923fa1d398c0a7ba04e539de1 Mon Sep 17 00:00:00 2001 From: "ulan@chromium.org" Date: Mon, 3 Mar 2014 13:12:31 +0000 Subject: [PATCH] Make EvictFromOptimizedCodeMap more robust. This removes all occurences of the specified optimized code from the optimized code map. R=titzer@chromium.org, yangguo@chromium.org Review URL: https://codereview.chromium.org/181493004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19638 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index 94a80f7..0a5b69f 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -9640,38 +9640,42 @@ void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason) { if (optimized_code_map()->IsSmi()) return; - int i; - bool removed_entry = false; FixedArray* code_map = FixedArray::cast(optimized_code_map()); - for (i = kEntriesStart; i < code_map->length(); i += kEntryLength) { - ASSERT(code_map->get(i)->IsNativeContext()); - if (Code::cast(code_map->get(i + 1)) == optimized_code) { + int dst = kEntriesStart; + int length = code_map->length(); + for (int src = kEntriesStart; src < length; src += kEntryLength) { + ASSERT(code_map->get(src)->IsNativeContext()); + if (Code::cast(code_map->get(src + kCachedCodeOffset)) == optimized_code) { + // Evict the src entry by not copying it to the dst entry. if (FLAG_trace_opt) { PrintF("[evicting entry from optimizing code map (%s) for ", reason); ShortPrint(); - PrintF("]\n"); + BailoutId osr(Smi::cast(code_map->get(src + kOsrAstIdOffset))->value()); + if (osr.IsNone()) { + PrintF("]\n"); + } else { + PrintF(" (osr ast id %d)]\n", osr.ToInt()); + } } - removed_entry = true; - break; + } else { + // Keep the src entry by copying it to the dst entry. + 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)); + } + dst += kEntryLength; } } - 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) { + if (dst != length) { // Always trim even when array is cleared because of heap verifier. - RightTrimFixedArray(GetHeap(), code_map, kEntryLength); - if (code_map->length() == kEntriesStart) { - ClearOptimizedCodeMap(); - } + RightTrimFixedArray(GetHeap(), code_map, length - dst); + if (code_map->length() == kEntriesStart) ClearOptimizedCodeMap(); } } -- 2.7.4