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 11408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |