| 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());
|
|
|