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

Unified Diff: runtime/vm/cha.cc

Issue 150923002: Mark optimized code that used CHA for optimization so that lazy class 'finalization' does not inval… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
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);
}
« no previous file with comments | « runtime/vm/cha.h ('k') | runtime/vm/class_finalizer.cc » ('j') | runtime/vm/isolate.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698