| Index: sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/ssa/builder.dart (revision 22664)
|
| +++ sdk/lib/_internal/compiler/implementation/ssa/builder.dart (working copy)
|
| @@ -2519,14 +2519,12 @@
|
| return;
|
| }
|
| }
|
| - // TODO(5346): Try to avoid the need for calling [declaration] before
|
| - // creating an [HStatic].
|
| - HInstruction instruction = new HStatic(element.declaration);
|
| if (element.isGetter()) {
|
| - add(instruction);
|
| - instruction = buildInvokeStatic(<HInstruction>[instruction]);
|
| - push(instruction);
|
| + push(buildInvokeStatic(element, <HInstruction>[]));
|
| } else {
|
| + // TODO(5346): Try to avoid the need for calling [declaration] before
|
| + // creating an [HStatic].
|
| + HInstruction instruction = new HStatic(element.declaration);
|
| instruction.instructionType =
|
| new HType.inferredTypeForElement(element, compiler);
|
| push(instruction);
|
| @@ -2583,10 +2581,8 @@
|
| }
|
| if (Elements.isStaticOrTopLevelField(element)) {
|
| if (element.isSetter()) {
|
| - HStatic target = new HStatic(element);
|
| - add(target);
|
| - var instruction = buildInvokeStatic(
|
| - <HInstruction>[target, value], HType.UNKNOWN);
|
| + var instruction = buildInvokeStatic(element,
|
| + <HInstruction>[value], HType.UNKNOWN);
|
| addWithPosition(instruction, location);
|
| } else {
|
| value = potentiallyCheckType(value, element.computeType(compiler));
|
| @@ -2623,27 +2619,21 @@
|
| }
|
|
|
| void pushInvokeHelper0(Element helper, HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| void pushInvokeHelper1(Element helper, HInstruction a0, HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference, a0];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[a0];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| void pushInvokeHelper2(Element helper,
|
| HInstruction a0,
|
| HInstruction a1,
|
| HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference, a0, a1];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[a0, a1];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| void pushInvokeHelper3(Element helper,
|
| @@ -2651,10 +2641,8 @@
|
| HInstruction a1,
|
| HInstruction a2,
|
| HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference, a0, a1, a2];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[a0, a1, a2];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| void pushInvokeHelper4(Element helper,
|
| @@ -2663,10 +2651,8 @@
|
| HInstruction a2,
|
| HInstruction a3,
|
| HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference, a0, a1, a2, a3];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[a0, a1, a2, a3];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| void pushInvokeHelper5(Element helper,
|
| @@ -2676,10 +2662,8 @@
|
| HInstruction a3,
|
| HInstruction a4,
|
| HType type) {
|
| - HInstruction reference = new HStatic(helper);
|
| - add(reference);
|
| - List<HInstruction> inputs = <HInstruction>[reference, a0, a1, a2, a3, a4];
|
| - push(buildInvokeStatic(inputs, type));
|
| + List<HInstruction> inputs = <HInstruction>[a0, a1, a2, a3, a4];
|
| + push(buildInvokeStatic(helper, inputs, type));
|
| }
|
|
|
| HForeign createForeign(String code,
|
| @@ -2778,19 +2762,14 @@
|
| if (type.kind == TypeKind.TYPE_VARIABLE) {
|
| HInstruction runtimeType = addTypeVariableReference(type);
|
| Element helper = backend.getGetObjectIsSubtype();
|
| - HInstruction helperCall = new HStatic(helper);
|
| - add(helperCall);
|
| - List<HInstruction> inputs = <HInstruction>[helperCall, expression,
|
| - runtimeType];
|
| - HInstruction call = buildInvokeStatic(inputs, HType.BOOLEAN);
|
| + List<HInstruction> inputs = <HInstruction>[expression, runtimeType];
|
| + HInstruction call = buildInvokeStatic(helper, inputs, HType.BOOLEAN);
|
| add(call);
|
| instruction = new HIs(type, <HInstruction>[expression, call],
|
| HIs.VARIABLE_CHECK);
|
| } else if (RuntimeTypes.hasTypeArguments(type)) {
|
| Element element = type.element;
|
| Element helper = backend.getCheckSubtype();
|
| - HInstruction helperCall = new HStatic(helper);
|
| - add(helperCall);
|
| HInstruction representations =
|
| buildTypeArgumentRepresentations(type);
|
| add(representations);
|
| @@ -2801,12 +2780,11 @@
|
| // have a subclass.
|
| HInstruction asFieldName =
|
| addConstantString(node, backend.namer.substitutionName(element));
|
| - List<HInstruction> inputs = <HInstruction>[helperCall,
|
| - expression,
|
| + List<HInstruction> inputs = <HInstruction>[expression,
|
| isFieldName,
|
| representations,
|
| asFieldName];
|
| - HInstruction call = buildInvokeStatic(inputs, HType.BOOLEAN);
|
| + HInstruction call = buildInvokeStatic(helper, inputs, HType.BOOLEAN);
|
| add(call);
|
| instruction = new HIs(type, <HInstruction>[expression, call],
|
| HIs.COMPOUND_CHECK);
|
| @@ -3001,11 +2979,9 @@
|
| compiler.cancel(
|
| 'Isolate library and compiler mismatch', node: node);
|
| }
|
| - HStatic target = new HStatic(element);
|
| - add(target);
|
| - List<HInstruction> inputs = <HInstruction>[target];
|
| + List<HInstruction> inputs = <HInstruction>[];
|
| addGenericSendArgumentsToList(link, inputs);
|
| - push(buildInvokeStatic(inputs, HType.UNKNOWN));
|
| + push(buildInvokeStatic(element, inputs, HType.UNKNOWN));
|
| }
|
| }
|
|
|
| @@ -3304,10 +3280,8 @@
|
|
|
| // Set the runtime type information on the object.
|
| Element typeInfoSetterElement = backend.getSetRuntimeTypeInfo();
|
| - HInstruction typeInfoSetter = new HStatic(typeInfoSetterElement);
|
| - add(typeInfoSetter);
|
| - add(buildInvokeStatic(
|
| - <HInstruction>[typeInfoSetter, newObject, typeInfo], HType.UNKNOWN));
|
| + add(buildInvokeStatic(typeInfoSetterElement,
|
| + <HInstruction>[newObject, typeInfo], HType.UNKNOWN));
|
| }
|
|
|
| /**
|
| @@ -3361,12 +3335,7 @@
|
| message: 'Constructor Symbol.validated is missing'));
|
| }
|
|
|
| - // TODO(5346): Try to avoid the need for calling [declaration] before
|
| - // creating an [HStatic].
|
| - HInstruction target = new HStatic(constructor.declaration);
|
| - add(target);
|
| var inputs = <HInstruction>[];
|
| - inputs.add(target);
|
| // TODO(5347): Try to avoid the need for calling [implementation] before
|
| // calling [addStaticSendArgumentsToList].
|
| bool succeeded = addStaticSendArgumentsToList(selector, node.arguments,
|
| @@ -3400,7 +3369,8 @@
|
| compiler.enqueuer.codegen.registerFactoryWithTypeArguments(elements);
|
| }
|
| HType elementType = computeType(constructor);
|
| - HInstruction newInstance = buildInvokeStatic(inputs, elementType);
|
| + HInstruction newInstance =
|
| + buildInvokeStatic(constructor, inputs, elementType);
|
| pushWithPosition(newInstance, node);
|
|
|
| // The List constructor forwards to a Dart static method that does
|
| @@ -3439,9 +3409,7 @@
|
| return;
|
| }
|
|
|
| - HInstruction target = new HStatic(element);
|
| - add(target);
|
| - var inputs = <HInstruction>[target];
|
| + var inputs = <HInstruction>[];
|
| // TODO(5347): Try to avoid the need for calling [implementation] before
|
| // calling [addStaticSendArgumentsToList].
|
| bool succeeded = addStaticSendArgumentsToList(selector, node.arguments,
|
| @@ -3453,11 +3421,12 @@
|
| }
|
|
|
| if (isIdenticalFunction) {
|
| - pushWithPosition(new HIdentity(inputs[1], inputs[2]), node);
|
| + pushWithPosition(new HIdentity(inputs[0], inputs[1]), node);
|
| return;
|
| }
|
|
|
| - HInvokeStatic instruction = buildInvokeStatic(inputs, HType.UNKNOWN);
|
| + HInvokeStatic instruction =
|
| + buildInvokeStatic(element, inputs, HType.UNKNOWN);
|
| HType returnType =
|
| new HType.inferredReturnTypeForElement(element, compiler);
|
| if (returnType.isUnknown()) {
|
| @@ -3732,14 +3701,16 @@
|
| }
|
| }
|
|
|
| - HInstruction buildInvokeStatic(List<HInstruction> inputs,
|
| + HInstruction buildInvokeStatic(Element element,
|
| + List<HInstruction> inputs,
|
| [HType type = null]) {
|
| - HStatic staticInstruction = inputs[0];
|
| - Element element = staticInstruction.element;
|
| if (type == null) {
|
| type = new HType.inferredReturnTypeForElement(element, compiler);
|
| }
|
| - HInstruction instruction = new HInvokeStatic(inputs, type);
|
| + // TODO(5346): Try to avoid the need for calling [declaration] before
|
| + // creating an [HInvokeStatic].
|
| + HInstruction instruction =
|
| + new HInvokeStatic(element.declaration, inputs, type);
|
| instruction.sideEffects = compiler.world.getSideEffectsOfElement(element);
|
| return instruction;
|
| }
|
| @@ -3750,9 +3721,7 @@
|
| HInstruction receiver = localsHandler.readThis();
|
| // TODO(5346): Try to avoid the need for calling [declaration] before
|
| // creating an [HStatic].
|
| - HInstruction target = new HStatic(element.declaration);
|
| - add(target);
|
| - List<HInstruction> inputs = <HInstruction>[target];
|
| + List<HInstruction> inputs = <HInstruction>[];
|
| Set<ClassElement> interceptedClasses =
|
| backend.getInterceptedClassesOn(selector.name);
|
| if (interceptedClasses != null) {
|
| @@ -3761,6 +3730,7 @@
|
| inputs.add(receiver);
|
| inputs.addAll(arguments);
|
| HInstruction instruction = new HInvokeSuper(
|
| + element,
|
| currentNonClosureClass,
|
| inputs,
|
| isSetter: selector.isSetter() || selector.isIndexSet());
|
|
|