Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 7523) |
+++ runtime/vm/object.cc (working copy) |
@@ -606,7 +606,7 @@ |
object_store->set_object_class(cls); |
cls.set_name(String::Handle(String::NewSymbol("Object"))); |
cls.set_script(script); |
- cls.set_class_state(RawClass::kPreFinalized); |
+ cls.set_is_prefinalized(); |
core_lib.AddClass(cls); |
pending_classes.Add(cls, Heap::kOld); |
type = Type::NewNonParameterizedType(cls); |
@@ -998,6 +998,14 @@ |
RawType* Class::SignatureType() const { |
+ ASSERT(IsSignatureClass()); |
+ const Function& function = Function::Handle(signature_function()); |
+ ASSERT(!function.IsNull()); |
+ if (function.signature_class() != raw()) { |
+ // This class is a function type alias. Return the canonical signature type. |
+ const Class& canonical_class = Class::Handle(function.signature_class()); |
+ return canonical_class.SignatureType(); |
+ } |
// Return the first canonical signature type if already computed. |
const Array& signature_types = Array::Handle(canonical_types()); |
if (signature_types.Length() > 0) { |
@@ -1007,7 +1015,6 @@ |
return signature_type.raw(); |
} |
} |
- ASSERT(IsSignatureClass()); |
// A signature class extends class Instance and is parameterized in the same |
// way as the owner class of its non-static signature function. |
// It is not type parameterized if its signature function is static. |
@@ -1463,8 +1470,14 @@ |
// the signature class. |
if (signature_function.signature_class() == Object::null()) { |
signature_function.set_signature_class(result); |
+ result.set_is_finalized(); |
+ } else { |
+ // This new signature class is an alias. |
+ ASSERT(!result.IsCanonicalSignatureClass()); |
+ // Do not yet mark it as finalized, so that the class finalizer can check it |
+ // for illegal self references. |
+ result.set_is_prefinalized(); |
} |
- result.set_is_finalized(); |
// Instances of a signature class can only be closures. |
ASSERT(result.instance_size() == Closure::InstanceSize()); |
// Cache the signature type as the first canonicalized type in result. |
@@ -1657,6 +1670,12 @@ |
} |
+void Class::set_is_prefinalized() const { |
+ ASSERT(!is_finalized()); |
+ set_class_state(RawClass::kPreFinalized); |
+} |
+ |
+ |
void Class::set_interfaces(const Array& value) const { |
// Verification and resolving of interfaces occurs in finalizer. |
ASSERT(!value.IsNull()); |