| Index: sdk/lib/_internal/compiler/implementation/ssa/builder.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/ssa/builder.dart (revision 17016)
|
| +++ sdk/lib/_internal/compiler/implementation/ssa/builder.dart (working copy)
|
| @@ -2299,28 +2299,19 @@
|
| assert(!identical(op.token.kind, PLUS_TOKEN));
|
| HInstruction operand = pop();
|
|
|
| - HInstruction target =
|
| - new HStatic(interceptors.getPrefixOperatorInterceptor(op));
|
| - add(target);
|
| - HInvokeUnary result;
|
| - String value = op.source.stringValue;
|
| - switch (value) {
|
| - case "-": result = new HNegate(target, operand); break;
|
| - case "~": result = new HBitNot(target, operand); break;
|
| - default:
|
| - compiler.internalError('Unexpected unary operator: $value.', node: op);
|
| - break;
|
| - }
|
| // See if we can constant-fold right away. This avoids rewrites later on.
|
| if (operand is HConstant) {
|
| + UnaryOperation operation = constantSystem.lookupUnary(op.source);
|
| HConstant constant = operand;
|
| - Constant folded =
|
| - result.operation(constantSystem).fold(constant.constant);
|
| + Constant folded = operation.fold(constant.constant);
|
| if (folded != null) {
|
| stack.add(graph.addConstant(folded));
|
| return;
|
| }
|
| }
|
| +
|
| + HInvokeDynamicMethod result =
|
| + buildInvokeDynamic(node, elements.getSelector(node), operand, []);
|
| pushWithPosition(result, node);
|
| }
|
|
|
| @@ -3640,8 +3631,10 @@
|
| }
|
| }
|
|
|
| - HInvokeDynamicMethod buildInvokeDynamicWithOneArgument(
|
| - Node node, Selector selector, HInstruction receiver, HInstruction arg0) {
|
| + HInvokeDynamicMethod buildInvokeDynamic(Node node,
|
| + Selector selector,
|
| + HInstruction receiver,
|
| + List<HInstruction> arguments) {
|
| Set<ClassElement> interceptedClasses =
|
| getInterceptedClassesOn(node, selector);
|
| List<HInstruction> inputs = <HInstruction>[];
|
| @@ -3649,7 +3642,7 @@
|
| inputs.add(invokeInterceptor(interceptedClasses, receiver, node));
|
| }
|
| inputs.add(receiver);
|
| - inputs.add(arg0);
|
| + inputs.addAll(arguments);
|
| return new HInvokeDynamicMethod(selector, inputs);
|
| }
|
|
|
| @@ -3678,47 +3671,41 @@
|
| if (!methodInterceptionEnabled) {
|
| assert(identical(op.source.stringValue, '='));
|
| visitDynamicSend(node);
|
| + } else if (const SourceString("=") == op.source) {
|
| + visitDynamicSend(node);
|
| + HInvokeDynamicMethod method = pop();
|
| + // Push the value.
|
| + stack.add(method.inputs.last);
|
| } else {
|
| - HStatic target = new HStatic(
|
| - interceptors.getIndexAssignmentInterceptor());
|
| - add(target);
|
| visit(node.receiver);
|
| HInstruction receiver = pop();
|
| visit(node.argumentsNode);
|
| - if (const SourceString("=") == op.source) {
|
| - HInstruction value = pop();
|
| - HInstruction index = pop();
|
| - add(new HIndexAssign(target, receiver, index, value));
|
| - stack.add(value);
|
| + HInstruction value;
|
| + HInstruction index;
|
| + // Compound assignments are considered as being prefix.
|
| + bool isCompoundAssignment = op.source.stringValue.endsWith('=');
|
| + bool isPrefix = !node.isPostfix;
|
| + Element getter = elements[node.selector];
|
| + if (isCompoundAssignment) {
|
| + value = pop();
|
| + index = pop();
|
| } else {
|
| - HInstruction value;
|
| - HInstruction index;
|
| - bool isCompoundAssignment = op.source.stringValue.endsWith('=');
|
| - // Compound assignments are considered as being prefix.
|
| - bool isPrefix = !node.isPostfix;
|
| - Element getter = elements[node.selector];
|
| - if (isCompoundAssignment) {
|
| - value = pop();
|
| - index = pop();
|
| - } else {
|
| - index = pop();
|
| - value = graph.addConstantInt(1, constantSystem);
|
| - }
|
| + index = pop();
|
| + value = graph.addConstantInt(1, constantSystem);
|
| + }
|
|
|
| - HInvokeDynamicMethod left = buildInvokeDynamicWithOneArgument(
|
| - node, new Selector.index(), receiver, index);
|
| - add(left);
|
| - Element opElement = elements[op];
|
| - visitBinary(left, op, value);
|
| - value = pop();
|
| - HInstruction assign = new HIndexAssign(
|
| - target, receiver, index, value);
|
| - add(assign);
|
| - if (isPrefix) {
|
| - stack.add(value);
|
| - } else {
|
| - stack.add(left);
|
| - }
|
| + HInvokeDynamicMethod left = buildInvokeDynamic(
|
| + node, new Selector.index(), receiver, [index]);
|
| + add(left);
|
| + visitBinary(left, op, value);
|
| + value = pop();
|
| + HInvokeDynamicMethod assign = buildInvokeDynamic(
|
| + node, new Selector.indexSet(), receiver, [index, value]);
|
| + add(assign);
|
| + if (isPrefix) {
|
| + stack.add(value);
|
| + } else {
|
| + stack.add(left);
|
| }
|
| }
|
| } else if (const SourceString("=") == op.source) {
|
|
|