| 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 12269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12280 PrintF(" ** Marking "); | 12280 PrintF(" ** Marking "); |
| 12281 ShortPrint(); | 12281 ShortPrint(); |
| 12282 PrintF(" for concurrent recompilation.\n"); | 12282 PrintF(" for concurrent recompilation.\n"); |
| 12283 } | 12283 } |
| 12284 set_code_no_write_barrier( | 12284 set_code_no_write_barrier( |
| 12285 isolate->builtins()->builtin(Builtins::kCompileOptimizedConcurrent)); | 12285 isolate->builtins()->builtin(Builtins::kCompileOptimizedConcurrent)); |
| 12286 // No write barrier required, since the builtin is part of the root set. | 12286 // No write barrier required, since the builtin is part of the root set. |
| 12287 } | 12287 } |
| 12288 | 12288 |
| 12289 | 12289 |
| 12290 // static |
| 12291 Handle<LiteralsArray> SharedFunctionInfo::FindOrCreateLiterals( |
| 12292 Handle<SharedFunctionInfo> shared, Handle<Context> native_context) { |
| 12293 Isolate* isolate = shared->GetIsolate(); |
| 12294 CodeAndLiterals result = |
| 12295 shared->SearchOptimizedCodeMap(*native_context, BailoutId::None()); |
| 12296 if (result.literals != nullptr) { |
| 12297 return handle(result.literals, isolate); |
| 12298 } |
| 12299 Handle<TypeFeedbackVector> feedback_vector = |
| 12300 TypeFeedbackVector::New(isolate, handle(shared->feedback_metadata())); |
| 12301 Handle<LiteralsArray> literals = LiteralsArray::New( |
| 12302 isolate, feedback_vector, shared->num_literals(), TENURED); |
| 12303 AddLiteralsToOptimizedCodeMap(shared, native_context, literals); |
| 12304 return literals; |
| 12305 } |
| 12306 |
| 12307 |
| 12290 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( | 12308 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( |
| 12291 Handle<SharedFunctionInfo> shared, Handle<Code> code) { | 12309 Handle<SharedFunctionInfo> shared, Handle<Code> code) { |
| 12292 Isolate* isolate = shared->GetIsolate(); | 12310 Isolate* isolate = shared->GetIsolate(); |
| 12293 if (isolate->serializer_enabled()) return; | 12311 if (isolate->serializer_enabled()) return; |
| 12294 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); | 12312 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); |
| 12295 // Empty code maps are unsupported. | 12313 // Empty code maps are unsupported. |
| 12296 if (!shared->OptimizedCodeMapIsCleared()) { | 12314 if (!shared->OptimizedCodeMapIsCleared()) { |
| 12297 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code); | 12315 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code); |
| 12298 // A collection may have occured and cleared the optimized code map in the | 12316 // A collection may have occured and cleared the optimized code map in the |
| 12299 // allocation above. | 12317 // allocation above. |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12483 // Always trim even when array is cleared because of heap verifier. | 12501 // Always trim even when array is cleared because of heap verifier. |
| 12484 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map, | 12502 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map, |
| 12485 shrink_by); | 12503 shrink_by); |
| 12486 if (code_map->length() == kEntriesStart && | 12504 if (code_map->length() == kEntriesStart && |
| 12487 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) { | 12505 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) { |
| 12488 ClearOptimizedCodeMap(); | 12506 ClearOptimizedCodeMap(); |
| 12489 } | 12507 } |
| 12490 } | 12508 } |
| 12491 | 12509 |
| 12492 | 12510 |
| 12511 // static |
| 12512 void JSFunction::EnsureLiterals(Handle<JSFunction> function) { |
| 12513 Handle<SharedFunctionInfo> shared(function->shared()); |
| 12514 Handle<Context> native_context(function->context()->native_context()); |
| 12515 Handle<LiteralsArray> literals = |
| 12516 SharedFunctionInfo::FindOrCreateLiterals(shared, native_context); |
| 12517 function->set_literals(*literals); |
| 12518 } |
| 12519 |
| 12520 |
| 12493 static void GetMinInobjectSlack(Map* map, void* data) { | 12521 static void GetMinInobjectSlack(Map* map, void* data) { |
| 12494 int slack = map->unused_property_fields(); | 12522 int slack = map->unused_property_fields(); |
| 12495 if (*reinterpret_cast<int*>(data) > slack) { | 12523 if (*reinterpret_cast<int*>(data) > slack) { |
| 12496 *reinterpret_cast<int*>(data) = slack; | 12524 *reinterpret_cast<int*>(data) = slack; |
| 12497 } | 12525 } |
| 12498 } | 12526 } |
| 12499 | 12527 |
| 12500 | 12528 |
| 12501 static void ShrinkInstanceSize(Map* map, void* data) { | 12529 static void ShrinkInstanceSize(Map* map, void* data) { |
| 12502 int slack = *reinterpret_cast<int*>(data); | 12530 int slack = *reinterpret_cast<int*>(data); |
| (...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13754 if (isolate->serializer_enabled()) return; | 13782 if (isolate->serializer_enabled()) return; |
| 13755 | 13783 |
| 13756 if (unused_property_fields() == 0) return; | 13784 if (unused_property_fields() == 0) return; |
| 13757 | 13785 |
| 13758 set_construction_counter(Map::kSlackTrackingCounterStart); | 13786 set_construction_counter(Map::kSlackTrackingCounterStart); |
| 13759 } | 13787 } |
| 13760 | 13788 |
| 13761 | 13789 |
| 13762 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) { | 13790 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) { |
| 13763 code()->ClearInlineCaches(); | 13791 code()->ClearInlineCaches(); |
| 13764 // If we clear ICs, we need to clear the type feedback vector too, since | |
| 13765 // CallICs are synced with a feedback vector slot. | |
| 13766 ClearTypeFeedbackInfo(); | |
| 13767 set_ic_age(new_ic_age); | 13792 set_ic_age(new_ic_age); |
| 13768 if (code()->kind() == Code::FUNCTION) { | 13793 if (code()->kind() == Code::FUNCTION) { |
| 13769 code()->set_profiler_ticks(0); | 13794 code()->set_profiler_ticks(0); |
| 13770 if (optimization_disabled() && | 13795 if (optimization_disabled() && |
| 13771 opt_count() >= FLAG_max_opt_count) { | 13796 opt_count() >= FLAG_max_opt_count) { |
| 13772 // Re-enable optimizations if they were disabled due to opt_count limit. | 13797 // Re-enable optimizations if they were disabled due to opt_count limit. |
| 13773 set_optimization_disabled(false); | 13798 set_optimization_disabled(false); |
| 13774 } | 13799 } |
| 13775 set_opt_count(0); | 13800 set_opt_count(0); |
| 13776 set_deopt_count(0); | 13801 set_deopt_count(0); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 13796 Object* shared_code = | 13821 Object* shared_code = |
| 13797 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value(); | 13822 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value(); |
| 13798 if (shared_code->IsCode() && osr_ast_id.IsNone()) { | 13823 if (shared_code->IsCode() && osr_ast_id.IsNone()) { |
| 13799 return kSharedCodeIndex; | 13824 return kSharedCodeIndex; |
| 13800 } | 13825 } |
| 13801 } | 13826 } |
| 13802 return -1; | 13827 return -1; |
| 13803 } | 13828 } |
| 13804 | 13829 |
| 13805 | 13830 |
| 13831 void SharedFunctionInfo::ClearCodeFromOptimizedCodeMap() { |
| 13832 if (!OptimizedCodeMapIsCleared()) { |
| 13833 FixedArray* optimized_code_map = this->optimized_code_map(); |
| 13834 int length = optimized_code_map->length(); |
| 13835 WeakCell* empty_weak_cell = GetHeap()->empty_weak_cell(); |
| 13836 for (int i = kEntriesStart; i < length; i += kEntryLength) { |
| 13837 optimized_code_map->set(i + kCachedCodeOffset, empty_weak_cell, |
| 13838 SKIP_WRITE_BARRIER); |
| 13839 } |
| 13840 optimized_code_map->set(kSharedCodeIndex, empty_weak_cell, |
| 13841 SKIP_WRITE_BARRIER); |
| 13842 } |
| 13843 } |
| 13844 |
| 13845 |
| 13806 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( | 13846 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( |
| 13807 Context* native_context, BailoutId osr_ast_id) { | 13847 Context* native_context, BailoutId osr_ast_id) { |
| 13808 CodeAndLiterals result = {nullptr, nullptr}; | 13848 CodeAndLiterals result = {nullptr, nullptr}; |
| 13809 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); | 13849 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); |
| 13810 if (entry != kNotFound) { | 13850 if (entry != kNotFound) { |
| 13811 FixedArray* code_map = optimized_code_map(); | 13851 FixedArray* code_map = optimized_code_map(); |
| 13812 if (entry == kSharedCodeIndex) { | 13852 if (entry == kSharedCodeIndex) { |
| 13813 // We know the weak cell isn't cleared because we made sure of it in | 13853 // We know the weak cell isn't cleared because we made sure of it in |
| 13814 // SearchOptimizedCodeMapEntry and performed no allocations since that | 13854 // SearchOptimizedCodeMapEntry and performed no allocations since that |
| 13815 // call. | 13855 // call. |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14234 if (target->is_inline_cache_stub()) { | 14274 if (target->is_inline_cache_stub()) { |
| 14235 if (kind == NULL || *kind == target->kind()) { | 14275 if (kind == NULL || *kind == target->kind()) { |
| 14236 IC::Clear(this->GetIsolate(), info->pc(), | 14276 IC::Clear(this->GetIsolate(), info->pc(), |
| 14237 info->host()->constant_pool()); | 14277 info->host()->constant_pool()); |
| 14238 } | 14278 } |
| 14239 } | 14279 } |
| 14240 } | 14280 } |
| 14241 } | 14281 } |
| 14242 | 14282 |
| 14243 | 14283 |
| 14244 void SharedFunctionInfo::ClearTypeFeedbackInfo() { | 14284 void JSFunction::ClearTypeFeedbackInfo() { |
| 14245 feedback_vector()->ClearSlots(this); | 14285 feedback_vector()->ClearSlots(shared()); |
| 14246 } | 14286 } |
| 14247 | 14287 |
| 14248 | 14288 |
| 14249 void SharedFunctionInfo::ClearTypeFeedbackInfoAtGCTime() { | 14289 void JSFunction::ClearTypeFeedbackInfoAtGCTime() { |
| 14250 feedback_vector()->ClearSlotsAtGCTime(this); | 14290 feedback_vector()->ClearSlotsAtGCTime(shared()); |
| 14251 } | 14291 } |
| 14252 | 14292 |
| 14253 | 14293 |
| 14254 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { | 14294 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { |
| 14255 DisallowHeapAllocation no_gc; | 14295 DisallowHeapAllocation no_gc; |
| 14256 DCHECK(kind() == FUNCTION); | 14296 DCHECK(kind() == FUNCTION); |
| 14257 BackEdgeTable back_edges(this, &no_gc); | 14297 BackEdgeTable back_edges(this, &no_gc); |
| 14258 for (uint32_t i = 0; i < back_edges.length(); i++) { | 14298 for (uint32_t i = 0; i < back_edges.length(); i++) { |
| 14259 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); | 14299 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); |
| 14260 } | 14300 } |
| (...skipping 5389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19650 if (cell->value() != *new_value) { | 19690 if (cell->value() != *new_value) { |
| 19651 cell->set_value(*new_value); | 19691 cell->set_value(*new_value); |
| 19652 Isolate* isolate = cell->GetIsolate(); | 19692 Isolate* isolate = cell->GetIsolate(); |
| 19653 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19693 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19654 isolate, DependentCode::kPropertyCellChangedGroup); | 19694 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19655 } | 19695 } |
| 19656 } | 19696 } |
| 19657 | 19697 |
| 19658 } // namespace internal | 19698 } // namespace internal |
| 19659 } // namespace v8 | 19699 } // namespace v8 |
| OLD | NEW |