| Index: runtime/vm/class_finalizer.cc
|
| diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
|
| index 81860b2c3437c77a5de3fc5a338c5d786acea8f2..1a256cd8da20a8af2a8b55b80ca91ba520bc9f94 100644
|
| --- a/runtime/vm/class_finalizer.cc
|
| +++ b/runtime/vm/class_finalizer.cc
|
| @@ -456,10 +456,9 @@ void ClassFinalizer::ResolveRedirectingFactoryTarget(
|
| }
|
|
|
|
|
| -RawAbstractType* ClassFinalizer::ResolveTypeClass(const Class& cls,
|
| - const Type& type) {
|
| +void ClassFinalizer::ResolveTypeClass(const Class& cls, const Type& type) {
|
| if (type.IsFinalized()) {
|
| - return type.raw();
|
| + return;
|
| }
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Resolve type class of '%s'\n",
|
| @@ -489,66 +488,61 @@ RawAbstractType* ClassFinalizer::ResolveTypeClass(const Class& cls,
|
| "cannot resolve class '%s' from '%s'",
|
| String::Handle(unresolved_class.Name()).ToCString(),
|
| String::Handle(cls.Name()).ToCString());
|
| - return type.raw();
|
| + return;
|
| }
|
| + // Replace unresolved class with resolved type class.
|
| + type.set_type_class(type_class);
|
| }
|
| - // Promote the Type to a FunctionType in case its type class is a typedef.
|
| - if (type_class.IsTypedefClass()) {
|
| - return FunctionType::New(type_class,
|
| - TypeArguments::Handle(type.arguments()),
|
| - Function::Handle(type_class.signature_function()),
|
| - type.token_pos());
|
| + // Promote the type to a function type in case its type class is a typedef.
|
| + // Note that the type may already be a function type if it was parsed as a
|
| + // formal parameter function type.
|
| + if (!type.IsFunctionType() &&
|
| + type_class.IsTypedefClass() &&
|
| + !type.IsMalformedOrMalbounded()) {
|
| + type.set_signature(Function::Handle(type_class.signature_function()));
|
| }
|
| - // Replace unresolved class with resolved type class.
|
| - type.set_type_class(type_class);
|
| - return type.raw();
|
| + ASSERT(!type_class.IsTypedefClass() ||
|
| + (type.signature() != Function::null()));
|
| }
|
|
|
|
|
| -RawAbstractType* ClassFinalizer::ResolveType(const Class& cls,
|
| - const AbstractType& type) {
|
| +void ClassFinalizer::ResolveType(const Class& cls, const AbstractType& type) {
|
| if (type.IsResolved()) {
|
| - return type.raw();
|
| + return;
|
| }
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Resolve type '%s'\n", String::Handle(type.Name()).ToCString());
|
| }
|
| - AbstractType& resolved_type = AbstractType::Handle();
|
| if (type.IsType()) {
|
| - resolved_type = ResolveTypeClass(cls, Type::Cast(type));
|
| - if (resolved_type.IsMalformed()) {
|
| - ASSERT(resolved_type.IsResolved());
|
| - return resolved_type.raw();
|
| - }
|
| - } else {
|
| - ASSERT(type.IsFunctionType());
|
| - const Function& signature =
|
| - Function::Handle(FunctionType::Cast(type).signature());
|
| - const Class& scope_class =
|
| - Class::Handle(FunctionType::Cast(type).scope_class());
|
| - if (scope_class.IsTypedefClass()) {
|
| - ResolveSignature(scope_class, signature);
|
| - } else {
|
| - ResolveSignature(cls, signature);
|
| + ResolveTypeClass(cls, Type::Cast(type));
|
| + if (type.IsMalformed()) {
|
| + ASSERT(type.IsResolved());
|
| + return;
|
| }
|
| - resolved_type = type.raw();
|
| }
|
| - // Mark type as resolved before resolving its type arguments in order to avoid
|
| - // repeating resolution of recursive types.
|
| - resolved_type.SetIsResolved();
|
| + // Mark type as resolved before resolving its type arguments and, in case of a
|
| + // function type, its signature, in order to avoid cycles.
|
| + type.SetIsResolved();
|
| // Resolve type arguments, if any.
|
| - const TypeArguments& arguments =
|
| - TypeArguments::Handle(resolved_type.arguments());
|
| + const TypeArguments& arguments = TypeArguments::Handle(type.arguments());
|
| if (!arguments.IsNull()) {
|
| const intptr_t num_arguments = arguments.Length();
|
| AbstractType& type_argument = AbstractType::Handle();
|
| for (intptr_t i = 0; i < num_arguments; i++) {
|
| type_argument = arguments.TypeAt(i);
|
| - type_argument = ResolveType(cls, type_argument);
|
| - arguments.SetTypeAt(i, type_argument);
|
| + ResolveType(cls, type_argument);
|
| + }
|
| + }
|
| + // Resolve signature if function type.
|
| + if (type.IsFunctionType()) {
|
| + const Function& signature = Function::Handle(Type::Cast(type).signature());
|
| + const Class& scope_class = Class::Handle(type.type_class());
|
| + if (scope_class.IsTypedefClass()) {
|
| + ResolveSignature(scope_class, signature);
|
| + } else {
|
| + ResolveSignature(cls, signature);
|
| }
|
| }
|
| - return resolved_type.raw();
|
| }
|
|
|
|
|
| @@ -654,13 +648,13 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
| const Class& cls,
|
| const AbstractType& type,
|
| PendingTypes* pending_types) {
|
| - Zone* Z = Thread::Current()->zone();
|
| + Zone* zone = Thread::Current()->zone();
|
| // The type class does not need to be finalized in order to finalize the type,
|
| // however, it must at least be resolved (this was done as part of resolving
|
| // the type itself, a precondition to calling FinalizeType).
|
| // Also, the interfaces of the type class must be resolved and the type
|
| // parameters of the type class must be finalized.
|
| - Class& type_class = Class::Handle(Z, type.type_class());
|
| + Class& type_class = Class::Handle(zone, type.type_class());
|
| if (!type_class.is_type_finalized()) {
|
| FinalizeTypeParameters(type_class, pending_types);
|
| ResolveUpperBounds(type_class);
|
| @@ -673,18 +667,18 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
|
|
| // If we are not reifying types, drop type arguments.
|
| if (!FLAG_reify) {
|
| - type.set_arguments(TypeArguments::Handle(Z, TypeArguments::null()));
|
| + type.set_arguments(TypeArguments::Handle(zone, TypeArguments::null()));
|
| }
|
|
|
| // Initialize the type argument vector.
|
| // Check the number of parsed type arguments, if any.
|
| // Specifying no type arguments indicates a raw type, which is not an error.
|
| // However, type parameter bounds are checked below, even for a raw type.
|
| - TypeArguments& arguments = TypeArguments::Handle(Z, type.arguments());
|
| + TypeArguments& arguments = TypeArguments::Handle(zone, type.arguments());
|
| if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
|
| // Wrong number of type arguments. The type is mapped to the raw type.
|
| if (Isolate::Current()->error_on_bad_type()) {
|
| - const String& type_class_name = String::Handle(Z, type_class.Name());
|
| + const String& type_class_name = String::Handle(zone, type_class.Name());
|
| ReportError(cls, type.token_pos(),
|
| "wrong number of type arguments for class '%s'",
|
| type_class_name.ToCString());
|
| @@ -704,7 +698,7 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
| // The full type argument vector consists of the type arguments of the
|
| // super types of type_class, which are initialized from the parsed
|
| // type arguments, followed by the parsed type arguments.
|
| - TypeArguments& full_arguments = TypeArguments::Handle(Z);
|
| + TypeArguments& full_arguments = TypeArguments::Handle(zone);
|
| if (FLAG_reify && (num_type_arguments > 0)) {
|
| // If no type arguments were parsed and if the super types do not prepend
|
| // type arguments to the vector, we can leave the vector as null.
|
| @@ -714,7 +708,7 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
| // argument vector.
|
| const intptr_t offset = num_type_arguments - num_type_parameters;
|
| AbstractType& type_arg =
|
| - AbstractType::Handle(Z, Type::DynamicType());
|
| + AbstractType::Handle(zone, Type::DynamicType());
|
| // Leave the temporary type arguments at indices [0..offset[ as null.
|
| for (intptr_t i = 0; i < num_type_parameters; i++) {
|
| // If no type parameters were provided, a raw type is desired, so we
|
| @@ -746,8 +740,8 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
| }
|
| }
|
| if (offset > 0) {
|
| - TrailPtr instantiation_trail = new Trail(Z, 4);
|
| - Error& bound_error = Error::Handle(Z);
|
| + TrailPtr instantiation_trail = new Trail(zone, 4);
|
| + Error& bound_error = Error::Handle(zone);
|
| FinalizeTypeArguments(type_class, full_arguments, offset,
|
| &bound_error, pending_types, instantiation_trail);
|
| }
|
| @@ -768,8 +762,8 @@ intptr_t ClassFinalizer::ExpandAndFinalizeTypeArguments(
|
| !full_arguments.IsRaw(0, num_type_arguments));
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Marking type '%s' as finalized for class '%s'\n",
|
| - String::Handle(Z, type.Name()).ToCString(),
|
| - String::Handle(Z, cls.Name()).ToCString());
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| + String::Handle(zone, cls.Name()).ToCString());
|
| }
|
| // Mark the type as finalized.
|
| type.SetIsFinalized();
|
| @@ -846,7 +840,7 @@ void ClassFinalizer::FinalizeTypeArguments(
|
| super_type_arg = super_type_args.TypeAt(i);
|
| if (!super_type_arg.IsTypeRef()) {
|
| if (super_type_arg.IsBeingFinalized()) {
|
| - ASSERT(super_type_arg.IsType() || super_type_arg.IsFunctionType());
|
| + ASSERT(super_type_arg.IsType());
|
| CheckRecursiveType(cls, super_type_arg, pending_types);
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Creating TypeRef '%s': '%s'\n",
|
| @@ -1005,8 +999,7 @@ void ClassFinalizer::CheckTypeArgumentBounds(const Class& cls,
|
| TypeParameter::Cast(type_arg).parameterized_class());
|
| AbstractType& bound = AbstractType::Handle(
|
| TypeParameter::Cast(type_arg).bound());
|
| - bound = ResolveType(type_arg_cls, bound);
|
| - TypeParameter::Cast(type_arg).set_bound(bound);
|
| + ResolveType(type_arg_cls, bound);
|
| }
|
| // This may be called only if type needs to be finalized, therefore
|
| // seems OK to allocate finalized types in old space.
|
| @@ -1033,21 +1026,21 @@ void ClassFinalizer::CheckTypeArgumentBounds(const Class& cls,
|
|
|
| void ClassFinalizer::CheckTypeBounds(const Class& cls,
|
| const AbstractType& type) {
|
| - Zone* Z = Thread::Current()->zone();
|
| - ASSERT(type.IsType() || type.IsFunctionType());
|
| + Zone* zone = Thread::Current()->zone();
|
| + ASSERT(type.IsType());
|
| ASSERT(type.IsFinalized());
|
| ASSERT(!type.IsCanonical());
|
| - TypeArguments& arguments = TypeArguments::Handle(Z, type.arguments());
|
| + TypeArguments& arguments = TypeArguments::Handle(zone, type.arguments());
|
| if (arguments.IsNull()) {
|
| return;
|
| }
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Checking bounds of type '%s' for class '%s'\n",
|
| - String::Handle(Z, type.Name()).ToCString(),
|
| - String::Handle(Z, cls.Name()).ToCString());
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| + String::Handle(zone, cls.Name()).ToCString());
|
| }
|
| - const Class& type_class = Class::Handle(Z, type.type_class());
|
| - Error& bound_error = Error::Handle(Z);
|
| + const Class& type_class = Class::Handle(zone, type.type_class());
|
| + Error& bound_error = Error::Handle(zone);
|
| CheckTypeArgumentBounds(type_class, arguments, &bound_error);
|
| // CheckTypeArgumentBounds may have indirectly canonicalized this type.
|
| if (!type.IsCanonical()) {
|
| @@ -1056,22 +1049,22 @@ void ClassFinalizer::CheckTypeBounds(const Class& cls,
|
| // The bound error will be ignored in production mode.
|
| if (!bound_error.IsNull()) {
|
| // No compile-time error during finalization.
|
| - const String& type_name = String::Handle(Z, type.UserVisibleName());
|
| + const String& type_name = String::Handle(zone, type.UserVisibleName());
|
| FinalizeMalboundedType(bound_error,
|
| - Script::Handle(Z, cls.script()),
|
| + Script::Handle(zone, cls.script()),
|
| type,
|
| "type '%s' has an out of bound type argument",
|
| type_name.ToCString());
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Marking type '%s' as malbounded: %s\n",
|
| - String::Handle(Z, type.Name()).ToCString(),
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| bound_error.ToErrorCString());
|
| }
|
| }
|
| }
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Done checking bounds of type '%s': %s\n",
|
| - String::Handle(Z, type.Name()).ToCString(),
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| type.ToCString());
|
| }
|
| }
|
| @@ -1091,7 +1084,7 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
| if ((finalization >= kCanonicalize) &&
|
| !type.IsMalformed() &&
|
| !type.IsCanonical() &&
|
| - (type.IsType() || type.IsFunctionType())) {
|
| + type.IsType()) {
|
| CheckTypeBounds(cls, type);
|
| return type.Canonicalize();
|
| }
|
| @@ -1109,25 +1102,24 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
| // encountered here.
|
| ASSERT(!type.IsBeingFinalized());
|
|
|
| - Zone* Z = Thread::Current()->zone();
|
| - const AbstractType& resolved_type =
|
| - AbstractType::Handle(Z, ResolveType(cls, type));
|
| + Zone* zone = Thread::Current()->zone();
|
| + ResolveType(cls, type);
|
| // A malformed type gets mapped to a finalized type.
|
| - if (resolved_type.IsMalformed()) {
|
| - ASSERT(resolved_type.IsFinalized());
|
| - return resolved_type.raw();
|
| + if (type.IsMalformed()) {
|
| + ASSERT(type.IsFinalized());
|
| + return type.raw();
|
| }
|
|
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Finalizing type '%s' for class '%s'\n",
|
| - String::Handle(Z, resolved_type.Name()).ToCString(),
|
| - String::Handle(Z, cls.Name()).ToCString());
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| + String::Handle(zone, cls.Name()).ToCString());
|
| }
|
|
|
| - if (resolved_type.IsTypeParameter()) {
|
| - const TypeParameter& type_parameter = TypeParameter::Cast(resolved_type);
|
| + if (type.IsTypeParameter()) {
|
| + const TypeParameter& type_parameter = TypeParameter::Cast(type);
|
| const Class& parameterized_class =
|
| - Class::Handle(Z, type_parameter.parameterized_class());
|
| + Class::Handle(zone, type_parameter.parameterized_class());
|
| ASSERT(!parameterized_class.IsNull());
|
| // The index must reflect the position of this type parameter in the type
|
| // arguments vector of its parameterized class. The offset to add is the
|
| @@ -1147,7 +1139,7 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
|
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Done finalizing type parameter '%s' with index %" Pd "\n",
|
| - String::Handle(Z, type_parameter.name()).ToCString(),
|
| + String::Handle(zone, type_parameter.name()).ToCString(),
|
| type_parameter.index());
|
| }
|
|
|
| @@ -1155,18 +1147,18 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
| return type_parameter.raw();
|
| }
|
|
|
| - // At this point, we can only have a Type or a FunctionType.
|
| - ASSERT(resolved_type.IsType() || resolved_type.IsFunctionType());
|
| + // At this point, we can only have a Type.
|
| + ASSERT(type.IsType());
|
|
|
| // This type is the root type of the type graph if no pending types queue is
|
| // allocated yet.
|
| const bool is_root_type = (pending_types == NULL);
|
| if (is_root_type) {
|
| - pending_types = new PendingTypes(Z, 4);
|
| + pending_types = new PendingTypes(zone, 4);
|
| }
|
|
|
| const intptr_t num_expanded_type_arguments =
|
| - ExpandAndFinalizeTypeArguments(cls, resolved_type, pending_types);
|
| + ExpandAndFinalizeTypeArguments(cls, type, pending_types);
|
|
|
| // If we are done finalizing a graph of mutually recursive types, check their
|
| // bounds.
|
| @@ -1179,18 +1171,18 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
| }
|
| }
|
|
|
| - // If the type is a FunctionType, we also need to finalize the types in its
|
| + // If the type is a function type, we also need to finalize the types in its
|
| // signature, i.e. finalize the result type and parameter types of the
|
| // signature function of this function type.
|
| // We do this after marking this type as finalized in order to allow a
|
| // function type to refer to itself via its parameter types and result type.
|
| // Note that we do not instantiate these types according to the type
|
| // arguments. This will happen on demand when executing a type test.
|
| - if (resolved_type.IsFunctionType()) {
|
| + if (type.IsFunctionType()) {
|
| const Function& signature =
|
| - Function::Handle(Z, FunctionType::Cast(resolved_type).signature());
|
| + Function::Handle(zone, Type::Cast(type).signature());
|
| const Class& scope_class =
|
| - Class::Handle(Z, FunctionType::Cast(resolved_type).scope_class());
|
| + Class::Handle(zone, Type::Cast(type).type_class());
|
| if (scope_class.IsTypedefClass()) {
|
| FinalizeSignature(scope_class, signature);
|
| } else {
|
| @@ -1200,24 +1192,24 @@ RawAbstractType* ClassFinalizer::FinalizeType(
|
|
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Done finalizing type '%s' with %" Pd " type args: %s\n",
|
| - String::Handle(Z, resolved_type.Name()).ToCString(),
|
| + String::Handle(zone, type.Name()).ToCString(),
|
| num_expanded_type_arguments,
|
| - resolved_type.ToCString());
|
| + type.ToCString());
|
| }
|
|
|
| if (finalization >= kCanonicalize) {
|
| if (FLAG_trace_type_finalization) {
|
| THR_Print("Canonicalizing type '%s'\n",
|
| - String::Handle(Z, resolved_type.Name()).ToCString());
|
| + String::Handle(zone, type.Name()).ToCString());
|
| AbstractType& canonical_type =
|
| - AbstractType::Handle(Z, resolved_type.Canonicalize());
|
| + AbstractType::Handle(zone, type.Canonicalize());
|
| THR_Print("Done canonicalizing type '%s'\n",
|
| - String::Handle(Z, canonical_type.Name()).ToCString());
|
| + String::Handle(zone, canonical_type.Name()).ToCString());
|
| return canonical_type.raw();
|
| }
|
| - return resolved_type.Canonicalize();
|
| + return type.Canonicalize();
|
| } else {
|
| - return resolved_type.raw();
|
| + return type.raw();
|
| }
|
| }
|
|
|
| @@ -1228,18 +1220,12 @@ void ClassFinalizer::ResolveSignature(const Class& cls,
|
| AbstractType& type = AbstractType::Handle(function.result_type());
|
| // It is not a compile time error if this name does not resolve to a class or
|
| // interface.
|
| - AbstractType& resolved_type = AbstractType::Handle(ResolveType(cls, type));
|
| - if (resolved_type.raw() != type.raw()) {
|
| - function.set_result_type(resolved_type);
|
| - }
|
| + ResolveType(cls, type);
|
| // Resolve formal parameter types.
|
| const intptr_t num_parameters = function.NumParameters();
|
| for (intptr_t i = 0; i < num_parameters; i++) {
|
| type = function.ParameterTypeAt(i);
|
| - resolved_type = ResolveType(cls, type);
|
| - if (resolved_type.raw() != type.raw()) {
|
| - function.SetParameterTypeAt(i, resolved_type);
|
| - }
|
| + ResolveType(cls, type);
|
| }
|
| }
|
|
|
| @@ -1330,8 +1316,7 @@ void ClassFinalizer::ResolveUpperBounds(const Class& cls) {
|
| for (intptr_t i = 0; i < num_type_params; i++) {
|
| type_param ^= type_params.TypeAt(i);
|
| bound = type_param.bound();
|
| - bound = ResolveType(cls, bound);
|
| - type_param.set_bound(bound);
|
| + ResolveType(cls, bound);
|
| }
|
| }
|
|
|
| @@ -1382,14 +1367,14 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| // instance method.
|
|
|
| // Resolve type of fields and check for conflicts in super classes.
|
| - Zone* Z = Thread::Current()->zone();
|
| - Array& array = Array::Handle(Z, cls.fields());
|
| - Field& field = Field::Handle(Z);
|
| - AbstractType& type = AbstractType::Handle(Z);
|
| - String& name = String::Handle(Z);
|
| - String& getter_name = String::Handle(Z);
|
| - String& setter_name = String::Handle(Z);
|
| - Class& super_class = Class::Handle(Z);
|
| + Zone* zone = Thread::Current()->zone();
|
| + Array& array = Array::Handle(zone, cls.fields());
|
| + Field& field = Field::Handle(zone);
|
| + AbstractType& type = AbstractType::Handle(zone);
|
| + String& name = String::Handle(zone);
|
| + String& getter_name = String::Handle(zone);
|
| + String& setter_name = String::Handle(zone);
|
| + Class& super_class = Class::Handle(zone);
|
| const intptr_t num_fields = array.Length();
|
| for (intptr_t i = 0; i < num_fields; i++) {
|
| field ^= array.At(i);
|
| @@ -1401,15 +1386,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| getter_name = Field::GetterSymbol(name);
|
| super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, field.token_pos(),
|
| "static field '%s' of class '%s' conflicts with "
|
| "instance member '%s' of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| // An implicit setter is not generated for a static field, therefore, we
|
| // cannot rely on the code below handling the static setter case to report
|
| @@ -1417,15 +1402,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| setter_name = Field::SetterSymbol(name);
|
| super_class = FindSuperOwnerOfFunction(cls, setter_name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, field.token_pos(),
|
| "static field '%s' of class '%s' conflicts with "
|
| "instance setter '%s=' of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
|
|
| } else {
|
| @@ -1433,15 +1418,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| // (but not getter).
|
| super_class = FindSuperOwnerOfFunction(cls, name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, field.token_pos(),
|
| "field '%s' of class '%s' conflicts with method '%s' "
|
| "of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| }
|
| if (field.is_static() &&
|
| @@ -1449,14 +1434,14 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| (field.StaticValue() != Object::sentinel().raw())) {
|
| // The parser does not preset the value if the type is a type parameter or
|
| // is parameterized unless the value is null.
|
| - Error& error = Error::Handle(Z);
|
| + Error& error = Error::Handle(zone);
|
| if (type.IsMalformedOrMalbounded()) {
|
| error = type.error();
|
| } else {
|
| ASSERT(type.IsInstantiated());
|
| }
|
| const Instance& const_value =
|
| - Instance::Handle(Z, field.StaticValue());
|
| + Instance::Handle(zone, field.StaticValue());
|
| if (!error.IsNull() ||
|
| (!type.IsDynamicType() &&
|
| !const_value.IsInstanceOf(type,
|
| @@ -1464,10 +1449,11 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| &error))) {
|
| if (Isolate::Current()->error_on_bad_type()) {
|
| const AbstractType& const_value_type = AbstractType::Handle(
|
| - Z, const_value.GetType());
|
| + zone, const_value.GetType());
|
| const String& const_value_type_name = String::Handle(
|
| - Z, const_value_type.UserVisibleName());
|
| - const String& type_name = String::Handle(Z, type.UserVisibleName());
|
| + zone, const_value_type.UserVisibleName());
|
| + const String& type_name = String::Handle(
|
| + zone, type.UserVisibleName());
|
| ReportErrors(error, cls, field.token_pos(),
|
| "error initializing static %s field '%s': "
|
| "type '%s' is not a subtype of type '%s'",
|
| @@ -1485,7 +1471,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| // we create an implicit static final getter and reset the field value
|
| // to the sentinel value.
|
| const Function& getter = Function::Handle(
|
| - Z,
|
| + zone,
|
| Function::New(getter_name,
|
| RawFunction::kImplicitStaticFinalGetter,
|
| /* is_static = */ true,
|
| @@ -1504,22 +1490,22 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| }
|
| }
|
| // Collect interfaces, super interfaces, and super classes of this class.
|
| - GrowableArray<const Class*> interfaces(Z, 4);
|
| + GrowableArray<const Class*> interfaces(zone, 4);
|
| CollectInterfaces(cls, &interfaces);
|
| // Include superclasses in list of interfaces and super interfaces.
|
| super_class = cls.SuperClass();
|
| while (!super_class.IsNull()) {
|
| - interfaces.Add(&Class::ZoneHandle(Z, super_class.raw()));
|
| + interfaces.Add(&Class::ZoneHandle(zone, super_class.raw()));
|
| CollectInterfaces(super_class, &interfaces);
|
| super_class = super_class.SuperClass();
|
| }
|
| // Resolve function signatures and check for conflicts in super classes and
|
| // interfaces.
|
| array = cls.functions();
|
| - Function& function = Function::Handle(Z);
|
| - Function& overridden_function = Function::Handle(Z);
|
| + Function& function = Function::Handle(zone);
|
| + Function& overridden_function = Function::Handle(zone);
|
| const intptr_t num_functions = array.Length();
|
| - Error& error = Error::Handle(Z);
|
| + Error& error = Error::Handle(zone);
|
| for (intptr_t i = 0; i < num_functions; i++) {
|
| function ^= array.At(i);
|
| FinalizeSignature(cls, function);
|
| @@ -1537,15 +1523,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| if (!overridden_function.IsNull() &&
|
| !function.HasCompatibleParametersWith(overridden_function,
|
| &error)) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name =
|
| - String::Handle(Z, super_class->Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name =
|
| + String::Handle(zone, super_class->Name());
|
| ReportErrors(error, cls, function.token_pos(),
|
| "class '%s' overrides method '%s' of super "
|
| "class '%s' with incompatible parameters",
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| }
|
| }
|
| @@ -1553,16 +1539,16 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| if (function.is_static()) {
|
| super_class = FindSuperOwnerOfFunction(cls, name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name =
|
| - String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name =
|
| + String::Handle(zone, super_class.Name());
|
| ReportError(cls, function.token_pos(),
|
| "static setter '%s=' of class '%s' conflicts with "
|
| "instance setter '%s=' of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| }
|
| continue;
|
| @@ -1576,8 +1562,8 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| if (function.is_static()) {
|
| super_class = FindSuperOwnerOfInstanceMember(cls, name, getter_name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, function.token_pos(),
|
| "static %s '%s' of class '%s' conflicts with "
|
| "instance member '%s' of super class '%s'",
|
| @@ -1586,7 +1572,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| if (function.IsRedirectingFactory()) {
|
| // The function may be a still unresolved redirecting factory. Do not
|
| @@ -1594,7 +1580,7 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| // However, the redirection type should be finalized.
|
| // If the redirection type is from a deferred library and is not
|
| // yet loaded, do not attempt to resolve.
|
| - Type& type = Type::Handle(Z, function.RedirectionType());
|
| + Type& type = Type::Handle(zone, function.RedirectionType());
|
| if (IsLoaded(type)) {
|
| type ^= FinalizeType(cls, type, kCanonicalize);
|
| function.SetRedirectionType(type);
|
| @@ -1604,15 +1590,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| function.IsImplicitGetterFunction()) {
|
| super_class = FindSuperOwnerOfFunction(cls, name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, function.token_pos(),
|
| "getter '%s' of class '%s' conflicts with "
|
| "method '%s' of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| } else if (!function.IsSetterFunction() &&
|
| !function.IsImplicitSetterFunction()) {
|
| @@ -1620,15 +1606,15 @@ void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
|
| // have the same name. Thus, we do not need to check setters.
|
| super_class = FindSuperOwnerOfFunction(cls, getter_name);
|
| if (!super_class.IsNull()) {
|
| - const String& class_name = String::Handle(Z, cls.Name());
|
| - const String& super_class_name = String::Handle(Z, super_class.Name());
|
| + const String& class_name = String::Handle(zone, cls.Name());
|
| + const String& super_cls_name = String::Handle(zone, super_class.Name());
|
| ReportError(cls, function.token_pos(),
|
| "method '%s' of class '%s' conflicts with "
|
| "getter '%s' of super class '%s'",
|
| name.ToCString(),
|
| class_name.ToCString(),
|
| name.ToCString(),
|
| - super_class_name.ToCString());
|
| + super_cls_name.ToCString());
|
| }
|
| }
|
| }
|
| @@ -2362,7 +2348,7 @@ void ClassFinalizer::FinalizeTypesInClass(const Class& cls) {
|
| }
|
| if (cls.IsTypedefClass()) {
|
| const Function& signature = Function::Handle(cls.signature_function());
|
| - FunctionType& type = FunctionType::Handle(signature.SignatureType());
|
| + Type& type = Type::Handle(signature.SignatureType());
|
|
|
| // Check for illegal self references.
|
| GrowableArray<intptr_t> visited_aliases;
|
| @@ -2590,15 +2576,14 @@ bool ClassFinalizer::IsTypedefCycleFree(const Class& cls,
|
| const AbstractType& type,
|
| GrowableArray<intptr_t>* visited) {
|
| ASSERT(visited != NULL);
|
| - AbstractType& resolved_type = AbstractType::Handle(ResolveType(cls, type));
|
| + ResolveType(cls, type);
|
| bool checking_typedef = false;
|
| - if ((resolved_type.IsType() || resolved_type.IsFunctionType()) &&
|
| - !resolved_type.IsMalformed()) {
|
| + if (type.IsType() && !type.IsMalformed()) {
|
| AbstractType& other_type = AbstractType::Handle();
|
| - if (resolved_type.IsFunctionType()) {
|
| - const Class& scope_class = Class::Handle(resolved_type.type_class());
|
| + if (type.IsFunctionType()) {
|
| + const Class& scope_class = Class::Handle(type.type_class());
|
| const Function& signature_function =
|
| - Function::Handle(FunctionType::Cast(resolved_type).signature());
|
| + Function::Handle(Type::Cast(type).signature());
|
| // The signature function of this function type may be a local signature
|
| // function used in a formal parameter type of the typedef signature, but
|
| // not the typedef signature function itself, thus not qualifying as an
|
| @@ -2645,8 +2630,7 @@ bool ClassFinalizer::IsTypedefCycleFree(const Class& cls,
|
| }
|
| }
|
| }
|
| - const TypeArguments& type_args =
|
| - TypeArguments::Handle(resolved_type.arguments());
|
| + const TypeArguments& type_args = TypeArguments::Handle(type.arguments());
|
| if (!type_args.IsNull()) {
|
| for (intptr_t i = 0; i < type_args.Length(); i++) {
|
| other_type = type_args.TypeAt(i);
|
| @@ -2746,7 +2730,7 @@ RawType* ClassFinalizer::ResolveMixinAppType(
|
| GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
|
| AbstractType& mixin_super_type =
|
| AbstractType::Handle(zone, mixin_app_type.super_type());
|
| - mixin_super_type = ResolveType(cls, mixin_super_type);
|
| + ResolveType(cls, mixin_super_type);
|
| ASSERT(mixin_super_type.HasResolvedTypeClass()); // Even if malformed.
|
| if (mixin_super_type.IsMalformedOrMalbounded()) {
|
| ReportError(Error::Handle(zone, mixin_super_type.error()));
|
| @@ -2770,7 +2754,7 @@ RawType* ClassFinalizer::ResolveMixinAppType(
|
| for (intptr_t i = 0; i < depth; i++) {
|
| mixin_type = mixin_app_type.MixinTypeAt(i);
|
| ASSERT(!mixin_type.IsNull());
|
| - mixin_type = ResolveType(cls, mixin_type);
|
| + ResolveType(cls, mixin_type);
|
| ASSERT(mixin_type.HasResolvedTypeClass()); // Even if malformed.
|
| ASSERT(mixin_type.IsType());
|
| const intptr_t num_super_type_args = type_args.Length();
|
| @@ -2931,7 +2915,7 @@ void ClassFinalizer::ResolveSuperTypeAndInterfaces(
|
| Class& interface_class = Class::Handle(zone);
|
|
|
| // Resolve super type. Failures lead to a longjmp.
|
| - super_type = ResolveType(cls, super_type);
|
| + ResolveType(cls, super_type);
|
| if (super_type.IsMalformedOrMalbounded()) {
|
| ReportError(Error::Handle(zone, super_type.error()));
|
| }
|
| @@ -3011,7 +2995,7 @@ void ClassFinalizer::ResolveSuperTypeAndInterfaces(
|
| // Resolve interfaces. Failures lead to a longjmp.
|
| for (intptr_t i = 0; i < super_interfaces.Length(); i++) {
|
| interface ^= super_interfaces.At(i);
|
| - interface = ResolveType(cls, interface);
|
| + ResolveType(cls, interface);
|
| ASSERT(!interface.IsTypeParameter()); // Should be detected by parser.
|
| // A malbounded interface is only reported when involved in a type test.
|
| if (interface.IsMalformed()) {
|
|
|