anchor.diff:    function softDef(o) {
       softDef = function(o) {};  // Replace ourselves.
       #deferredGlobal[#softId](
  -        holders, #embeddedGlobalsObject, #staticState, inherit, mixin,
  +        holders, #embeddedGlobalsObject, #staticState,
  +        inherit, inheritMany, mixin,
           installTearOff);
       if (o != null) {
         // TODO(29574): should we do something different for Firefox?
  
positive.code:   js.Statement emitInheritance(Fragment fragment, {bool softDeferred = false}) {
      List<js.Statement> inheritCalls = [];
      List<js.Statement> mixinCalls = [];
  
      Set<Class> classesInFragment = new Set<Class>();
      for (Library library in fragment.libraries) {
        classesInFragment.addAll(library.classes
            .where(((Class cls) => cls.isSoftDeferred == softDeferred)));
      }
  
      Map<Class, List<Class>> subclasses = <Class, List<Class>>{};
      Set<Class> seen = new Set<Class>();
  
      void collect(cls) {
        if (cls == null || seen.contains(cls)) return;
  
negative.code:         collect(cls);
  
          if (cls.mixinClass != null) {
            locals['_mixin'] ??= js.js('mixin');
            mixinCalls.add(js.js.statement('_mixin(#, #)',
                [classReference(cls), classReference(cls.mixinClass)]));
          }
        }
      }
  
      for (Class superclass in subclasses.keys) {
        List<Class> list = subclasses[superclass];
        js.Expression superclassReference = (superclass == null)
            ? new js.LiteralNull()
            : classReference(superclass);
        if (list.length == 1) {
          locals['_inherit'] ??= js.js('inherit');
          inheritCalls.add(js.js.statement('_inherit(#, #)',
              [classReference(list.single), superclassReference]));
        } else {
          locals['_inheritMany'] ??= js.js('inheritMany');
          var listElements = list.map(classReference).toList();
          inheritCalls.add(js.js.statement('_inheritMany(#, #)',
              [superclassReference, js.ArrayInitializer(listElements)]));
        }
      }
  
      List<js.Statement> statements = [];
      if (locals.isNotEmpty) {
        List<js.VariableInitialization> initializations = [];
        locals.forEach((local, value) {
          initializations.add(
              js.VariableInitialization(js.VariableDeclaration(local), value));
        });
        statements.add(
            js.ExpressionStatement(js.VariableDeclarationList(initializations)));
      }
      statements.addAll(inheritCalls);
      statements.addAll(mixinCalls);
      return wrapPhase('inheritance', statements);
    }
  
    /// Emits the setup of method aliases.
  