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

Side by Side Diff: src/objects.cc

Issue 2031123003: Avoid creating weak cells for literal arrays that are empty of literals. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Ports. Created 4 years, 6 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
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 11408 matching lines...) Expand 10 before | Expand all | Expand 10 after
11419 } else { 11419 } else {
11420 Handle<FixedArray> old_code_map(shared->optimized_code_map(), isolate); 11420 Handle<FixedArray> old_code_map(shared->optimized_code_map(), isolate);
11421 entry = shared->SearchOptimizedCodeMapEntry(*native_context, osr_ast_id); 11421 entry = shared->SearchOptimizedCodeMapEntry(*native_context, osr_ast_id);
11422 if (entry > kSharedCodeIndex) { 11422 if (entry > kSharedCodeIndex) {
11423 // Just set the code and literals of the entry. 11423 // Just set the code and literals of the entry.
11424 if (!code.is_null()) { 11424 if (!code.is_null()) {
11425 Handle<WeakCell> code_cell = 11425 Handle<WeakCell> code_cell =
11426 isolate->factory()->NewWeakCell(code.ToHandleChecked()); 11426 isolate->factory()->NewWeakCell(code.ToHandleChecked());
11427 old_code_map->set(entry + kCachedCodeOffset, *code_cell); 11427 old_code_map->set(entry + kCachedCodeOffset, *code_cell);
11428 } 11428 }
11429 Handle<WeakCell> literals_cell = 11429 if (literals->literals_count() == 0) {
11430 isolate->factory()->NewWeakCell(literals); 11430 old_code_map->set(entry + kLiteralsOffset, *literals);
11431 old_code_map->set(entry + kLiteralsOffset, *literals_cell); 11431 } else {
11432 Handle<WeakCell> literals_cell =
11433 isolate->factory()->NewWeakCell(literals);
11434 old_code_map->set(entry + kLiteralsOffset, *literals_cell);
11435 }
11432 return; 11436 return;
11433 } 11437 }
11434 11438
11435 // Can we reuse an entry? 11439 // Can we reuse an entry?
11436 DCHECK(entry < kEntriesStart); 11440 DCHECK(entry < kEntriesStart);
11437 int length = old_code_map->length(); 11441 int length = old_code_map->length();
11438 for (int i = kEntriesStart; i < length; i += kEntryLength) { 11442 for (int i = kEntriesStart; i < length; i += kEntryLength) {
11439 if (WeakCell::cast(old_code_map->get(i + kContextOffset))->cleared()) { 11443 if (WeakCell::cast(old_code_map->get(i + kContextOffset))->cleared()) {
11440 new_code_map = old_code_map; 11444 new_code_map = old_code_map;
11441 entry = i; 11445 entry = i;
(...skipping 10 matching lines...) Expand all
11452 // holes. For now we just give up on adding the entry and pretend it got 11456 // holes. For now we just give up on adding the entry and pretend it got
11453 // flushed. 11457 // flushed.
11454 if (shared->OptimizedCodeMapIsCleared()) return; 11458 if (shared->OptimizedCodeMapIsCleared()) return;
11455 entry = old_code_map->length(); 11459 entry = old_code_map->length();
11456 } 11460 }
11457 } 11461 }
11458 11462
11459 Handle<WeakCell> code_cell = 11463 Handle<WeakCell> code_cell =
11460 code.is_null() ? isolate->factory()->empty_weak_cell() 11464 code.is_null() ? isolate->factory()->empty_weak_cell()
11461 : isolate->factory()->NewWeakCell(code.ToHandleChecked()); 11465 : isolate->factory()->NewWeakCell(code.ToHandleChecked());
11462 Handle<WeakCell> literals_cell = isolate->factory()->NewWeakCell(literals);
11463 WeakCell* context_cell = native_context->self_weak_cell(); 11466 WeakCell* context_cell = native_context->self_weak_cell();
11464 11467
11465 new_code_map->set(entry + kContextOffset, context_cell); 11468 new_code_map->set(entry + kContextOffset, context_cell);
11466 new_code_map->set(entry + kCachedCodeOffset, *code_cell); 11469 new_code_map->set(entry + kCachedCodeOffset, *code_cell);
11467 new_code_map->set(entry + kLiteralsOffset, *literals_cell); 11470
11471 if (literals->literals_count() == 0) {
11472 new_code_map->set(entry + kLiteralsOffset, *literals);
11473 } else {
11474 Handle<WeakCell> literals_cell = isolate->factory()->NewWeakCell(literals);
11475 new_code_map->set(entry + kLiteralsOffset, *literals_cell);
11476 }
11477
11468 new_code_map->set(entry + kOsrAstIdOffset, Smi::FromInt(osr_ast_id.ToInt())); 11478 new_code_map->set(entry + kOsrAstIdOffset, Smi::FromInt(osr_ast_id.ToInt()));
11469 11479
11470 #ifdef DEBUG 11480 #ifdef DEBUG
11471 for (int i = kEntriesStart; i < new_code_map->length(); i += kEntryLength) { 11481 for (int i = kEntriesStart; i < new_code_map->length(); i += kEntryLength) {
11472 WeakCell* cell = WeakCell::cast(new_code_map->get(i + kContextOffset)); 11482 WeakCell* cell = WeakCell::cast(new_code_map->get(i + kContextOffset));
11473 DCHECK(cell->cleared() || cell->value()->IsNativeContext()); 11483 DCHECK(cell->cleared() || cell->value()->IsNativeContext());
11474 cell = WeakCell::cast(new_code_map->get(i + kCachedCodeOffset)); 11484 cell = WeakCell::cast(new_code_map->get(i + kCachedCodeOffset));
11475 DCHECK(cell->cleared() || 11485 DCHECK(cell->cleared() ||
11476 (cell->value()->IsCode() && 11486 (cell->value()->IsCode() &&
11477 Code::cast(cell->value())->kind() == Code::OPTIMIZED_FUNCTION)); 11487 Code::cast(cell->value())->kind() == Code::OPTIMIZED_FUNCTION));
11478 cell = WeakCell::cast(new_code_map->get(i + kLiteralsOffset)); 11488 Object* lits = new_code_map->get(i + kLiteralsOffset);
11479 DCHECK(cell->cleared() || cell->value()->IsFixedArray()); 11489 if (lits->IsWeakCell()) {
11490 cell = WeakCell::cast(lits);
11491 DCHECK(cell->cleared() ||
11492 (cell->value()->IsLiteralsArray() &&
11493 LiteralsArray::cast(cell->value())->literals_count() > 0));
11494 } else {
11495 DCHECK(lits->IsLiteralsArray() &&
11496 LiteralsArray::cast(lits)->literals_count() == 0);
11497 }
11480 DCHECK(new_code_map->get(i + kOsrAstIdOffset)->IsSmi()); 11498 DCHECK(new_code_map->get(i + kOsrAstIdOffset)->IsSmi());
11481 } 11499 }
11482 #endif 11500 #endif
11483 11501
11484 FixedArray* old_code_map = shared->optimized_code_map(); 11502 FixedArray* old_code_map = shared->optimized_code_map();
11485 if (old_code_map != *new_code_map) { 11503 if (old_code_map != *new_code_map) {
11486 shared->set_optimized_code_map(*new_code_map); 11504 shared->set_optimized_code_map(*new_code_map);
11487 } 11505 }
11488 } 11506 }
11489 11507
(...skipping 1595 matching lines...) Expand 10 before | Expand all | Expand 10 after
13085 if (entry == kSharedCodeIndex) { 13103 if (entry == kSharedCodeIndex) {
13086 // We know the weak cell isn't cleared because we made sure of it in 13104 // We know the weak cell isn't cleared because we made sure of it in
13087 // SearchOptimizedCodeMapEntry and performed no allocations since that 13105 // SearchOptimizedCodeMapEntry and performed no allocations since that
13088 // call. 13106 // call.
13089 result = { 13107 result = {
13090 Code::cast(WeakCell::cast(code_map->get(kSharedCodeIndex))->value()), 13108 Code::cast(WeakCell::cast(code_map->get(kSharedCodeIndex))->value()),
13091 nullptr}; 13109 nullptr};
13092 } else { 13110 } else {
13093 DCHECK_LE(entry + kEntryLength, code_map->length()); 13111 DCHECK_LE(entry + kEntryLength, code_map->length());
13094 WeakCell* cell = WeakCell::cast(code_map->get(entry + kCachedCodeOffset)); 13112 WeakCell* cell = WeakCell::cast(code_map->get(entry + kCachedCodeOffset));
13095 WeakCell* literals_cell = 13113 Object* lits = code_map->get(entry + kLiteralsOffset);
13096 WeakCell::cast(code_map->get(entry + kLiteralsOffset)); 13114 LiteralsArray* literals = nullptr;
13097 13115 if (lits->IsWeakCell()) {
13116 WeakCell* literal_cell = WeakCell::cast(lits);
13117 if (!literal_cell->cleared()) {
13118 literals = LiteralsArray::cast(literal_cell->value());
13119 }
13120 } else {
13121 literals = LiteralsArray::cast(lits);
13122 }
13098 result = {cell->cleared() ? nullptr : Code::cast(cell->value()), 13123 result = {cell->cleared() ? nullptr : Code::cast(cell->value()),
13099 literals_cell->cleared() 13124 literals};
13100 ? nullptr
13101 : LiteralsArray::cast(literals_cell->value())};
13102 } 13125 }
13103 } 13126 }
13104 return result; 13127 return result;
13105 } 13128 }
13106 13129
13107 13130
13108 #define DECLARE_TAG(ignore1, name, ignore2) name, 13131 #define DECLARE_TAG(ignore1, name, ignore2) name,
13109 const char* const VisitorSynchronization::kTags[ 13132 const char* const VisitorSynchronization::kTags[
13110 VisitorSynchronization::kNumberOfSyncTags] = { 13133 VisitorSynchronization::kNumberOfSyncTags] = {
13111 VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_TAG) 13134 VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_TAG)
(...skipping 5474 matching lines...) Expand 10 before | Expand all | Expand 10 after
18586 if (cell->value() != *new_value) { 18609 if (cell->value() != *new_value) {
18587 cell->set_value(*new_value); 18610 cell->set_value(*new_value);
18588 Isolate* isolate = cell->GetIsolate(); 18611 Isolate* isolate = cell->GetIsolate();
18589 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18612 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18590 isolate, DependentCode::kPropertyCellChangedGroup); 18613 isolate, DependentCode::kPropertyCellChangedGroup);
18591 } 18614 }
18592 } 18615 }
18593 18616
18594 } // namespace internal 18617 } // namespace internal
18595 } // namespace v8 18618 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698