Index: runtime/vm/cha.cc |
=================================================================== |
--- runtime/vm/cha.cc (revision 32284) |
+++ runtime/vm/cha.cc (working copy) |
@@ -13,16 +13,27 @@ |
namespace dart { |
bool CHA::HasSubclasses(intptr_t cid) { |
+ Isolate* isolate = Isolate::Current(); |
+ const bool has_subclasses = HasSubclassesSafe(cid); |
+ if (!has_subclasses) { |
+ isolate->set_cha_used(true); |
+ } |
+ return has_subclasses; |
+} |
+ |
+ |
+bool CHA::HasSubclassesSafe(intptr_t cid) { |
ASSERT(cid >= kInstanceCid); |
- const ClassTable& class_table = *Isolate::Current()->class_table(); |
- const Class& cls = Class::Handle(class_table.At(cid)); |
+ Isolate* isolate = Isolate::Current(); |
+ const ClassTable& class_table = *isolate->class_table(); |
+ const Class& cls = Class::Handle(isolate, class_table.At(cid)); |
ASSERT(!cls.IsNull()); |
if (cls.IsObjectClass()) { |
// Class Object has subclasses, although we do not keep track of them. |
return true; |
} |
const GrowableObjectArray& cls_direct_subclasses = |
- GrowableObjectArray::Handle(cls.direct_subclasses()); |
+ GrowableObjectArray::Handle(isolate, cls.direct_subclasses()); |
return |
!cls_direct_subclasses.IsNull() && (cls_direct_subclasses.Length() > 0); |
} |
@@ -61,26 +72,32 @@ |
ZoneGrowableArray<intptr_t>* CHA::GetSubclassIdsOf(intptr_t cid) { |
ASSERT(cid > kInstanceCid); |
- const ClassTable& class_table = *Isolate::Current()->class_table(); |
- const Class& cls = Class::Handle(class_table.At(cid)); |
+ Isolate* isolate = Isolate::Current(); |
+ const ClassTable& class_table = *isolate->class_table(); |
+ const Class& cls = Class::Handle(isolate, class_table.At(cid)); |
ASSERT(!cls.IsNull()); |
ZoneGrowableArray<intptr_t>* ids = new ZoneGrowableArray<intptr_t>(); |
CollectSubclassIds(ids, cls); |
+ isolate->set_cha_used(true); |
return ids; |
} |
bool CHA::HasOverride(const Class& cls, const String& function_name) { |
+ Isolate* isolate = Isolate::Current(); |
const GrowableObjectArray& cls_direct_subclasses = |
- GrowableObjectArray::Handle(cls.direct_subclasses()); |
+ GrowableObjectArray::Handle(isolate, cls.direct_subclasses()); |
// Subclasses of Object are not tracked by CHA. Safely assume that overrides |
// exist. |
- if (cls.IsObjectClass()) return true; |
+ if (cls.IsObjectClass()) { |
+ return true; |
+ } |
if (cls_direct_subclasses.IsNull()) { |
+ isolate->set_cha_used(true); |
return false; |
} |
- Class& direct_subclass = Class::Handle(); |
+ Class& direct_subclass = Class::Handle(isolate); |
for (intptr_t i = 0; i < cls_direct_subclasses.Length(); i++) { |
direct_subclass ^= cls_direct_subclasses.At(i); |
// Unfinalized classes are treated as non-existent for CHA purposes, |
@@ -94,6 +111,7 @@ |
return true; |
} |
} |
+ isolate->set_cha_used(true); |
return false; |
} |
@@ -101,20 +119,22 @@ |
ZoneGrowableArray<Function*>* CHA::GetNamedInstanceFunctionsOf( |
const ZoneGrowableArray<intptr_t>& cids, |
const String& function_name) { |
+ Isolate* isolate = Isolate::Current(); |
ASSERT(!function_name.IsNull()); |
- const ClassTable& class_table = *Isolate::Current()->class_table(); |
+ const ClassTable& class_table = *isolate->class_table(); |
ZoneGrowableArray<Function*>* functions = new ZoneGrowableArray<Function*>(); |
- Class& cls = Class::Handle(); |
- Function& cls_function = Function::Handle(); |
+ Class& cls = Class::Handle(isolate); |
+ Function& cls_function = Function::Handle(isolate); |
for (intptr_t i = 0; i < cids.length(); i++) { |
const intptr_t cid = cids[i]; |
ASSERT(cid > kInstanceCid); |
cls = class_table.At(cid); |
cls_function = cls.LookupDynamicFunction(function_name); |
if (!cls_function.IsNull()) { |
- functions->Add(&Function::ZoneHandle(cls_function.raw())); |
+ functions->Add(&Function::ZoneHandle(isolate, cls_function.raw())); |
} |
} |
+ isolate->set_cha_used(true); |
return functions; |
} |
@@ -122,10 +142,12 @@ |
ZoneGrowableArray<Function*>* CHA::GetOverridesOf(const Function& function) { |
ASSERT(!function.IsNull()); |
ASSERT(function.IsDynamicFunction()); |
- const Class& function_owner = Class::Handle(function.Owner()); |
- const String& function_name = String::Handle(function.name()); |
+ Isolate* isolate = Isolate::Current(); |
+ const Class& function_owner = Class::Handle(isolate, function.Owner()); |
+ const String& function_name = String::Handle(isolate, function.name()); |
ZoneGrowableArray<intptr_t>* cids = new ZoneGrowableArray<intptr_t>(); |
CollectSubclassIds(cids, function_owner); |
+ isolate->set_cha_used(true); |
return GetNamedInstanceFunctionsOf(*cids, function_name); |
} |