| 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 4f1af1efdf943c47e3bb9197ba47a007b4341c40..9f54ceb5ae57faa1a6f19425085745c52bb9401c 100644
|
| --- a/pkg/compiler/lib/src/ssa/builder.dart
|
| +++ b/pkg/compiler/lib/src/ssa/builder.dart
|
| @@ -1494,11 +1494,33 @@ class SsaBuilder extends ast.Visitor
|
|
|
| HInstruction newObject;
|
| if (!isNativeUpgradeFactory) {
|
| - newObject = new HCreate(
|
| - classElement, constructorArguments, ssaType, instantiatedTypes);
|
| + // Create the runtime type information, if needed.
|
| + bool hasRtiInput = false;
|
| + if (backend.classNeedsRtiField(classElement)) {
|
| + // Read the values of the type arguments and create a
|
| + // HTypeInfoExpression to set on the newly create object.
|
| + hasRtiInput = true;
|
| + List<HInstruction> typeArguments = <HInstruction>[];
|
| + classElement.typeVariables.forEach((TypeVariableType typeVariable) {
|
| + HInstruction argument = localsHandler
|
| + .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable));
|
| + typeArguments.add(argument);
|
| + });
|
| +
|
| + HInstruction typeInfo = new HTypeInfoExpression(
|
| + TypeInfoExpressionKind.INSTANCE,
|
| + classElement.thisType,
|
| + typeArguments,
|
| + backend.dynamicType);
|
| + add(typeInfo);
|
| + constructorArguments.add(typeInfo);
|
| + }
|
| +
|
| + newObject = new HCreate(classElement, constructorArguments, ssaType,
|
| + instantiatedTypes: instantiatedTypes, hasRtiInput: hasRtiInput);
|
| if (function != null) {
|
| - // TODO(johnniwinther): Provide source information for creation
|
| - // through synthetic constructors.
|
| + // TODO(johnniwinther): Provide source information for creation through
|
| + // synthetic constructors.
|
| newObject.sourceInformation =
|
| sourceInformationBuilder.buildCreate(function);
|
| }
|
| @@ -1516,26 +1538,6 @@ class SsaBuilder extends ast.Visitor
|
| }
|
| }
|
| removeInlinedInstantiation(type);
|
| - // Create the runtime type information, if needed.
|
| - if (classElement.typeVariables.isNotEmpty &&
|
| - backend.classNeedsRti(classElement)) {
|
| - // Read the values of the type arguments and create a HTypeInfoExpression
|
| - // to set on the newly create object.
|
| - List<HInstruction> typeArguments = <HInstruction>[];
|
| - classElement.typeVariables.forEach((TypeVariableType typeVariable) {
|
| - HInstruction argument = localsHandler
|
| - .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable));
|
| - typeArguments.add(argument);
|
| - });
|
| -
|
| - HInstruction typeInfo = new HTypeInfoExpression(
|
| - TypeInfoExpressionKind.INSTANCE,
|
| - classElement.thisType,
|
| - typeArguments,
|
| - backend.dynamicType);
|
| - add(typeInfo);
|
| - newObject = callSetRuntimeTypeInfo(typeInfo, newObject);
|
| - }
|
|
|
| // Generate calls to the constructor bodies.
|
| HInstruction interceptor = null;
|
|
|