Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/objects.cc

Issue 1668103002: Type Feedback Vector lives in the closure (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
12369 12385
12370 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap( 12386 void SharedFunctionInfo::AddSharedCodeToOptimizedCodeMap(
12371 Handle<SharedFunctionInfo> shared, Handle<Code> code) { 12387 Handle<SharedFunctionInfo> shared, Handle<Code> code) {
12372 Isolate* isolate = shared->GetIsolate(); 12388 Isolate* isolate = shared->GetIsolate();
12373 if (isolate->serializer_enabled()) return; 12389 if (isolate->serializer_enabled()) return;
12374 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); 12390 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
12375 // Empty code maps are unsupported. 12391 // Empty code maps are unsupported.
12376 if (!shared->OptimizedCodeMapIsCleared()) { 12392 if (!shared->OptimizedCodeMapIsCleared()) {
12377 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code); 12393 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(code);
12378 // A collection may have occured and cleared the optimized code map in the 12394 // 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
12562 DCHECK(shrink_by <= code_map->length() - kEntriesStart); 12578 DCHECK(shrink_by <= code_map->length() - kEntriesStart);
12563 // Always trim even when array is cleared because of heap verifier. 12579 // Always trim even when array is cleared because of heap verifier.
12564 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map, 12580 GetHeap()->RightTrimFixedArray<Heap::SEQUENTIAL_TO_SWEEPER>(code_map,
12565 shrink_by); 12581 shrink_by);
12566 if (code_map->length() == kEntriesStart && 12582 if (code_map->length() == kEntriesStart &&
12567 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) { 12583 WeakCell::cast(code_map->get(kSharedCodeIndex))->cleared()) {
12568 ClearOptimizedCodeMap(); 12584 ClearOptimizedCodeMap();
12569 } 12585 }
12570 } 12586 }
12571 12587
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 }
12572 12596
12573 static void GetMinInobjectSlack(Map* map, void* data) { 12597 static void GetMinInobjectSlack(Map* map, void* data) {
12574 int slack = map->unused_property_fields(); 12598 int slack = map->unused_property_fields();
12575 if (*reinterpret_cast<int*>(data) > slack) { 12599 if (*reinterpret_cast<int*>(data) > slack) {
12576 *reinterpret_cast<int*>(data) = slack; 12600 *reinterpret_cast<int*>(data) = slack;
12577 } 12601 }
12578 } 12602 }
12579 12603
12580 12604
12581 static void ShrinkInstanceSize(Map* map, void* data) { 12605 static void ShrinkInstanceSize(Map* map, void* data) {
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after
13839 if (isolate->serializer_enabled()) return; 13863 if (isolate->serializer_enabled()) return;
13840 13864
13841 if (unused_property_fields() == 0) return; 13865 if (unused_property_fields() == 0) return;
13842 13866
13843 set_construction_counter(Map::kSlackTrackingCounterStart); 13867 set_construction_counter(Map::kSlackTrackingCounterStart);
13844 } 13868 }
13845 13869
13846 13870
13847 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) { 13871 void SharedFunctionInfo::ResetForNewContext(int new_ic_age) {
13848 code()->ClearInlineCaches(); 13872 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();
13852 set_ic_age(new_ic_age); 13873 set_ic_age(new_ic_age);
13853 if (code()->kind() == Code::FUNCTION) { 13874 if (code()->kind() == Code::FUNCTION) {
13854 code()->set_profiler_ticks(0); 13875 code()->set_profiler_ticks(0);
13855 if (optimization_disabled() && 13876 if (optimization_disabled() &&
13856 opt_count() >= FLAG_max_opt_count) { 13877 opt_count() >= FLAG_max_opt_count) {
13857 // Re-enable optimizations if they were disabled due to opt_count limit. 13878 // Re-enable optimizations if they were disabled due to opt_count limit.
13858 set_optimization_disabled(false); 13879 set_optimization_disabled(false);
13859 } 13880 }
13860 set_opt_count(0); 13881 set_opt_count(0);
13861 set_deopt_count(0); 13882 set_deopt_count(0);
(...skipping 18 matching lines...) Expand all
13880 } 13901 }
13881 Object* shared_code = 13902 Object* shared_code =
13882 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value(); 13903 WeakCell::cast(optimized_code_map->get(kSharedCodeIndex))->value();
13883 if (shared_code->IsCode() && osr_ast_id.IsNone()) { 13904 if (shared_code->IsCode() && osr_ast_id.IsNone()) {
13884 return kSharedCodeIndex; 13905 return kSharedCodeIndex;
13885 } 13906 }
13886 } 13907 }
13887 return -1; 13908 return -1;
13888 } 13909 }
13889 13910
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 }
13890 13924
13891 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap( 13925 CodeAndLiterals SharedFunctionInfo::SearchOptimizedCodeMap(
13892 Context* native_context, BailoutId osr_ast_id) { 13926 Context* native_context, BailoutId osr_ast_id) {
13893 CodeAndLiterals result = {nullptr, nullptr}; 13927 CodeAndLiterals result = {nullptr, nullptr};
13894 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id); 13928 int entry = SearchOptimizedCodeMapEntry(native_context, osr_ast_id);
13895 if (entry != kNotFound) { 13929 if (entry != kNotFound) {
13896 FixedArray* code_map = optimized_code_map(); 13930 FixedArray* code_map = optimized_code_map();
13897 if (entry == kSharedCodeIndex) { 13931 if (entry == kSharedCodeIndex) {
13898 // We know the weak cell isn't cleared because we made sure of it in 13932 // We know the weak cell isn't cleared because we made sure of it in
13899 // SearchOptimizedCodeMapEntry and performed no allocations since that 13933 // SearchOptimizedCodeMapEntry and performed no allocations since that
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
14323 } 14357 }
14324 } 14358 }
14325 } 14359 }
14326 } 14360 }
14327 14361
14328 int AbstractCode::SourcePosition(int offset) { 14362 int AbstractCode::SourcePosition(int offset) {
14329 if (IsBytecodeArray()) return GetBytecodeArray()->SourcePosition(offset); 14363 if (IsBytecodeArray()) return GetBytecodeArray()->SourcePosition(offset);
14330 return GetCode()->SourcePosition(offset); 14364 return GetCode()->SourcePosition(offset);
14331 } 14365 }
14332 14366
14333 void SharedFunctionInfo::ClearTypeFeedbackInfo() { 14367 void JSFunction::ClearTypeFeedbackInfo() {
14334 feedback_vector()->ClearSlots(this); 14368 feedback_vector()->ClearSlots(shared());
14369 }
14370
14371 void JSFunction::ClearTypeFeedbackInfoAtGCTime() {
14372 feedback_vector()->ClearSlotsAtGCTime(shared());
14335 } 14373 }
14336 14374
14337 14375
14338 void SharedFunctionInfo::ClearTypeFeedbackInfoAtGCTime() {
14339 feedback_vector()->ClearSlotsAtGCTime(this);
14340 }
14341
14342
14343 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { 14376 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) {
14344 DisallowHeapAllocation no_gc; 14377 DisallowHeapAllocation no_gc;
14345 DCHECK(kind() == FUNCTION); 14378 DCHECK(kind() == FUNCTION);
14346 BackEdgeTable back_edges(this, &no_gc); 14379 BackEdgeTable back_edges(this, &no_gc);
14347 for (uint32_t i = 0; i < back_edges.length(); i++) { 14380 for (uint32_t i = 0; i < back_edges.length(); i++) {
14348 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); 14381 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i);
14349 } 14382 }
14350 return BailoutId::None(); 14383 return BailoutId::None();
14351 } 14384 }
14352 14385
(...skipping 5426 matching lines...) Expand 10 before | Expand all | Expand 10 after
19779 if (cell->value() != *new_value) { 19812 if (cell->value() != *new_value) {
19780 cell->set_value(*new_value); 19813 cell->set_value(*new_value);
19781 Isolate* isolate = cell->GetIsolate(); 19814 Isolate* isolate = cell->GetIsolate();
19782 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19815 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19783 isolate, DependentCode::kPropertyCellChangedGroup); 19816 isolate, DependentCode::kPropertyCellChangedGroup);
19784 } 19817 }
19785 } 19818 }
19786 19819
19787 } // namespace internal 19820 } // namespace internal
19788 } // namespace v8 19821 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698