Index: runtime/vm/class_finalizer.cc |
=================================================================== |
--- runtime/vm/class_finalizer.cc (revision 30540) |
+++ runtime/vm/class_finalizer.cc (working copy) |
@@ -89,20 +89,15 @@ |
// Use array instead of set since we expect very few subclassed classes |
// to occur. |
static void CollectFinalizedSuperClasses( |
- const GrowableObjectArray& pending_classes, |
- GrowableArray<intptr_t>* finalized_super_classes) { |
- Class& cls = Class::Handle(); |
+ const Class& cls_, GrowableArray<intptr_t>* finalized_super_classes) { |
+ Class& cls = Class::Handle(cls_.raw()); |
AbstractType& super_type = Type::Handle(); |
- for (intptr_t i = 0; i < pending_classes.Length(); i++) { |
- cls ^= pending_classes.At(i); |
- ASSERT(!cls.is_finalized()); |
- super_type = cls.super_type(); |
- if (!super_type.IsNull()) { |
- if (!super_type.IsMalformed() && super_type.HasResolvedTypeClass()) { |
- cls ^= super_type.type_class(); |
- if (cls.is_finalized()) { |
- AddSuperType(super_type, finalized_super_classes); |
- } |
+ super_type = cls.super_type(); |
+ if (!super_type.IsNull()) { |
+ if (!super_type.IsMalformed() && super_type.HasResolvedTypeClass()) { |
+ cls ^= super_type.type_class(); |
+ if (cls.is_finalized()) { |
+ AddSuperType(super_type, finalized_super_classes); |
} |
} |
} |
@@ -112,7 +107,7 @@ |
// Class finalization occurs: |
// a) when bootstrap process completes (VerifyBootstrapClasses). |
// b) after the user classes are loaded (dart_api). |
-bool ClassFinalizer::FinalizePendingClasses() { |
+bool ClassFinalizer::FinalizePendingClassInterfaces() { |
Ivan Posva
2013/11/21 23:04:09
This is not finalizing the class's interface. Actu
srdjan
2013/11/22 00:08:14
Renaming to FinalizeTypeHierarchy
|
bool retval = true; |
Isolate* isolate = Isolate::Current(); |
ASSERT(isolate != NULL); |
@@ -126,7 +121,6 @@ |
return true; |
} |
- GrowableArray<intptr_t> added_subclasses_to_cids; |
LongJump* base = isolate->long_jump_base(); |
LongJump jump; |
isolate->set_long_jump_base(&jump); |
@@ -134,9 +128,6 @@ |
GrowableObjectArray& class_array = GrowableObjectArray::Handle(); |
class_array = object_store->pending_classes(); |
ASSERT(!class_array.IsNull()); |
- // Collect superclasses that were already finalized before this run of |
- // finalization. |
- CollectFinalizedSuperClasses(class_array, &added_subclasses_to_cids); |
Class& cls = Class::Handle(); |
// First resolve all superclasses. |
for (intptr_t i = 0; i < class_array.Length(); i++) { |
@@ -163,9 +154,6 @@ |
retval = false; |
} |
isolate->set_long_jump_base(base); |
- if (FLAG_use_cha) { |
- RemoveOptimizedCode(added_subclasses_to_cids); |
- } |
return retval; |
} |
@@ -238,7 +226,7 @@ |
} |
// Finalize classes that aren't pre-finalized by Object::Init(). |
- if (!FinalizePendingClasses()) { |
+ if (!FinalizePendingClassInterfaces()) { |
// TODO(srdjan): Exit like a real VM instead. |
const Error& err = Error::Handle(object_store->sticky_error()); |
OS::PrintErr("Could not verify bootstrap classes : %s\n", |
@@ -2054,6 +2042,8 @@ |
// the class conflict with inherited methods. |
ApplyMixinMembers(cls); |
} |
+ GrowableArray<intptr_t> added_subclasses_to_cids; |
+ CollectFinalizedSuperClasses(cls, &added_subclasses_to_cids); |
// Ensure super class is finalized. |
const Class& super = Class::Handle(cls.SuperClass()); |
if (!super.IsNull()) { |
@@ -2081,6 +2071,9 @@ |
if (cls.is_const()) { |
CheckForLegalConstClass(cls); |
} |
+ if (FLAG_use_cha) { |
+ RemoveOptimizedCode(added_subclasses_to_cids); |
Ivan Posva
2013/11/21 23:04:09
This will add Object to the list, but Object never
srdjan
2013/11/22 00:08:14
Modified CollectFinalizedSuperClasses to exclude o
|
+ } |
} |