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 |