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

Side by Side Diff: src/objects.cc

Issue 764003003: Reland parts of 'Use weak cells in map checks in polymorphic ICs' (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 6 years 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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <sstream> 5 #include <sstream>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 1559 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 break; 1570 break;
1571 } 1571 }
1572 case PROPERTY_CELL_TYPE: { 1572 case PROPERTY_CELL_TYPE: {
1573 os << "PropertyCell for "; 1573 os << "PropertyCell for ";
1574 HeapStringAllocator allocator; 1574 HeapStringAllocator allocator;
1575 StringStream accumulator(&allocator); 1575 StringStream accumulator(&allocator);
1576 PropertyCell::cast(this)->value()->ShortPrint(&accumulator); 1576 PropertyCell::cast(this)->value()->ShortPrint(&accumulator);
1577 os << accumulator.ToCString().get(); 1577 os << accumulator.ToCString().get();
1578 break; 1578 break;
1579 } 1579 }
1580 case WEAK_CELL_TYPE: {
1581 os << "WeakCell for ";
1582 HeapStringAllocator allocator;
1583 StringStream accumulator(&allocator);
1584 WeakCell::cast(this)->value()->ShortPrint(&accumulator);
1585 os << accumulator.ToCString().get();
1586 break;
1587 }
1580 default: 1588 default:
1581 os << "<Other heap object (" << map()->instance_type() << ")>"; 1589 os << "<Other heap object (" << map()->instance_type() << ")>";
1582 break; 1590 break;
1583 } 1591 }
1584 } 1592 }
1585 1593
1586 1594
1587 void HeapObject::Iterate(ObjectVisitor* v) { 1595 void HeapObject::Iterate(ObjectVisitor* v) {
1588 // Handle header 1596 // Handle header
1589 IteratePointer(v, kMapOffset); 1597 IteratePointer(v, kMapOffset);
(...skipping 1828 matching lines...) Expand 10 before | Expand all | Expand 10 after
3418 } 3426 }
3419 3427
3420 if (isolate->initial_object_prototype()->map() == this) { 3428 if (isolate->initial_object_prototype()->map() == this) {
3421 return true; 3429 return true;
3422 } 3430 }
3423 3431
3424 return false; 3432 return false;
3425 } 3433 }
3426 3434
3427 3435
3436 Handle<WeakCell> Map::WeakCellForMap(Handle<Map> map) {
3437 Isolate* isolate = map->GetIsolate();
3438 if (map->code_cache()->IsFixedArray()) {
3439 return isolate->factory()->NewWeakCell(map);
3440 }
3441 Handle<CodeCache> code_cache(CodeCache::cast(map->code_cache()), isolate);
3442 if (code_cache->weak_cell_cache()->IsWeakCell()) {
3443 return Handle<WeakCell>(WeakCell::cast(code_cache->weak_cell_cache()));
3444 }
3445 Handle<WeakCell> weak_cell = isolate->factory()->NewWeakCell(map);
3446 code_cache->set_weak_cell_cache(*weak_cell);
3447 return weak_cell;
3448 }
3449
3450
3428 static Handle<Map> AddMissingElementsTransitions(Handle<Map> map, 3451 static Handle<Map> AddMissingElementsTransitions(Handle<Map> map,
3429 ElementsKind to_kind) { 3452 ElementsKind to_kind) {
3430 DCHECK(IsTransitionElementsKind(map->elements_kind())); 3453 DCHECK(IsTransitionElementsKind(map->elements_kind()));
3431 3454
3432 Handle<Map> current_map = map; 3455 Handle<Map> current_map = map;
3433 3456
3434 ElementsKind kind = map->elements_kind(); 3457 ElementsKind kind = map->elements_kind();
3435 if (!map->is_prototype_map()) { 3458 if (!map->is_prototype_map()) {
3436 while (kind != to_kind && !IsTerminalElementsKind(kind)) { 3459 while (kind != to_kind && !IsTerminalElementsKind(kind)) {
3437 kind = GetNextTransitionElementsKind(kind); 3460 kind = GetNextTransitionElementsKind(kind);
(...skipping 7122 matching lines...) Expand 10 before | Expand all | Expand 10 after
10560 } 10583 }
10561 10584
10562 10585
10563 Object* Code::FindNthObject(int n, Map* match_map) { 10586 Object* Code::FindNthObject(int n, Map* match_map) {
10564 DCHECK(is_inline_cache_stub()); 10587 DCHECK(is_inline_cache_stub());
10565 DisallowHeapAllocation no_allocation; 10588 DisallowHeapAllocation no_allocation;
10566 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10589 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10567 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10590 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10568 RelocInfo* info = it.rinfo(); 10591 RelocInfo* info = it.rinfo();
10569 Object* object = info->target_object(); 10592 Object* object = info->target_object();
10593 if (object->IsWeakCell()) object = WeakCell::cast(object)->value();
10570 if (object->IsHeapObject()) { 10594 if (object->IsHeapObject()) {
10571 if (HeapObject::cast(object)->map() == match_map) { 10595 if (HeapObject::cast(object)->map() == match_map) {
10572 if (--n == 0) return object; 10596 if (--n == 0) return object;
10573 } 10597 }
10574 } 10598 }
10575 } 10599 }
10576 return NULL; 10600 return NULL;
10577 } 10601 }
10578 10602
10579 10603
(...skipping 12 matching lines...) Expand all
10592 void Code::FindAndReplace(const FindAndReplacePattern& pattern) { 10616 void Code::FindAndReplace(const FindAndReplacePattern& pattern) {
10593 DCHECK(is_inline_cache_stub() || is_handler()); 10617 DCHECK(is_inline_cache_stub() || is_handler());
10594 DisallowHeapAllocation no_allocation; 10618 DisallowHeapAllocation no_allocation;
10595 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10619 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10596 STATIC_ASSERT(FindAndReplacePattern::kMaxCount < 32); 10620 STATIC_ASSERT(FindAndReplacePattern::kMaxCount < 32);
10597 int current_pattern = 0; 10621 int current_pattern = 0;
10598 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10622 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10599 RelocInfo* info = it.rinfo(); 10623 RelocInfo* info = it.rinfo();
10600 Object* object = info->target_object(); 10624 Object* object = info->target_object();
10601 if (object->IsHeapObject()) { 10625 if (object->IsHeapObject()) {
10626 DCHECK(!object->IsWeakCell());
10602 Map* map = HeapObject::cast(object)->map(); 10627 Map* map = HeapObject::cast(object)->map();
10603 if (map == *pattern.find_[current_pattern]) { 10628 if (map == *pattern.find_[current_pattern]) {
10604 info->set_target_object(*pattern.replace_[current_pattern]); 10629 info->set_target_object(*pattern.replace_[current_pattern]);
10605 if (++current_pattern == pattern.count_) return; 10630 if (++current_pattern == pattern.count_) return;
10606 } 10631 }
10607 } 10632 }
10608 } 10633 }
10609 UNREACHABLE(); 10634 UNREACHABLE();
10610 } 10635 }
10611 10636
10612 10637
10613 void Code::FindAllMaps(MapHandleList* maps) { 10638 void Code::FindAllMaps(MapHandleList* maps) {
10614 DCHECK(is_inline_cache_stub()); 10639 DCHECK(is_inline_cache_stub());
10615 DisallowHeapAllocation no_allocation; 10640 DisallowHeapAllocation no_allocation;
10616 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10641 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10617 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10642 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10618 RelocInfo* info = it.rinfo(); 10643 RelocInfo* info = it.rinfo();
10619 Object* object = info->target_object(); 10644 Object* object = info->target_object();
10645 if (object->IsWeakCell()) object = WeakCell::cast(object)->value();
10620 if (object->IsMap()) maps->Add(handle(Map::cast(object))); 10646 if (object->IsMap()) maps->Add(handle(Map::cast(object)));
10621 } 10647 }
10622 } 10648 }
10623 10649
10624 10650
10625 Code* Code::FindFirstHandler() { 10651 Code* Code::FindFirstHandler() {
10626 DCHECK(is_inline_cache_stub()); 10652 DCHECK(is_inline_cache_stub());
10627 DisallowHeapAllocation no_allocation; 10653 DisallowHeapAllocation no_allocation;
10628 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); 10654 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
10655 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10656 bool skip_next_handler = false;
10629 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10657 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10630 RelocInfo* info = it.rinfo(); 10658 RelocInfo* info = it.rinfo();
10631 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); 10659 if (info->rmode() == RelocInfo::EMBEDDED_OBJECT) {
10632 if (code->kind() == Code::HANDLER) return code; 10660 Object* obj = info->target_object();
10661 skip_next_handler |= obj->IsWeakCell() && WeakCell::cast(obj)->cleared();
10662 } else {
10663 Code* code = Code::GetCodeFromTargetAddress(info->target_address());
10664 if (code->kind() == Code::HANDLER) {
10665 if (!skip_next_handler) return code;
10666 skip_next_handler = false;
10667 }
10668 }
10633 } 10669 }
10634 return NULL; 10670 return NULL;
10635 } 10671 }
10636 10672
10637 10673
10638 bool Code::FindHandlers(CodeHandleList* code_list, int length) { 10674 bool Code::FindHandlers(CodeHandleList* code_list, int length) {
10639 DCHECK(is_inline_cache_stub()); 10675 DCHECK(is_inline_cache_stub());
10640 DisallowHeapAllocation no_allocation; 10676 DisallowHeapAllocation no_allocation;
10641 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); 10677 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
10678 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10679 bool skip_next_handler = false;
10642 int i = 0; 10680 int i = 0;
10643 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10681 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10644 if (i == length) return true; 10682 if (i == length) return true;
10645 RelocInfo* info = it.rinfo(); 10683 RelocInfo* info = it.rinfo();
10646 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); 10684 if (info->rmode() == RelocInfo::EMBEDDED_OBJECT) {
10647 // IC stubs with handlers never contain non-handler code objects before 10685 Object* obj = info->target_object();
10648 // handler targets. 10686 skip_next_handler |= obj->IsWeakCell() && WeakCell::cast(obj)->cleared();
10649 if (code->kind() != Code::HANDLER) break; 10687 } else {
10650 code_list->Add(Handle<Code>(code)); 10688 Code* code = Code::GetCodeFromTargetAddress(info->target_address());
10651 i++; 10689 // IC stubs with handlers never contain non-handler code objects before
10690 // handler targets.
10691 if (code->kind() != Code::HANDLER) break;
10692 if (!skip_next_handler) {
10693 code_list->Add(Handle<Code>(code));
10694 i++;
10695 }
10696 skip_next_handler = false;
10697 }
10652 } 10698 }
10653 return i == length; 10699 return i == length;
10654 } 10700 }
10655 10701
10656 10702
10657 MaybeHandle<Code> Code::FindHandlerForMap(Map* map) { 10703 MaybeHandle<Code> Code::FindHandlerForMap(Map* map) {
10658 DCHECK(is_inline_cache_stub()); 10704 DCHECK(is_inline_cache_stub());
10659 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | 10705 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
10660 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10706 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10661 bool return_next = false; 10707 bool return_next = false;
10662 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10708 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10663 RelocInfo* info = it.rinfo(); 10709 RelocInfo* info = it.rinfo();
10664 if (info->rmode() == RelocInfo::EMBEDDED_OBJECT) { 10710 if (info->rmode() == RelocInfo::EMBEDDED_OBJECT) {
10665 Object* object = info->target_object(); 10711 Object* object = info->target_object();
10712 if (object->IsWeakCell()) object = WeakCell::cast(object)->value();
10666 if (object == map) return_next = true; 10713 if (object == map) return_next = true;
10667 } else if (return_next) { 10714 } else if (return_next) {
10668 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); 10715 Code* code = Code::GetCodeFromTargetAddress(info->target_address());
10669 DCHECK(code->kind() == Code::HANDLER); 10716 DCHECK(code->kind() == Code::HANDLER);
10670 return handle(code); 10717 return handle(code);
10671 } 10718 }
10672 } 10719 }
10673 return MaybeHandle<Code>(); 10720 return MaybeHandle<Code>();
10674 } 10721 }
10675 10722
(...skipping 6173 matching lines...) Expand 10 before | Expand all | Expand 10 after
16849 Handle<DependentCode> codes = 16896 Handle<DependentCode> codes =
16850 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), 16897 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()),
16851 DependentCode::kPropertyCellChangedGroup, 16898 DependentCode::kPropertyCellChangedGroup,
16852 info->object_wrapper()); 16899 info->object_wrapper());
16853 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 16900 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
16854 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 16901 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
16855 cell, info->zone()); 16902 cell, info->zone());
16856 } 16903 }
16857 16904
16858 } } // namespace v8::internal 16905 } } // namespace v8::internal
OLDNEW
« src/arm64/lithium-codegen-arm64.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698