Chromium Code Reviews| Index: pkg/compiler/lib/src/ssa/builder.dart |
| diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
| index ddbc38feae178866b29fc080894121ee8d4d8c0f..2d8cfc0422d8d72f0a0f35bbed8de27e996018d8 100644 |
| --- a/pkg/compiler/lib/src/ssa/builder.dart |
| +++ b/pkg/compiler/lib/src/ssa/builder.dart |
| @@ -935,49 +935,63 @@ class SsaAstGraphBuilder extends ast.Visitor |
| ResolvedAst constructorResolvedAst, |
| List<HInstruction> compiledArguments, |
| List<ResolvedAst> constructorResolvedAsts, |
| - Map<Element, HInstruction> fieldValues, |
| + Map<FieldElement, HInstruction> fieldValues, |
| FunctionElement caller) { |
| ConstructorElement callee = constructorResolvedAst.element.implementation; |
| + |
| reporter.withCurrentElement(callee, () { |
| + Set<ClassElement> includedClasses = new Set<ClassElement>(); |
| constructorResolvedAsts.add(constructorResolvedAst); |
| - ClassElement enclosingClass = callee.enclosingClass; |
| - if (rtiNeed.classNeedsRti(enclosingClass)) { |
| - // If [enclosingClass] needs RTI, we have to give a value to its |
| - // type parameters. |
| - ClassElement currentClass = caller.enclosingClass; |
| - // For a super constructor call, the type is the supertype of |
| - // [currentClass]. For a redirecting constructor, the type is |
| - // the current type. [InterfaceType.asInstanceOf] takes care |
| - // of both. |
| - ResolutionInterfaceType type = |
| - currentClass.thisType.asInstanceOf(enclosingClass); |
| - type = localsHandler.substInContext(type); |
| - List<ResolutionDartType> arguments = type.typeArguments; |
| - List<ResolutionDartType> typeVariables = enclosingClass.typeVariables; |
| - if (!type.isRaw) { |
| - assert(arguments.length == typeVariables.length); |
| - Iterator<ResolutionDartType> variables = typeVariables.iterator; |
| - type.typeArguments.forEach((ResolutionDartType argument) { |
| - variables.moveNext(); |
| - ResolutionTypeVariableType typeVariable = variables.current; |
| - localsHandler.updateLocal( |
| - localsHandler.getTypeVariableAsLocal(typeVariable), |
| - typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
| - }); |
| - } else { |
| - // If the supertype is a raw type, we need to set to null the |
| - // type variables. |
| - for (ResolutionTypeVariableType variable in typeVariables) { |
| - localsHandler.updateLocal( |
| - localsHandler.getTypeVariableAsLocal(variable), |
| - graph.addConstantNull(closedWorld)); |
| + ClassElement currentClass = caller.enclosingClass; |
| + |
| + /// Include locals for type variable used in [member]. |
| + void includeTypeVariables(MemberElement member) { |
| + ClassElement enclosingClass = member.enclosingClass; |
| + if (!includedClasses.add(enclosingClass)) return; |
| + |
| + if (rtiNeed.classNeedsRti(enclosingClass)) { |
| + // If [enclosingClass] needs RTI, we have to give a value to its |
| + // type parameters. |
| + // For a super constructor call, the type is the supertype of |
| + // [currentClass]. For a redirecting constructor, the type is |
| + // the current type. [InterfaceType.asInstanceOf] takes care |
| + // of both. |
| + ResolutionInterfaceType type = |
| + currentClass.thisType.asInstanceOf(enclosingClass); |
| + type = localsHandler.substInContext(type); |
| + List<ResolutionDartType> arguments = type.typeArguments; |
| + List<ResolutionDartType> typeVariables = enclosingClass.typeVariables; |
| + if (!type.isRaw) { |
| + assert(arguments.length == typeVariables.length); |
| + Iterator<ResolutionDartType> variables = typeVariables.iterator; |
| + type.typeArguments.forEach((ResolutionDartType argument) { |
| + variables.moveNext(); |
| + ResolutionTypeVariableType typeVariable = variables.current; |
| + localsHandler.updateLocal( |
| + localsHandler.getTypeVariableAsLocal(typeVariable), |
| + typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
| + }); |
| + } else { |
| + // If the supertype is a raw type, we need to set to null the |
| + // type variables. |
| + for (ResolutionTypeVariableType variable in typeVariables) { |
| + localsHandler.updateLocal( |
| + localsHandler.getTypeVariableAsLocal(variable), |
| + graph.addConstantNull(closedWorld)); |
| + } |
| } |
| } |
| } |
| + includeTypeVariables(callee); |
| + |
| // For redirecting constructors, the fields will be initialized later |
| // by the effective target. |
| if (!callee.isRedirectingGenerative) { |
| + callee.enclosingClass.implementation.forEachInstanceField( |
| + (ClassElement enclosingClass, FieldElement member) { |
| + includeTypeVariables(member); |
|
Siggi Cherem (dart-lang)
2017/08/17 18:44:50
any reason why this shouldn't be done in buildFiel
Johnni Winther
2017/08/18 14:09:34
[inlinedFrom] accesses the missing values before t
|
| + }); |
| inlinedFrom(constructorResolvedAst, () { |
| buildFieldInitializers( |
| callee.enclosingClass.implementation, fieldValues); |
| @@ -1024,7 +1038,7 @@ class SsaAstGraphBuilder extends ast.Visitor |
| void buildInitializers( |
| ConstructorElement constructor, |
| List<ResolvedAst> constructorResolvedAsts, |
| - Map<Element, HInstruction> fieldValues) { |
| + Map<FieldElement, HInstruction> fieldValues) { |
| assert( |
| resolvedAst.element == constructor.declaration, |
| failedAt(constructor, |
| @@ -1041,7 +1055,7 @@ class SsaAstGraphBuilder extends ast.Visitor |
| void buildSynthesizedConstructorInitializers( |
| ConstructorElement constructor, |
| List<ResolvedAst> constructorResolvedAsts, |
| - Map<Element, HInstruction> fieldValues) { |
| + Map<FieldElement, HInstruction> fieldValues) { |
| assert( |
| constructor.isSynthesized, |
| failedAt( |
| @@ -1087,7 +1101,7 @@ class SsaAstGraphBuilder extends ast.Visitor |
| void buildParsedInitializers( |
| ConstructorElement constructor, |
| List<ResolvedAst> constructorResolvedAsts, |
| - Map<Element, HInstruction> fieldValues) { |
| + Map<FieldElement, HInstruction> fieldValues) { |
| assert( |
| resolvedAst.element == constructor.declaration, failedAt(constructor)); |
| assert(constructor.isImplementation, failedAt(constructor)); |
| @@ -1227,7 +1241,8 @@ class SsaAstGraphBuilder extends ast.Visitor |
| openFunction(functionElement, function); |
| } |
| - Map<Element, HInstruction> fieldValues = new Map<Element, HInstruction>(); |
| + Map<FieldElement, HInstruction> fieldValues = |
| + new Map<FieldElement, HInstruction>(); |
| // Compile the possible initialization code for local fields and |
| // super fields, unless this is a redirecting constructor, in which case |