Chromium Code Reviews| Index: src/dependencies.cc |
| diff --git a/src/dependencies.cc b/src/dependencies.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..eb156e199109973d91431d5ce90d7235c24b1726 |
| --- /dev/null |
| +++ b/src/dependencies.cc |
| @@ -0,0 +1,105 @@ |
| +// Copyright 2015 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "src/factory.h" |
| +#include "src/handles-inl.h" |
| +#include "src/isolate.h" |
| +#include "src/objects-inl.h" |
| +#include "src/zone.h" |
| + |
| +#include "src/dependencies.h" |
| + |
| +namespace v8 { |
| +namespace internal { |
| + |
| +void CompilationDependencies::Insert(DependentCode::DependencyGroup group, |
| + Handle<HeapObject> object) { |
| + if (groups_[group] == nullptr) { |
| + groups_[group] = new (zone_) ZoneList<Handle<HeapObject>>(2, zone_); |
| + } |
| + groups_[group]->Add(object, zone_); |
| + |
| + if (object_wrapper_.is_null()) { |
| + // Allocate the wrapper if necessary. |
| + object_wrapper_ = |
| + isolate_->factory()->NewForeign(reinterpret_cast<Address>(this)); |
| + } |
| + |
| + // Insert this wrapper into the dependent code list. |
| + Handle<DependentCode> old_dependent_code( |
| + DependentCode::ForObject(object, group), isolate_); |
| + Handle<DependentCode> new_dependent_code = |
| + DependentCode::InsertCompilationDependencies(old_dependent_code, group, |
| + object_wrapper_); |
| + |
| + if (!new_dependent_code.is_identical_to(old_dependent_code)) { |
| + if (object->IsMap()) { |
|
Toon Verwaest
2015/04/16 13:38:18
What about adding something similar to DependentCo
|
| + Handle<Map>::cast(object)->set_dependent_code(*new_dependent_code); |
| + } else if (object->IsPropertyCell()) { |
| + Handle<PropertyCell>::cast(object) |
| + ->set_dependent_code(*new_dependent_code); |
| + } else if (object->IsAllocationSite()) { |
| + Handle<AllocationSite>::cast(object) |
| + ->set_dependent_code(*new_dependent_code); |
| + } else { |
| + UNREACHABLE(); |
| + } |
| + } |
| +} |
| + |
| + |
| +void CompilationDependencies::Commit(Handle<Code> code) { |
| + if (IsEmpty()) return; |
| + |
| + DCHECK(!object_wrapper_.is_null()); |
| + Handle<WeakCell> cell = Code::WeakCellFor(code); |
| + AllowDeferredHandleDereference get_wrapper; |
| + for (int i = 0; i < DependentCode::kGroupCount; i++) { |
| + ZoneList<Handle<HeapObject>>* group_objects = groups_[i]; |
| + if (group_objects == NULL) continue; |
| + for (int j = 0; j < group_objects->length(); j++) { |
| + DependentCode::DependencyGroup group = |
| + static_cast<DependentCode::DependencyGroup>(i); |
| + DependentCode* dependent_code = |
| + DependentCode::ForObject(group_objects->at(j), group); |
| + dependent_code->UpdateToFinishedCode(group, *object_wrapper_, *cell); |
| + } |
| + groups_[i] = nullptr; // Zone-allocated, no need to delete. |
| + } |
| +} |
| + |
| + |
| +void CompilationDependencies::Rollback() { |
| + if (IsEmpty()) return; |
| + |
| + AllowDeferredHandleDereference get_wrapper; |
| + // Unregister from all dependent maps if not yet committed. |
| + for (int i = 0; i < DependentCode::kGroupCount; i++) { |
| + ZoneList<Handle<HeapObject>>* group_objects = groups_[i]; |
| + if (group_objects == NULL) continue; |
| + for (int j = 0; j < group_objects->length(); j++) { |
| + DependentCode::DependencyGroup group = |
| + static_cast<DependentCode::DependencyGroup>(i); |
| + DependentCode* dependent_code = |
| + DependentCode::ForObject(group_objects->at(j), group); |
| + dependent_code->RemoveCompilationDependencies(group, *object_wrapper_); |
| + } |
| + groups_[i] = nullptr; // Zone-allocated, no need to delete. |
| + } |
| +} |
| + |
| + |
| +void CompilationDependencies::AssumeTransitionStable( |
| + Handle<AllocationSite> site) { |
| + // Do nothing if the object doesn't have any useful element transitions left. |
| + ElementsKind kind = |
| + site->SitePointsToLiteral() |
| + ? JSObject::cast(site->transition_info())->GetElementsKind() |
| + : site->GetElementsKind(); |
| + if (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE) { |
| + Insert(DependentCode::kAllocationSiteTransitionChangedGroup, site); |
| + } |
| +} |
| +} |
| +} // namespace v8::internal |