Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/factory.h" | |
| 6 #include "src/handles-inl.h" | |
| 7 #include "src/isolate.h" | |
| 8 #include "src/objects-inl.h" | |
| 9 #include "src/zone.h" | |
| 10 | |
| 11 #include "src/dependencies.h" | |
| 12 | |
| 13 namespace v8 { | |
| 14 namespace internal { | |
| 15 | |
| 16 void CompilationDependencies::Insert(DependentCode::DependencyGroup group, | |
| 17 Handle<HeapObject> object) { | |
| 18 if (groups_[group] == nullptr) { | |
| 19 groups_[group] = new (zone_) ZoneList<Handle<HeapObject>>(2, zone_); | |
| 20 } | |
| 21 groups_[group]->Add(object, zone_); | |
| 22 | |
| 23 if (object_wrapper_.is_null()) { | |
| 24 // Allocate the wrapper if necessary. | |
| 25 object_wrapper_ = | |
| 26 isolate_->factory()->NewForeign(reinterpret_cast<Address>(this)); | |
| 27 } | |
| 28 | |
| 29 // Insert this wrapper into the dependent code list. | |
| 30 Handle<DependentCode> old_dependent_code( | |
| 31 DependentCode::ForObject(object, group), isolate_); | |
| 32 Handle<DependentCode> new_dependent_code = | |
| 33 DependentCode::InsertCompilationDependencies(old_dependent_code, group, | |
| 34 object_wrapper_); | |
| 35 | |
| 36 if (!new_dependent_code.is_identical_to(old_dependent_code)) { | |
| 37 if (object->IsMap()) { | |
|
Toon Verwaest
2015/04/16 13:38:18
What about adding something similar to DependentCo
| |
| 38 Handle<Map>::cast(object)->set_dependent_code(*new_dependent_code); | |
| 39 } else if (object->IsPropertyCell()) { | |
| 40 Handle<PropertyCell>::cast(object) | |
| 41 ->set_dependent_code(*new_dependent_code); | |
| 42 } else if (object->IsAllocationSite()) { | |
| 43 Handle<AllocationSite>::cast(object) | |
| 44 ->set_dependent_code(*new_dependent_code); | |
| 45 } else { | |
| 46 UNREACHABLE(); | |
| 47 } | |
| 48 } | |
| 49 } | |
| 50 | |
| 51 | |
| 52 void CompilationDependencies::Commit(Handle<Code> code) { | |
| 53 if (IsEmpty()) return; | |
| 54 | |
| 55 DCHECK(!object_wrapper_.is_null()); | |
| 56 Handle<WeakCell> cell = Code::WeakCellFor(code); | |
| 57 AllowDeferredHandleDereference get_wrapper; | |
| 58 for (int i = 0; i < DependentCode::kGroupCount; i++) { | |
| 59 ZoneList<Handle<HeapObject>>* group_objects = groups_[i]; | |
| 60 if (group_objects == NULL) continue; | |
| 61 for (int j = 0; j < group_objects->length(); j++) { | |
| 62 DependentCode::DependencyGroup group = | |
| 63 static_cast<DependentCode::DependencyGroup>(i); | |
| 64 DependentCode* dependent_code = | |
| 65 DependentCode::ForObject(group_objects->at(j), group); | |
| 66 dependent_code->UpdateToFinishedCode(group, *object_wrapper_, *cell); | |
| 67 } | |
| 68 groups_[i] = nullptr; // Zone-allocated, no need to delete. | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 | |
| 73 void CompilationDependencies::Rollback() { | |
| 74 if (IsEmpty()) return; | |
| 75 | |
| 76 AllowDeferredHandleDereference get_wrapper; | |
| 77 // Unregister from all dependent maps if not yet committed. | |
| 78 for (int i = 0; i < DependentCode::kGroupCount; i++) { | |
| 79 ZoneList<Handle<HeapObject>>* group_objects = groups_[i]; | |
| 80 if (group_objects == NULL) continue; | |
| 81 for (int j = 0; j < group_objects->length(); j++) { | |
| 82 DependentCode::DependencyGroup group = | |
| 83 static_cast<DependentCode::DependencyGroup>(i); | |
| 84 DependentCode* dependent_code = | |
| 85 DependentCode::ForObject(group_objects->at(j), group); | |
| 86 dependent_code->RemoveCompilationDependencies(group, *object_wrapper_); | |
| 87 } | |
| 88 groups_[i] = nullptr; // Zone-allocated, no need to delete. | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 | |
| 93 void CompilationDependencies::AssumeTransitionStable( | |
| 94 Handle<AllocationSite> site) { | |
| 95 // Do nothing if the object doesn't have any useful element transitions left. | |
| 96 ElementsKind kind = | |
| 97 site->SitePointsToLiteral() | |
| 98 ? JSObject::cast(site->transition_info())->GetElementsKind() | |
| 99 : site->GetElementsKind(); | |
| 100 if (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE) { | |
| 101 Insert(DependentCode::kAllocationSiteTransitionChangedGroup, site); | |
| 102 } | |
| 103 } | |
| 104 } | |
| 105 } // namespace v8::internal | |
| OLD | NEW |