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 |