Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index dfcb29b6027aafbdfab53181fecb10d5f52b542c..1d560fd03d74ef81d8f6621885ea621d9ed2e040 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -9034,7 +9034,7 @@ void SharedFunctionInfo::InstallFromOptimizedCodeMap(JSFunction* function, |
| void SharedFunctionInfo::ClearOptimizedCodeMap(const char* reason) { |
| if (!optimized_code_map()->IsSmi()) { |
| if (FLAG_trace_opt) { |
| - PrintF("[clearing optimizing code map (%s) for ", reason); |
| + PrintF("[clearing entire optimizing code map (%s) for ", reason); |
| ShortPrint(); |
| PrintF("]\n"); |
| } |
| @@ -9043,6 +9043,47 @@ void SharedFunctionInfo::ClearOptimizedCodeMap(const char* reason) { |
| } |
| +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 = 0; i < code_map->length(); i += kEntryLength) { |
| + ASSERT(code_map->get(i)->IsNativeContext()); |
| + if (Code::cast(code_map->get(i + 1)) == optimized_code) { |
| + if (FLAG_trace_opt) { |
| + PrintF("[clearing optimizing code map (%s) for ", reason); |
| + ShortPrint(); |
| + PrintF("]\n"); |
| + } |
| + removed_entry = true; |
| + break; |
| + } |
| + } |
| + while (i < (code_map->length() - kEntryLength)) { |
| + code_map->set(i, code_map->get(i + 1 + kEntryLength)); |
|
Michael Starzinger
2013/05/13 14:26:46
The indices look suspiciously off in this loop!
danno
2013/05/13 15:23:10
Done.
|
| + code_map->set(i + 1, code_map->get(i + 2 + kEntryLength)); |
| + code_map->set(i + 2, code_map->get(i + 3 + kEntryLength)); |
| + i += kEntryLength; |
| + } |
| + if (removed_entry) { |
| + Heap* heap = GetHeap(); |
| + int new_length = code_map->length() - kEntryLength; |
| + if (new_length == 0) { |
| + ClearOptimizedCodeMap(reason); |
| + return; |
| + } |
| + Address filler_start = reinterpret_cast<Address>( |
| + code_map->GetFirstElementAddress() + new_length); |
| + heap->CreateFillerObjectAt(filler_start, |
|
Michael Starzinger
2013/05/13 14:26:46
This will destroy live-bytes count if incremental
danno
2013/05/13 15:23:10
Done.
danno
2013/05/13 15:23:10
Oh, this is much better! Thanks!
On 2013/05/13 14:
|
| + kEntryLength * kPointerSize); |
| + code_map->set_length(new_length); |
| + } |
| +} |
| + |
| + |
| bool JSFunction::CompileLazy(Handle<JSFunction> function, |
| ClearExceptionFlag flag) { |
| bool result = true; |