OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/cha.h" | 5 #include "vm/cha.h" |
6 #include "vm/class_table.h" | 6 #include "vm/class_table.h" |
7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
8 #include "vm/freelist.h" | 8 #include "vm/freelist.h" |
9 #include "vm/object.h" | 9 #include "vm/object.h" |
10 #include "vm/raw_object.h" | 10 #include "vm/raw_object.h" |
11 #include "vm/visitor.h" | 11 #include "vm/visitor.h" |
12 | 12 |
13 namespace dart { | 13 namespace dart { |
14 | 14 |
15 void CHA::AddToGuardedClasses(const Class& cls, intptr_t subclass_count) { | 15 void CHA::AddToGuardedClasses(const Class& cls, intptr_t subclass_count) { |
16 for (intptr_t i = 0; i < guarded_classes_.length(); i++) { | 16 for (intptr_t i = 0; i < guarded_classes_.length(); i++) { |
17 if (guarded_classes_[i].cls->raw() == cls.raw()) { | 17 if (guarded_classes_[i].cls->raw() == cls.raw()) { |
18 return; | 18 return; |
19 } | 19 } |
20 } | 20 } |
21 GuardedClassInfo info = { | 21 GuardedClassInfo info = {&Class::ZoneHandle(thread_->zone(), cls.raw()), |
22 &Class::ZoneHandle(thread_->zone(), cls.raw()), | 22 subclass_count}; |
23 subclass_count | |
24 }; | |
25 guarded_classes_.Add(info); | 23 guarded_classes_.Add(info); |
26 return; | 24 return; |
27 } | 25 } |
28 | 26 |
29 | 27 |
30 bool CHA::IsGuardedClass(intptr_t cid) const { | 28 bool CHA::IsGuardedClass(intptr_t cid) const { |
31 for (intptr_t i = 0; i < guarded_classes_.length(); ++i) { | 29 for (intptr_t i = 0; i < guarded_classes_.length(); ++i) { |
32 if (guarded_classes_[i].cls->id() == cid) return true; | 30 if (guarded_classes_[i].cls->id() == cid) return true; |
33 } | 31 } |
34 return false; | 32 return false; |
(...skipping 20 matching lines...) Expand all Loading... |
55 | 53 |
56 | 54 |
57 bool CHA::HasSubclasses(intptr_t cid) const { | 55 bool CHA::HasSubclasses(intptr_t cid) const { |
58 const ClassTable& class_table = *thread_->isolate()->class_table(); | 56 const ClassTable& class_table = *thread_->isolate()->class_table(); |
59 Class& cls = Class::Handle(thread_->zone(), class_table.At(cid)); | 57 Class& cls = Class::Handle(thread_->zone(), class_table.At(cid)); |
60 return HasSubclasses(cls); | 58 return HasSubclasses(cls); |
61 } | 59 } |
62 | 60 |
63 | 61 |
64 bool CHA::ConcreteSubclasses(const Class& cls, | 62 bool CHA::ConcreteSubclasses(const Class& cls, |
65 GrowableArray<intptr_t> *class_ids) { | 63 GrowableArray<intptr_t>* class_ids) { |
66 if (cls.InVMHeap()) return false; | 64 if (cls.InVMHeap()) return false; |
67 if (cls.IsObjectClass()) return false; | 65 if (cls.IsObjectClass()) return false; |
68 | 66 |
69 if (!cls.is_abstract()) { | 67 if (!cls.is_abstract()) { |
70 class_ids->Add(cls.id()); | 68 class_ids->Add(cls.id()); |
71 } | 69 } |
72 | 70 |
73 const GrowableObjectArray& direct_subclasses = | 71 const GrowableObjectArray& direct_subclasses = |
74 GrowableObjectArray::Handle(cls.direct_subclasses()); | 72 GrowableObjectArray::Handle(cls.direct_subclasses()); |
75 if (direct_subclasses.IsNull()) { | 73 if (direct_subclasses.IsNull()) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 Class& direct_subclass = Class::Handle(thread_->zone()); | 152 Class& direct_subclass = Class::Handle(thread_->zone()); |
155 for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) { | 153 for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) { |
156 direct_subclass ^= cls_direct_subclasses.At(i); | 154 direct_subclass ^= cls_direct_subclasses.At(i); |
157 // Unfinalized classes are treated as non-existent for CHA purposes, | 155 // Unfinalized classes are treated as non-existent for CHA purposes, |
158 // as that means that no instance of that class exists at runtime. | 156 // as that means that no instance of that class exists at runtime. |
159 if (!direct_subclass.is_finalized()) { | 157 if (!direct_subclass.is_finalized()) { |
160 continue; | 158 continue; |
161 } | 159 } |
162 | 160 |
163 if (direct_subclass.LookupDynamicFunction(function_name) != | 161 if (direct_subclass.LookupDynamicFunction(function_name) != |
164 Function::null()) { | 162 Function::null()) { |
165 return true; | 163 return true; |
166 } | 164 } |
167 | 165 |
168 if (HasOverride(direct_subclass, function_name, subclasses_count)) { | 166 if (HasOverride(direct_subclass, function_name, subclasses_count)) { |
169 return true; | 167 return true; |
170 } | 168 } |
171 | 169 |
172 (*subclasses_count)++; | 170 (*subclasses_count)++; |
173 } | 171 } |
174 | 172 |
175 return false; | 173 return false; |
176 } | 174 } |
177 | 175 |
178 | 176 |
179 void CHA::RegisterDependencies(const Code& code) const { | 177 void CHA::RegisterDependencies(const Code& code) const { |
180 for (intptr_t i = 0; i < guarded_classes_.length(); ++i) { | 178 for (intptr_t i = 0; i < guarded_classes_.length(); ++i) { |
181 guarded_classes_[i].cls->RegisterCHACode(code); | 179 guarded_classes_[i].cls->RegisterCHACode(code); |
182 } | 180 } |
183 } | 181 } |
184 | 182 |
185 | 183 |
186 } // namespace dart | 184 } // namespace dart |
OLD | NEW |