OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart2js.ir_builder; | 5 library dart2js.ir_builder; |
6 | 6 |
7 import '../closure.dart' hide ClosureScope; | 7 import '../closure.dart' hide ClosureScope; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
10 Names, | 10 Names, |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 ir.Primitive _buildInvokeCall(ir.Primitive target, | 695 ir.Primitive _buildInvokeCall(ir.Primitive target, |
696 CallStructure callStructure, | 696 CallStructure callStructure, |
697 TypeMask mask, | 697 TypeMask mask, |
698 List<ir.Definition> arguments, | 698 List<ir.Definition> arguments, |
699 {SourceInformation sourceInformation}) { | 699 {SourceInformation sourceInformation}) { |
700 Selector selector = callStructure.callSelector; | 700 Selector selector = callStructure.callSelector; |
701 return _buildInvokeDynamic( | 701 return _buildInvokeDynamic( |
702 target, selector, mask, arguments, sourceInformation); | 702 target, selector, mask, arguments, sourceInformation); |
703 } | 703 } |
704 | 704 |
| 705 ir.Primitive buildStaticNoSuchMethod(Selector selector, |
| 706 List<ir.Primitive> arguments) { |
| 707 Element thrower = program.throwNoSuchMethod; |
| 708 ir.Primitive receiver = buildStringConstant(''); |
| 709 ir.Primitive name = buildStringConstant(selector.name); |
| 710 ir.Primitive argumentList = buildListLiteral(null, arguments); |
| 711 ir.Primitive expectedArgumentNames = buildNullConstant(); |
| 712 return buildStaticFunctionInvocation( |
| 713 thrower, |
| 714 new CallStructure.unnamed(4), |
| 715 [receiver, name, argumentList, expectedArgumentNames]); |
| 716 } |
| 717 |
705 | 718 |
706 /// Create a [ir.Constant] from [value] and add it to the CPS term. | 719 /// Create a [ir.Constant] from [value] and add it to the CPS term. |
707 ir.Constant buildConstant(ConstantValue value, | 720 ir.Constant buildConstant(ConstantValue value, |
708 {SourceInformation sourceInformation}) { | 721 {SourceInformation sourceInformation}) { |
709 assert(isOpen); | 722 assert(isOpen); |
710 return addPrimitive( | 723 return addPrimitive( |
711 new ir.Constant(value, sourceInformation: sourceInformation)); | 724 new ir.Constant(value, sourceInformation: sourceInformation)); |
712 } | 725 } |
713 | 726 |
714 /// Create an integer constant and add it to the CPS term. | 727 /// Create an integer constant and add it to the CPS term. |
(...skipping 711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1426 new ir.InvokeMethod( | 1439 new ir.InvokeMethod( |
1427 iterator, | 1440 iterator, |
1428 Selectors.current, | 1441 Selectors.current, |
1429 currentMask, | 1442 currentMask, |
1430 emptyArguments)); | 1443 emptyArguments)); |
1431 // TODO(sra): Does this cover all cases? The general setter case include | 1444 // TODO(sra): Does this cover all cases? The general setter case include |
1432 // super. | 1445 // super. |
1433 // TODO(johnniwinther): Extract this as a provided strategy. | 1446 // TODO(johnniwinther): Extract this as a provided strategy. |
1434 if (Elements.isLocal(variableElement)) { | 1447 if (Elements.isLocal(variableElement)) { |
1435 bodyBuilder.buildLocalVariableSet(variableElement, currentValue); | 1448 bodyBuilder.buildLocalVariableSet(variableElement, currentValue); |
1436 } else if (Elements.isMalformed(variableElement)) { | 1449 } else if (Elements.isError(variableElement) || |
1437 bodyBuilder.buildErroneousInvocation(variableElement, | 1450 Elements.isMalformed(variableElement)) { |
1438 new Selector.setter( | 1451 Selector selector = new Selector.setter( |
1439 new Name(variableElement.name, variableElement.library)), | 1452 new Name(variableElement.name, variableElement.library)); |
1440 <ir.Primitive>[currentValue]); | 1453 List<ir.Primitive> value = <ir.Primitive>[currentValue]; |
| 1454 // Note the order of the comparisons below. It can be the case that an |
| 1455 // element isError and isMalformed. |
| 1456 if (Elements.isError(variableElement)) { |
| 1457 bodyBuilder.buildStaticNoSuchMethod(selector, value); |
| 1458 } else { |
| 1459 bodyBuilder.buildErroneousInvocation(variableElement, selector, value); |
| 1460 } |
1441 } else if (Elements.isStaticOrTopLevel(variableElement)) { | 1461 } else if (Elements.isStaticOrTopLevel(variableElement)) { |
1442 if (variableElement.isField) { | 1462 if (variableElement.isField) { |
1443 bodyBuilder.buildStaticFieldSet(variableElement, currentValue); | 1463 bodyBuilder.buildStaticFieldSet(variableElement, currentValue); |
1444 } else { | 1464 } else { |
1445 bodyBuilder.buildStaticSetterSet(variableElement, currentValue); | 1465 bodyBuilder.buildStaticSetterSet(variableElement, currentValue); |
1446 } | 1466 } |
1447 } else { | 1467 } else { |
1448 ir.Primitive receiver = bodyBuilder.buildThis(); | 1468 ir.Primitive receiver = bodyBuilder.buildThis(); |
1449 assert(receiver != null); | 1469 assert(receiver != null); |
1450 bodyBuilder.buildDynamicSet( | 1470 bodyBuilder.buildDynamicSet( |
(...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2904 } | 2924 } |
2905 | 2925 |
2906 class SwitchCaseInfo { | 2926 class SwitchCaseInfo { |
2907 final List<ir.Primitive> constants = <ir.Primitive>[]; | 2927 final List<ir.Primitive> constants = <ir.Primitive>[]; |
2908 final SubbuildFunction buildBody; | 2928 final SubbuildFunction buildBody; |
2909 | 2929 |
2910 SwitchCaseInfo(this.buildBody); | 2930 SwitchCaseInfo(this.buildBody); |
2911 | 2931 |
2912 void addConstant(ir.Primitive constant) => constants.add(constant); | 2932 void addConstant(ir.Primitive constant) => constants.add(constant); |
2913 } | 2933 } |
OLD | NEW |