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

Side by Side Diff: src/dependencies.cc

Issue 1095433002: Refactor compilation dependency handling. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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
« no previous file with comments | « src/dependencies.h ('k') | src/hydrogen.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « src/dependencies.h ('k') | src/hydrogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698