Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index b42ed68a86f4f23f8dea23bdc947c2c657e24a2b..24778f9956ab9027fcaf0e1481b3f48b1ee5afed 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -11057,10 +11057,9 @@ void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( |
| Isolate* isolate = shared->GetIsolate(); |
| if (isolate->serializer_enabled()) return; |
| DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); |
| - Handle<Object> value(shared->optimized_code_map(), isolate); |
| - if (value->IsSmi()) return; // Empty code maps are unsupported. |
| - Handle<FixedArray> code_map = Handle<FixedArray>::cast(value); |
| - code_map->set(kSharedCodeIndex, *code); |
| + // Empty code maps are unsupported. |
| + if (shared->OptimizedCodeMapIsCleared()) return; |
| + shared->optimized_code_map()->set(kSharedCodeIndex, *code); |
| } |
| @@ -11077,15 +11076,12 @@ void SharedFunctionInfo::AddToOptimizedCodeMap( |
| DCHECK(native_context->IsNativeContext()); |
| STATIC_ASSERT(kEntryLength == 4); |
| Handle<FixedArray> new_code_map; |
| - Handle<Object> value(shared->optimized_code_map(), isolate); |
| int entry; |
| - if (value->IsSmi()) { |
| - // No optimized code map. |
| - DCHECK_EQ(0, Smi::cast(*value)->value()); |
| + if (shared->OptimizedCodeMapIsCleared()) { |
| new_code_map = isolate->factory()->NewFixedArray(kInitialLength, TENURED); |
| entry = kEntriesStart; |
| } else { |
| - Handle<FixedArray> old_code_map = Handle<FixedArray>::cast(value); |
| + Handle<FixedArray> old_code_map(shared->optimized_code_map(), isolate); |
| entry = shared->SearchOptimizedCodeMapEntry(*native_context, osr_ast_id); |
| if (entry > kSharedCodeIndex) { |
| // Found an existing context-specific entry, it must not contain any code. |
| @@ -11103,7 +11099,7 @@ void SharedFunctionInfo::AddToOptimizedCodeMap( |
| // TODO(mstarzinger): Temporary workaround. The allocation above might have |
| // flushed the optimized code map and the copy we created is full of holes. |
| // For now we just give up on adding the entry and pretend it got flushed. |
| - if (shared->optimized_code_map()->IsSmi()) return; |
| + if (shared->OptimizedCodeMapIsCleared()) return; |
| entry = old_code_map->length(); |
| } |
| new_code_map->set(entry + kContextOffset, *native_context); |
| @@ -11125,8 +11121,8 @@ void SharedFunctionInfo::AddToOptimizedCodeMap( |
| #endif |
| // Zap any old optimized code map. |
| - if (!shared->optimized_code_map()->IsSmi()) { |
| - FixedArray* old_code_map = FixedArray::cast(shared->optimized_code_map()); |
| + if (!shared->OptimizedCodeMapIsCleared()) { |
| + FixedArray* old_code_map = shared->optimized_code_map(); |
| old_code_map->FillWithHoles(0, old_code_map->length()); |
| } |
| @@ -11136,22 +11132,23 @@ void SharedFunctionInfo::AddToOptimizedCodeMap( |
| void SharedFunctionInfo::ClearOptimizedCodeMap() { |
| // Zap any old optimized code map. |
| - if (!optimized_code_map()->IsSmi()) { |
| - FixedArray* old_code_map = FixedArray::cast(optimized_code_map()); |
| + FixedArray* cleared_map = GetHeap()->cleared_optimized_code_map(); |
| + if (optimized_code_map() != cleared_map) { |
|
Michael Starzinger
2015/11/13 12:14:22
suggestion: Not sure this optimization is worth it
mvstanton
2015/11/17 20:32:12
Done.
|
| + FixedArray* old_code_map = optimized_code_map(); |
| old_code_map->FillWithHoles(0, old_code_map->length()); |
| } |
| - set_optimized_code_map(Smi::FromInt(0)); |
| + set_optimized_code_map(cleared_map, SKIP_WRITE_BARRIER); |
| } |
| void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code, |
| const char* reason) { |
| DisallowHeapAllocation no_gc; |
| - if (optimized_code_map()->IsSmi()) return; |
| + if (OptimizedCodeMapIsCleared()) return; |
| Heap* heap = GetHeap(); |
| - FixedArray* code_map = FixedArray::cast(optimized_code_map()); |
| + FixedArray* code_map = optimized_code_map(); |
| int dst = kEntriesStart; |
| int length = code_map->length(); |
| for (int src = kEntriesStart; src < length; src += kEntryLength) { |
| @@ -11210,7 +11207,7 @@ void SharedFunctionInfo::EvictFromOptimizedCodeMap(Code* optimized_code, |
| void SharedFunctionInfo::TrimOptimizedCodeMap(int shrink_by) { |
| - FixedArray* code_map = FixedArray::cast(optimized_code_map()); |
| + FixedArray* code_map = optimized_code_map(); |
| DCHECK(shrink_by % kEntryLength == 0); |
| DCHECK(shrink_by <= code_map->length() - kEntriesStart); |
| // Always trim even when array is cleared because of heap verifier. |
| @@ -12352,9 +12349,8 @@ int SharedFunctionInfo::SearchOptimizedCodeMapEntry(Context* native_context, |
| BailoutId osr_ast_id) { |
| DisallowHeapAllocation no_gc; |
| DCHECK(native_context->IsNativeContext()); |
| - Object* value = optimized_code_map(); |
| - if (!value->IsSmi()) { |
| - FixedArray* optimized_code_map = FixedArray::cast(value); |
| + if (!OptimizedCodeMapIsCleared()) { |
| + FixedArray* optimized_code_map = this->optimized_code_map(); |
| int length = optimized_code_map->length(); |
| Smi* osr_ast_id_smi = Smi::FromInt(osr_ast_id.ToInt()); |
| for (int i = kEntriesStart; i < length; i += kEntryLength) { |
| @@ -12377,7 +12373,7 @@ CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( |
| CodeAndLiterals result = {nullptr, nullptr}; |
| int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); |
| if (entry != kNotFound) { |
| - FixedArray* code_map = FixedArray::cast(optimized_code_map()); |
| + FixedArray* code_map = optimized_code_map(); |
| if (entry == kSharedCodeIndex) { |
| result = {Code::cast(code_map->get(kSharedCodeIndex)), nullptr}; |
| @@ -12388,7 +12384,7 @@ CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( |
| LiteralsArray::cast(code_map->get(entry + kLiteralsOffset))}; |
| } |
| } |
| - if (FLAG_trace_opt && !optimized_code_map()->IsSmi() && |
| + if (FLAG_trace_opt && !OptimizedCodeMapIsCleared() && |
| result.code == nullptr) { |
| PrintF("[didn't find optimized code in optimized code map for "); |
| ShortPrint(); |