diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart index 6bf9e2abdc6..e0a8fda68e2 100644 --- a/pkg/compiler/lib/src/js_emitter/model.dart +++ b/pkg/compiler/lib/src/js_emitter/model.dart @@ -282,6 +282,8 @@ class Class implements FieldContainer { int get superclassHolderIndex => (superclass == null) ? 0 : superclass.holder.index; + + String toString() => 'Class(${element.name})'; } class MixinApplication extends Class { diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart index c55ddec1413..5bc3f77db38 100644 --- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart +++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart @@ -240,7 +240,13 @@ class Collector { // these are thought to not have been instantiated, so we neeed to be able // to identify them later and make sure we only emit "empty shells" without // fields, etc. - classesOnlyNeededForRti = _rtiNeededClasses.difference(neededClasses); + classesOnlyNeededForRti = new Set(); + for (ClassElement cls in _rtiNeededClasses) { + while (cls != null && !neededClasses.contains(cls)) { + if (!classesOnlyNeededForRti.add(cls)) break; + cls = cls.superclass; + } + } neededClasses.addAll(classesOnlyNeededForRti); diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart index d18af44ffc2..d26428bc78b 100644 --- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart +++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart @@ -209,7 +209,9 @@ class ProgramBuilder { _classes.forEach((ClassElement element, Class c) { if (element.superclass != null) { c.setSuperclass(_classes[element.superclass]); - assert(c.superclass != null); + assert(invariant(element, c.superclass != null, + message: "No Class for has been created for superclass " + "${element.superclass} of $c.")); } if (c is MixinApplication) { c.setMixinClass(_classes[computeMixinClass(element)]); diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status index 368a346367e..7ab1da6f066 100644 --- a/tests/language/language_dart2js.status +++ b/tests/language/language_dart2js.status @@ -938,9 +938,3 @@ named_parameters_test/03: Crash # Issue 27394 named_parameters_test/05: Crash # Issue 27394 named_parameters_test/07: Crash # Issue 27394 named_parameters_test/09: Crash # Issue 27394 - -[ $compiler == dart2js && $runtime == d8 && $host_checked == false && $checked && $fast_startup == false] -mixin_type_parameter6_test: RuntimeError #29441 - -[ $compiler == dart2js && $runtime == d8 && $host_checked && $checked ] -mixin_type_parameter6_test: Crash #29441