| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 class SsaFunctionCompiler implements FunctionCompiler { | 7 class SsaFunctionCompiler implements FunctionCompiler { |
| 8 final SsaCodeGeneratorTask generator; | 8 final SsaCodeGeneratorTask generator; |
| 9 final SsaBuilderTask builder; | 9 final SsaBuilderTask builder; |
| 10 final SsaOptimizerTask optimizer; | 10 final SsaOptimizerTask optimizer; |
| (...skipping 3595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3606 assert(send != null); | 3606 assert(send != null); |
| 3607 location = send; | 3607 location = send; |
| 3608 } | 3608 } |
| 3609 assert(selector.isSetter); | 3609 assert(selector.isSetter); |
| 3610 pushInvokeDynamic(location, selector, mask, [receiver, value], | 3610 pushInvokeDynamic(location, selector, mask, [receiver, value], |
| 3611 sourceInformation: sourceInformationBuilder.buildAssignment(location)); | 3611 sourceInformation: sourceInformationBuilder.buildAssignment(location)); |
| 3612 pop(); | 3612 pop(); |
| 3613 stack.add(value); | 3613 stack.add(value); |
| 3614 } | 3614 } |
| 3615 | 3615 |
| 3616 void generateNoSuchSetter(ast.Node location, |
| 3617 Element element, |
| 3618 HInstruction value) { |
| 3619 List<HInstruction> arguments = |
| 3620 value == null ? const <HInstruction>[] : <HInstruction>[value]; |
| 3621 // An erroneous element indicates an unresolved static setter. |
| 3622 generateThrowNoSuchMethod( |
| 3623 location, noSuchMethodTargetSymbolString(element, 'set'), |
| 3624 argumentValues: arguments); |
| 3625 } |
| 3626 |
| 3616 void generateNonInstanceSetter(ast.SendSet send, | 3627 void generateNonInstanceSetter(ast.SendSet send, |
| 3617 Element element, | 3628 Element element, |
| 3618 HInstruction value, | 3629 HInstruction value, |
| 3619 {ast.Node location}) { | 3630 {ast.Node location}) { |
| 3620 assert(send == null || !Elements.isInstanceSend(send, elements)); | 3631 assert(send == null || !Elements.isInstanceSend(send, elements)); |
| 3621 if (location == null) { | 3632 if (location == null) { |
| 3622 assert(send != null); | 3633 assert(send != null); |
| 3623 location = send; | 3634 location = send; |
| 3624 } | 3635 } |
| 3625 if (Elements.isStaticOrTopLevelField(element)) { | 3636 if (Elements.isStaticOrTopLevelField(element)) { |
| 3626 if (element.isSetter) { | 3637 if (element.isSetter) { |
| 3627 pushInvokeStatic(location, element, <HInstruction>[value]); | 3638 pushInvokeStatic(location, element, <HInstruction>[value]); |
| 3628 pop(); | 3639 pop(); |
| 3629 } else { | 3640 } else { |
| 3630 VariableElement field = element; | 3641 VariableElement field = element; |
| 3631 value = potentiallyCheckOrTrustType(value, field.type); | 3642 value = potentiallyCheckOrTrustType(value, field.type); |
| 3632 addWithPosition(new HStaticStore(element, value), location); | 3643 addWithPosition(new HStaticStore(element, value), location); |
| 3633 } | 3644 } |
| 3634 stack.add(value); | 3645 stack.add(value); |
| 3635 } else if (Elements.isErroneous(element)) { | 3646 } else if (Elements.isErroneous(element)) { |
| 3636 if (element is ErroneousElement) { | 3647 if (element is ErroneousElement) { |
| 3637 List<HInstruction> arguments = | 3648 generateNoSuchSetter(location, element, send == null ? null : value); |
| 3638 send == null ? const <HInstruction>[] : <HInstruction>[value]; | |
| 3639 // An erroneous element indicates an unresolved static setter. | |
| 3640 generateThrowNoSuchMethod( | |
| 3641 location, noSuchMethodTargetSymbolString(element, 'set'), | |
| 3642 argumentValues: arguments); | |
| 3643 } else { | 3649 } else { |
| 3644 // TODO(ahe): Do something like [generateWrongArgumentCountError]. | 3650 // TODO(ahe): Do something like [generateWrongArgumentCountError]. |
| 3645 stack.add(graph.addConstantNull(compiler)); | 3651 stack.add(graph.addConstantNull(compiler)); |
| 3646 } | 3652 } |
| 3647 } else { | 3653 } else { |
| 3648 stack.add(value); | 3654 stack.add(value); |
| 3649 LocalElement local = element; | 3655 LocalElement local = element; |
| 3650 // If the value does not already have a name, give it here. | 3656 // If the value does not already have a name, give it here. |
| 3651 if (value.sourceElement == null) { | 3657 if (value.sourceElement == null) { |
| 3652 value.sourceElement = local; | 3658 value.sourceElement = local; |
| (...skipping 2802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6455 generateNonInstanceSetter(node, field, visitAndPop(rhs)); | 6461 generateNonInstanceSetter(node, field, visitAndPop(rhs)); |
| 6456 } | 6462 } |
| 6457 | 6463 |
| 6458 @override | 6464 @override |
| 6459 void visitTopLevelGetterSet( | 6465 void visitTopLevelGetterSet( |
| 6460 ast.SendSet node, | 6466 ast.SendSet node, |
| 6461 GetterElement getter, | 6467 GetterElement getter, |
| 6462 ast.Node rhs, | 6468 ast.Node rhs, |
| 6463 _) { | 6469 _) { |
| 6464 generateIsDeferredLoadedCheckOfSend(node); | 6470 generateIsDeferredLoadedCheckOfSend(node); |
| 6465 generateNonInstanceSetter(node, getter, visitAndPop(rhs)); | 6471 generateNoSuchSetter(node, getter, visitAndPop(rhs)); |
| 6466 } | 6472 } |
| 6467 | 6473 |
| 6468 @override | 6474 @override |
| 6469 void visitTopLevelSetterSet( | 6475 void visitTopLevelSetterSet( |
| 6470 ast.SendSet node, | 6476 ast.SendSet node, |
| 6471 SetterElement setter, | 6477 SetterElement setter, |
| 6472 ast.Node rhs, | 6478 ast.Node rhs, |
| 6473 _) { | 6479 _) { |
| 6474 generateIsDeferredLoadedCheckOfSend(node); | 6480 generateIsDeferredLoadedCheckOfSend(node); |
| 6475 generateNonInstanceSetter(node, setter, visitAndPop(rhs)); | 6481 generateNonInstanceSetter(node, setter, visitAndPop(rhs)); |
| 6476 } | 6482 } |
| 6477 | 6483 |
| 6478 @override | 6484 @override |
| 6479 void visitTopLevelFunctionSet( | 6485 void visitTopLevelFunctionSet( |
| 6480 ast.SendSet node, | 6486 ast.SendSet node, |
| 6481 MethodElement function, | 6487 MethodElement function, |
| 6482 ast.Node rhs, | 6488 ast.Node rhs, |
| 6483 _) { | 6489 _) { |
| 6484 generateIsDeferredLoadedCheckOfSend(node); | 6490 generateIsDeferredLoadedCheckOfSend(node); |
| 6485 generateNonInstanceSetter(node, function, visitAndPop(rhs)); | 6491 generateNoSuchSetter(node, function, visitAndPop(rhs)); |
| 6486 } | 6492 } |
| 6487 | 6493 |
| 6488 @override | 6494 @override |
| 6489 void visitStaticFieldSet( | 6495 void visitStaticFieldSet( |
| 6490 ast.SendSet node, | 6496 ast.SendSet node, |
| 6491 FieldElement field, | 6497 FieldElement field, |
| 6492 ast.Node rhs, | 6498 ast.Node rhs, |
| 6493 _) { | 6499 _) { |
| 6494 generateIsDeferredLoadedCheckOfSend(node); | 6500 generateIsDeferredLoadedCheckOfSend(node); |
| 6495 generateNonInstanceSetter(node, field, visitAndPop(rhs)); | 6501 generateNonInstanceSetter(node, field, visitAndPop(rhs)); |
| 6496 } | 6502 } |
| 6497 | 6503 |
| 6498 @override | 6504 @override |
| 6499 void visitFinalStaticFieldSet( | 6505 void visitFinalStaticFieldSet( |
| 6500 ast.SendSet node, | 6506 ast.SendSet node, |
| 6501 FieldElement field, | 6507 FieldElement field, |
| 6502 ast.Node rhs, | 6508 ast.Node rhs, |
| 6503 _) { | 6509 _) { |
| 6504 generateIsDeferredLoadedCheckOfSend(node); | 6510 generateIsDeferredLoadedCheckOfSend(node); |
| 6505 generateNonInstanceSetter(node, field, visitAndPop(rhs)); | 6511 generateNonInstanceSetter(node, field, visitAndPop(rhs)); |
| 6506 } | 6512 } |
| 6507 | 6513 |
| 6508 @override | 6514 @override |
| 6509 void visitStaticGetterSet( | 6515 void visitStaticGetterSet( |
| 6510 ast.SendSet node, | 6516 ast.SendSet node, |
| 6511 GetterElement getter, | 6517 GetterElement getter, |
| 6512 ast.Node rhs, | 6518 ast.Node rhs, |
| 6513 _) { | 6519 _) { |
| 6514 generateIsDeferredLoadedCheckOfSend(node); | 6520 generateIsDeferredLoadedCheckOfSend(node); |
| 6515 generateNonInstanceSetter(node, getter, visitAndPop(rhs)); | 6521 generateNoSuchSetter(node, getter, visitAndPop(rhs)); |
| 6516 } | 6522 } |
| 6517 | 6523 |
| 6518 @override | 6524 @override |
| 6519 void visitStaticSetterSet( | 6525 void visitStaticSetterSet( |
| 6520 ast.SendSet node, | 6526 ast.SendSet node, |
| 6521 SetterElement setter, | 6527 SetterElement setter, |
| 6522 ast.Node rhs, | 6528 ast.Node rhs, |
| 6523 _) { | 6529 _) { |
| 6524 generateIsDeferredLoadedCheckOfSend(node); | 6530 generateIsDeferredLoadedCheckOfSend(node); |
| 6525 generateNonInstanceSetter(node, setter, visitAndPop(rhs)); | 6531 generateNonInstanceSetter(node, setter, visitAndPop(rhs)); |
| 6526 } | 6532 } |
| 6527 | 6533 |
| 6528 @override | 6534 @override |
| 6529 void visitStaticFunctionSet( | 6535 void visitStaticFunctionSet( |
| 6530 ast.SendSet node, | 6536 ast.SendSet node, |
| 6531 MethodElement function, | 6537 MethodElement function, |
| 6532 ast.Node rhs, | 6538 ast.Node rhs, |
| 6533 _) { | 6539 _) { |
| 6534 generateIsDeferredLoadedCheckOfSend(node); | 6540 generateIsDeferredLoadedCheckOfSend(node); |
| 6535 generateNonInstanceSetter(node, function, visitAndPop(rhs)); | 6541 generateNoSuchSetter(node, function, visitAndPop(rhs)); |
| 6536 } | 6542 } |
| 6537 | 6543 |
| 6538 @override | 6544 @override |
| 6539 void visitUnresolvedSet( | 6545 void visitUnresolvedSet( |
| 6540 ast.SendSet node, | 6546 ast.SendSet node, |
| 6541 Element element, | 6547 Element element, |
| 6542 ast.Node rhs, | 6548 ast.Node rhs, |
| 6543 _) { | 6549 _) { |
| 6544 if (node.isSuperCall) { | 6550 if (node.isSuperCall) { |
| 6545 // TODO(johnniwinther): Remove this when final super field assignment is | 6551 // TODO(johnniwinther): Remove this when final super field assignment is |
| (...skipping 2307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8853 if (unaliased is TypedefType) throw 'unable to unalias $type'; | 8859 if (unaliased is TypedefType) throw 'unable to unalias $type'; |
| 8854 unaliased.accept(this, builder); | 8860 unaliased.accept(this, builder); |
| 8855 } | 8861 } |
| 8856 | 8862 |
| 8857 void visitDynamicType(DynamicType type, SsaBuilder builder) { | 8863 void visitDynamicType(DynamicType type, SsaBuilder builder) { |
| 8858 JavaScriptBackend backend = builder.compiler.backend; | 8864 JavaScriptBackend backend = builder.compiler.backend; |
| 8859 ClassElement cls = backend.findHelper('DynamicRuntimeType'); | 8865 ClassElement cls = backend.findHelper('DynamicRuntimeType'); |
| 8860 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); | 8866 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); |
| 8861 } | 8867 } |
| 8862 } | 8868 } |
| OLD | NEW |