| Index: runtime/vm/class_finalizer.cc
|
| ===================================================================
|
| --- runtime/vm/class_finalizer.cc (revision 13985)
|
| +++ runtime/vm/class_finalizer.cc (working copy)
|
| @@ -465,8 +465,10 @@
|
| identifier.IsNull() ? target_class_name : target_name;
|
| // Replace the type with a malformed type and compile a throw when called.
|
| type = NewFinalizedMalformedType(
|
| + Error::Handle(), // No previous error.
|
| cls,
|
| factory.token_pos(),
|
| + kTryResolve, // No compile-time error.
|
| "class '%s' has no constructor or factory named '%s'",
|
| target_class_name.ToCString(),
|
| user_visible_target_name.ToCString());
|
| @@ -478,8 +480,10 @@
|
| // Verify that the target is compatible with the redirecting factory.
|
| if (!target.HasCompatibleParametersWith(factory)) {
|
| type = NewFinalizedMalformedType(
|
| + Error::Handle(), // No previous error.
|
| cls,
|
| factory.token_pos(),
|
| + kTryResolve, // No compile-time error.
|
| "constructor '%s' has incompatible parameters with "
|
| "redirecting factory '%s'",
|
| String::Handle(target.name()).ToCString(),
|
| @@ -537,6 +541,9 @@
|
| const AbstractType& type,
|
| FinalizationKind finalization) {
|
| if (type.IsResolved() || type.IsFinalized()) {
|
| + if ((finalization == kCanonicalizeWellFormed) && type.IsMalformed()) {
|
| + ReportError(Error::Handle(type.malformed_error()));
|
| + }
|
| return;
|
| }
|
| if (FLAG_trace_type_finalization) {
|
| @@ -676,9 +683,16 @@
|
| const AbstractType& type,
|
| FinalizationKind finalization) {
|
| if (type.IsFinalized()) {
|
| - // Ensure type is canonical if canonicalization is requested.
|
| + // Ensure type is canonical if canonicalization is requested, unless type is
|
| + // malformed.
|
| if (finalization >= kCanonicalize) {
|
| - return type.Canonicalize();
|
| + if (type.IsMalformed()) {
|
| + if (finalization == kCanonicalizeWellFormed) {
|
| + ReportError(Error::Handle(type.malformed_error()));
|
| + }
|
| + } else {
|
| + return type.Canonicalize();
|
| + }
|
| }
|
| return type.raw();
|
| }
|
| @@ -1535,9 +1549,12 @@
|
| }
|
|
|
|
|
| -RawType* ClassFinalizer::NewFinalizedMalformedType(const Class& cls,
|
| - intptr_t type_pos,
|
| - const char* format, ...) {
|
| +RawType* ClassFinalizer::NewFinalizedMalformedType(
|
| + const Error& prev_error,
|
| + const Class& cls,
|
| + intptr_t type_pos,
|
| + FinalizationKind finalization,
|
| + const char* format, ...) {
|
| va_list args;
|
| va_start(args, format);
|
| const String& no_name = String::Handle(Symbols::Empty());
|
| @@ -1545,7 +1562,7 @@
|
| UnresolvedClass::New(LibraryPrefix::Handle(), no_name, type_pos));
|
| const Type& type = Type::Handle(
|
| Type::New(unresolved_class, TypeArguments::Handle(), type_pos));
|
| - ReportMalformedType(Error::Handle(), cls, type, kTryResolve, format, args);
|
| + ReportMalformedType(prev_error, cls, type, finalization, format, args);
|
| va_end(args);
|
| ASSERT(type.IsMalformed());
|
| return type.raw();
|
|
|