OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 12348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12359 if (FLAG_trace_concurrent_recompilation) { | 12359 if (FLAG_trace_concurrent_recompilation) { |
12360 PrintF(" ** Marking "); | 12360 PrintF(" ** Marking "); |
12361 ShortPrint(); | 12361 ShortPrint(); |
12362 PrintF(" for concurrent recompilation.\n"); | 12362 PrintF(" for concurrent recompilation.\n"); |
12363 } | 12363 } |
12364 set_code_no_write_barrier( | 12364 set_code_no_write_barrier( |
12365 isolate->builtins()->builtin(Builtins::kCompileOptimizedConcurrent)); | 12365 isolate->builtins()->builtin(Builtins::kCompileOptimizedConcurrent)); |
12366 // No write barrier required, since the builtin is part of the root set. | 12366 // No write barrier required, since the builtin is part of the root set. |
12367 } | 12367 } |
12368 | 12368 |
12369 // static | |
12370 Handle<LiteralsArray> SharedFunctionInfo::FindOrCreateLiterals( | |
12371 Handle<SharedFunctionInfo> shared, Handle<Context> native_context) { | |
12372 Isolate* isolate = shared->GetIsolate(); | |
12373 CodeAndLiterals result = | |
12374 shared->SearchOptimizedCodeMap(*native_context, BailoutId::None()); | |
12375 if (result.literals != nullptr) { | |
12376 return handle(result.literals, isolate); | |
12377 } | |
12378 Handle<TypeFeedbackVector> feedback_vector = | |
12379 TypeFeedbackVector::New(isolate, handle(shared->feedback_metadata())); | |
12380 Handle<LiteralsArray> literals = LiteralsArray::New( | |
12381 isolate, feedback_vector, shared->num_literals(), TENURED); | |
12382 AddLiteralsToOptimizedCodeMap(shared, native_context, literals); | |
12383 return literals; | |
12384 } | |
12385 | 12369 |
12386 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( | 12370 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( |
12387 Handle<SharedFunctionInfo> shared, Handle<Code> code) { | 12371 Handle<SharedFunctionInfo> shared, Handle<Code> code) { |
12388 Isolate* isolate = shared->GetIsolate(); | 12372 Isolate* isolate = shared->GetIsolate(); |
12389 if (isolate->serializer_enabled()) return; | 12373 if (isolate->serializer_enabled()) return; |
12390 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); | 12374 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); |
12391 // Empty code maps are unsupported. | 12375 // Empty code maps are unsupported. |
12392 if (!shared->OptimizedCodeMapIsCleared()) { | 12376 if (!shared->OptimizedCodeMapIsCleared()) { |
12393 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code); | 12377 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code); |
12394 // A collection may have occured and cleared the optimized code map in the | 12378 // A collection may have occured and cleared the optimized code map in the |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12578 DCHECK(shrink_by <= code_map->length() - kEntriesStart); | 12562 DCHECK(shrink_by <= code_map->length() - kEntriesStart); |
12579 // Always trim even when array is cleared because of heap verifier. | 12563 // Always trim even when array is cleared because of heap verifier. |
12580 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map, | 12564 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map, |
12581 shrink_by); | 12565 shrink_by); |
12582 if (code_map->length() == kEntriesStart && | 12566 if (code_map->length() == kEntriesStart && |
12583 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) { | 12567 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) { |
12584 ClearOptimizedCodeMap(); | 12568 ClearOptimizedCodeMap(); |
12585 } | 12569 } |
12586 } | 12570 } |
12587 | 12571 |
12588 // static | |
12589 void JSFunction::EnsureLiterals(Handle<JSFunction> function) { | |
12590 Handle<SharedFunctionInfo> shared(function->shared()); | |
12591 Handle<Context> native_context(function->context()->native_context()); | |
12592 Handle<LiteralsArray> literals = | |
12593 SharedFunctionInfo::FindOrCreateLiterals(shared, native_context); | |
12594 function->set_literals(*literals); | |
12595 } | |
12596 | 12572 |
12597 static void GetMinInobjectSlack(Map* map, void* data) { | 12573 static void GetMinInobjectSlack(Map* map, void* data) { |
12598 int slack = map->unused_property_fields(); | 12574 int slack = map->unused_property_fields(); |
12599 if (*reinterpret_cast<int*>(data) > slack) { | 12575 if (*reinterpret_cast<int*>(data) > slack) { |
12600 *reinterpret_cast<int*>(data) = slack; | 12576 *reinterpret_cast<int*>(data) = slack; |
12601 } | 12577 } |
12602 } | 12578 } |
12603 | 12579 |
12604 | 12580 |
12605 static void ShrinkInstanceSize(Map* map, void* data) { | 12581 static void ShrinkInstanceSize(Map* map, void* data) { |
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13863 if (isolate->serializer_enabled()) return; | 13839 if (isolate->serializer_enabled()) return; |
13864 | 13840 |
13865 if (unused_property_fields() == 0) return; | 13841 if (unused_property_fields() == 0) return; |
13866 | 13842 |
13867 set_construction_counter(Map::kSlackTrackingCounterStart); | 13843 set_construction_counter(Map::kSlackTrackingCounterStart); |
13868 } | 13844 } |
13869 | 13845 |
13870 | 13846 |
13871 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) { | 13847 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) { |
13872 code()->ClearInlineCaches(); | 13848 code()->ClearInlineCaches(); |
| 13849 // If we clear ICs, we need to clear the type feedback vector too, since |
| 13850 // CallICs are synced with a feedback vector slot. |
| 13851 ClearTypeFeedbackInfo(); |
13873 set_ic_age(new_ic_age); | 13852 set_ic_age(new_ic_age); |
13874 if (code()->kind() == Code::FUNCTION) { | 13853 if (code()->kind() == Code::FUNCTION) { |
13875 code()->set_profiler_ticks(0); | 13854 code()->set_profiler_ticks(0); |
13876 if (optimization_disabled() && | 13855 if (optimization_disabled() && |
13877 opt_count() >= FLAG_max_opt_count) { | 13856 opt_count() >= FLAG_max_opt_count) { |
13878 // Re-enable optimizations if they were disabled due to opt_count limit. | 13857 // Re-enable optimizations if they were disabled due to opt_count limit. |
13879 set_optimization_disabled(false); | 13858 set_optimization_disabled(false); |
13880 } | 13859 } |
13881 set_opt_count(0); | 13860 set_opt_count(0); |
13882 set_deopt_count(0); | 13861 set_deopt_count(0); |
(...skipping 18 matching lines...) Expand all Loading... |
13901 } | 13880 } |
13902 Object* shared_code = | 13881 Object* shared_code = |
13903 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value(); | 13882 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value(); |
13904 if (shared_code->IsCode() && osr_ast_id.IsNone()) { | 13883 if (shared_code->IsCode() && osr_ast_id.IsNone()) { |
13905 return kSharedCodeIndex; | 13884 return kSharedCodeIndex; |
13906 } | 13885 } |
13907 } | 13886 } |
13908 return -1; | 13887 return -1; |
13909 } | 13888 } |
13910 | 13889 |
13911 void SharedFunctionInfo::ClearCodeFromOptimizedCodeMap() { | |
13912 if (!OptimizedCodeMapIsCleared()) { | |
13913 FixedArray* optimized_code_map = this->optimized_code_map(); | |
13914 int length = optimized_code_map->length(); | |
13915 WeakCell* empty_weak_cell = GetHeap()->empty_weak_cell(); | |
13916 for (int i = kEntriesStart; i < length; i += kEntryLength) { | |
13917 optimized_code_map->set(i + kCachedCodeOffset, empty_weak_cell, | |
13918 SKIP_WRITE_BARRIER); | |
13919 } | |
13920 optimized_code_map->set(kSharedCodeIndex, empty_weak_cell, | |
13921 SKIP_WRITE_BARRIER); | |
13922 } | |
13923 } | |
13924 | 13890 |
13925 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( | 13891 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( |
13926 Context* native_context, BailoutId osr_ast_id) { | 13892 Context* native_context, BailoutId osr_ast_id) { |
13927 CodeAndLiterals result = {nullptr, nullptr}; | 13893 CodeAndLiterals result = {nullptr, nullptr}; |
13928 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); | 13894 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); |
13929 if (entry != kNotFound) { | 13895 if (entry != kNotFound) { |
13930 FixedArray* code_map = optimized_code_map(); | 13896 FixedArray* code_map = optimized_code_map(); |
13931 if (entry == kSharedCodeIndex) { | 13897 if (entry == kSharedCodeIndex) { |
13932 // We know the weak cell isn't cleared because we made sure of it in | 13898 // We know the weak cell isn't cleared because we made sure of it in |
13933 // SearchOptimizedCodeMapEntry and performed no allocations since that | 13899 // SearchOptimizedCodeMapEntry and performed no allocations since that |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14357 } | 14323 } |
14358 } | 14324 } |
14359 } | 14325 } |
14360 } | 14326 } |
14361 | 14327 |
14362 int AbstractCode::SourcePosition(int offset) { | 14328 int AbstractCode::SourcePosition(int offset) { |
14363 if (IsBytecodeArray()) return GetBytecodeArray()->SourcePosition(offset); | 14329 if (IsBytecodeArray()) return GetBytecodeArray()->SourcePosition(offset); |
14364 return GetCode()->SourcePosition(offset); | 14330 return GetCode()->SourcePosition(offset); |
14365 } | 14331 } |
14366 | 14332 |
14367 void JSFunction::ClearTypeFeedbackInfo() { | 14333 void SharedFunctionInfo::ClearTypeFeedbackInfo() { |
14368 feedback_vector()->ClearSlots(shared()); | 14334 feedback_vector()->ClearSlots(this); |
14369 } | |
14370 | |
14371 void JSFunction::ClearTypeFeedbackInfoAtGCTime() { | |
14372 feedback_vector()->ClearSlotsAtGCTime(shared()); | |
14373 } | 14335 } |
14374 | 14336 |
14375 | 14337 |
| 14338 void SharedFunctionInfo::ClearTypeFeedbackInfoAtGCTime() { |
| 14339 feedback_vector()->ClearSlotsAtGCTime(this); |
| 14340 } |
| 14341 |
| 14342 |
14376 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { | 14343 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { |
14377 DisallowHeapAllocation no_gc; | 14344 DisallowHeapAllocation no_gc; |
14378 DCHECK(kind() == FUNCTION); | 14345 DCHECK(kind() == FUNCTION); |
14379 BackEdgeTable back_edges(this, &no_gc); | 14346 BackEdgeTable back_edges(this, &no_gc); |
14380 for (uint32_t i = 0; i < back_edges.length(); i++) { | 14347 for (uint32_t i = 0; i < back_edges.length(); i++) { |
14381 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); | 14348 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); |
14382 } | 14349 } |
14383 return BailoutId::None(); | 14350 return BailoutId::None(); |
14384 } | 14351 } |
14385 | 14352 |
(...skipping 5426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19812 if (cell->value() != *new_value) { | 19779 if (cell->value() != *new_value) { |
19813 cell->set_value(*new_value); | 19780 cell->set_value(*new_value); |
19814 Isolate* isolate = cell->GetIsolate(); | 19781 Isolate* isolate = cell->GetIsolate(); |
19815 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19782 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
19816 isolate, DependentCode::kPropertyCellChangedGroup); | 19783 isolate, DependentCode::kPropertyCellChangedGroup); |
19817 } | 19784 } |
19818 } | 19785 } |
19819 | 19786 |
19820 } // namespace internal | 19787 } // namespace internal |
19821 } // namespace v8 | 19788 } // namespace v8 |
OLD | NEW |