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_task; | 5 library dart2js.ir_builder_task; |
6 | 6 |
7 import '../closure.dart' as closurelib; | 7 import '../closure.dart' as closurelib; |
8 import '../closure.dart' hide ClosureScope; | 8 import '../closure.dart' hide ClosureScope; |
9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 return irBuilder.buildNullConstant(); | 462 return irBuilder.buildNullConstant(); |
463 } | 463 } |
464 | 464 |
465 ir.Primitive visitLiteralString(ast.LiteralString node) { | 465 ir.Primitive visitLiteralString(ast.LiteralString node) { |
466 assert(irBuilder.isOpen); | 466 assert(irBuilder.isOpen); |
467 return irBuilder.buildDartStringConstant(node.dartString); | 467 return irBuilder.buildDartStringConstant(node.dartString); |
468 } | 468 } |
469 | 469 |
470 ConstantExpression getConstantForNode(ast.Node node) { | 470 ConstantExpression getConstantForNode(ast.Node node) { |
471 ConstantExpression constant = | 471 ConstantExpression constant = |
472 compiler.backend.constants.getConstantForNode(node, elements); | 472 irBuilder.state.constants.getConstantForNode(node, elements); |
473 assert(invariant(node, constant != null, | 473 assert(invariant(node, constant != null, |
474 message: 'No constant computed for $node')); | 474 message: 'No constant computed for $node')); |
475 return constant; | 475 return constant; |
476 } | 476 } |
477 | 477 |
478 ConstantExpression getConstantForVariable(VariableElement element) { | 478 ConstantExpression getConstantForVariable(VariableElement element) { |
479 ConstantExpression constant = | 479 ConstantExpression constant = |
480 compiler.backend.constants.getConstantForVariable(element); | 480 irBuilder.state.constants.getConstantForVariable(element); |
481 assert(invariant(element, constant != null, | 481 assert(invariant(element, constant != null, |
482 message: 'No constant computed for $element')); | 482 message: 'No constant computed for $element')); |
483 return constant; | 483 return constant; |
484 } | 484 } |
485 | 485 |
| 486 /// Builds a constant pulling the value from the constant environment. |
| 487 // TODO(johnniwinther): Remove this when [IrBuilder.buildConstant] only takes |
| 488 // a [ConstantExpression]. |
| 489 ir.Primitive buildConstant(ConstantExpression expression) { |
| 490 return irBuilder.buildConstant(expression, |
| 491 irBuilder.state.constants.getConstantValue(expression)); |
| 492 } |
| 493 |
486 ir.Primitive visitLiteralList(ast.LiteralList node) { | 494 ir.Primitive visitLiteralList(ast.LiteralList node) { |
487 if (node.isConst) { | 495 if (node.isConst) { |
488 return translateConstant(node); | 496 return translateConstant(node); |
489 } | 497 } |
490 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); | 498 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); |
491 InterfaceType type = elements.getType(node); | 499 InterfaceType type = elements.getType(node); |
492 return irBuilder.buildListLiteral(type, values); | 500 return irBuilder.buildListLiteral(type, values); |
493 } | 501 } |
494 | 502 |
495 ir.Primitive visitLiteralMap(ast.LiteralMap node) { | 503 ir.Primitive visitLiteralMap(ast.LiteralMap node) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 /// Returns `true` if [node] is a super call. | 578 /// Returns `true` if [node] is a super call. |
571 // TODO(johnniwinther): Remove the need for this. | 579 // TODO(johnniwinther): Remove the need for this. |
572 bool isSuperCall(ast.Send node) { | 580 bool isSuperCall(ast.Send node) { |
573 return node != null && node.receiver != null && node.receiver.isSuper(); | 581 return node != null && node.receiver != null && node.receiver.isSuper(); |
574 } | 582 } |
575 | 583 |
576 @override | 584 @override |
577 ir.Primitive handleConstantGet( | 585 ir.Primitive handleConstantGet( |
578 ast.Node node, | 586 ast.Node node, |
579 ConstantExpression constant, _) { | 587 ConstantExpression constant, _) { |
580 return irBuilder.buildConstant(constant); | 588 return buildConstant(constant); |
581 } | 589 } |
582 | 590 |
583 /// If [node] is null, returns this. | 591 /// If [node] is null, returns this. |
584 /// Otherwise visits [node] and returns the result. | 592 /// Otherwise visits [node] and returns the result. |
585 ir.Primitive translateReceiver(ast.Expression node) { | 593 ir.Primitive translateReceiver(ast.Expression node) { |
586 return node != null ? visit(node) : irBuilder.buildThis(); | 594 return node != null ? visit(node) : irBuilder.buildThis(); |
587 } | 595 } |
588 | 596 |
589 @override | 597 @override |
590 ir.Primitive handleDynamicGet( | 598 ir.Primitive handleDynamicGet( |
(...skipping 16 matching lines...) Expand all Loading... |
607 return irBuilder.buildIfNotNullSend( | 615 return irBuilder.buildIfNotNullSend( |
608 target, | 616 target, |
609 nested(() => irBuilder.buildDynamicGet(target, selector))); | 617 nested(() => irBuilder.buildDynamicGet(target, selector))); |
610 } | 618 } |
611 | 619 |
612 @override | 620 @override |
613 ir.Primitive visitDynamicTypeLiteralGet( | 621 ir.Primitive visitDynamicTypeLiteralGet( |
614 ast.Send node, | 622 ast.Send node, |
615 ConstantExpression constant, | 623 ConstantExpression constant, |
616 _) { | 624 _) { |
617 return irBuilder.buildConstant(constant); | 625 return buildConstant(constant); |
618 } | 626 } |
619 | 627 |
620 @override | 628 @override |
621 ir.Primitive visitLocalVariableGet( | 629 ir.Primitive visitLocalVariableGet( |
622 ast.Send node, | 630 ast.Send node, |
623 LocalVariableElement element, | 631 LocalVariableElement element, |
624 _) { | 632 _) { |
625 return element.isConst | 633 return element.isConst |
626 ? irBuilder.buildConstant(getConstantForVariable(element)) | 634 ? buildConstant(getConstantForVariable(element)) |
627 : irBuilder.buildLocalVariableGet(element); | 635 : irBuilder.buildLocalVariableGet(element); |
628 } | 636 } |
629 | 637 |
630 @override | 638 @override |
631 ir.Primitive handleLocalGet( | 639 ir.Primitive handleLocalGet( |
632 ast.Send node, | 640 ast.Send node, |
633 LocalElement element, | 641 LocalElement element, |
634 _) { | 642 _) { |
635 return irBuilder.buildLocalVariableGet(element); | 643 return irBuilder.buildLocalVariableGet(element); |
636 } | 644 } |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 translateDynamicArguments(arguments, callStructure)); | 931 translateDynamicArguments(arguments, callStructure)); |
924 } | 932 } |
925 | 933 |
926 @override | 934 @override |
927 ir.Primitive handleConstantInvoke( | 935 ir.Primitive handleConstantInvoke( |
928 ast.Send node, | 936 ast.Send node, |
929 ConstantExpression constant, | 937 ConstantExpression constant, |
930 ast.NodeList arguments, | 938 ast.NodeList arguments, |
931 CallStructure callStructure, | 939 CallStructure callStructure, |
932 _) { | 940 _) { |
933 ir.Primitive target = irBuilder.buildConstant(constant); | 941 ir.Primitive target = buildConstant(constant); |
934 return translateCallInvoke(target, arguments, callStructure); | 942 return translateCallInvoke(target, arguments, callStructure); |
935 } | 943 } |
936 | 944 |
937 @override | 945 @override |
938 ir.Primitive handleDynamicInvoke( | 946 ir.Primitive handleDynamicInvoke( |
939 ast.Send node, | 947 ast.Send node, |
940 ast.Node receiver, | 948 ast.Node receiver, |
941 ast.NodeList arguments, | 949 ast.NodeList arguments, |
942 Selector selector, | 950 Selector selector, |
943 _) { | 951 _) { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1260 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | 1268 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
1261 } | 1269 } |
1262 | 1270 |
1263 @override | 1271 @override |
1264 ir.Primitive handleTypeLiteralConstantCompounds( | 1272 ir.Primitive handleTypeLiteralConstantCompounds( |
1265 ast.SendSet node, | 1273 ast.SendSet node, |
1266 ConstantExpression constant, | 1274 ConstantExpression constant, |
1267 CompoundRhs rhs, | 1275 CompoundRhs rhs, |
1268 arg) { | 1276 arg) { |
1269 return translateCompounds( | 1277 return translateCompounds( |
1270 getValue: () => irBuilder.buildConstant(constant), | 1278 getValue: () => buildConstant(constant), |
1271 rhs: rhs, | 1279 rhs: rhs, |
1272 setValue: (value) {}); // The binary operator will throw before this. | 1280 setValue: (value) {}); // The binary operator will throw before this. |
1273 } | 1281 } |
1274 | 1282 |
1275 @override | 1283 @override |
1276 ir.Primitive handleDynamicCompounds( | 1284 ir.Primitive handleDynamicCompounds( |
1277 ast.Send node, | 1285 ast.Send node, |
1278 ast.Node receiver, | 1286 ast.Node receiver, |
1279 CompoundRhs rhs, | 1287 CompoundRhs rhs, |
1280 Selector getterSelector, | 1288 Selector getterSelector, |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 while (it.moveNext()) { | 1511 while (it.moveNext()) { |
1504 ast.StringInterpolationPart part = it.current; | 1512 ast.StringInterpolationPart part = it.current; |
1505 arguments.add(visit(part.expression)); | 1513 arguments.add(visit(part.expression)); |
1506 arguments.add(visitLiteralString(part.string)); | 1514 arguments.add(visitLiteralString(part.string)); |
1507 } | 1515 } |
1508 return irBuilder.buildStringConcatenation(arguments); | 1516 return irBuilder.buildStringConcatenation(arguments); |
1509 } | 1517 } |
1510 | 1518 |
1511 ir.Primitive translateConstant(ast.Node node) { | 1519 ir.Primitive translateConstant(ast.Node node) { |
1512 assert(irBuilder.isOpen); | 1520 assert(irBuilder.isOpen); |
1513 return irBuilder.buildConstant(getConstantForNode(node)); | 1521 return buildConstant(getConstantForNode(node)); |
1514 } | 1522 } |
1515 | 1523 |
1516 ir.Primitive visitThrow(ast.Throw node) { | 1524 ir.Primitive visitThrow(ast.Throw node) { |
1517 assert(irBuilder.isOpen); | 1525 assert(irBuilder.isOpen); |
1518 // This function is not called for throw expressions occurring as | 1526 // This function is not called for throw expressions occurring as |
1519 // statements. | 1527 // statements. |
1520 return irBuilder.buildNonTailThrow(visit(node.expression)); | 1528 return irBuilder.buildNonTailThrow(visit(node.expression)); |
1521 } | 1529 } |
1522 | 1530 |
1523 ir.Primitive buildStaticNoSuchMethod( | 1531 ir.Primitive buildStaticNoSuchMethod( |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2248 JsIrBuilderVisitor visitor = new JsIrBuilderVisitor( | 2256 JsIrBuilderVisitor visitor = new JsIrBuilderVisitor( |
2249 context.resolvedAst.elements, | 2257 context.resolvedAst.elements, |
2250 compiler, | 2258 compiler, |
2251 sourceInformationBuilder.forContext(context)); | 2259 sourceInformationBuilder.forContext(context)); |
2252 return visitor.withBuilder(irBuilder, () => visitor.translateConstant(exp)); | 2260 return visitor.withBuilder(irBuilder, () => visitor.translateConstant(exp)); |
2253 } | 2261 } |
2254 | 2262 |
2255 JsIrBuilder getBuilderFor(Element element) { | 2263 JsIrBuilder getBuilderFor(Element element) { |
2256 return new JsIrBuilder( | 2264 return new JsIrBuilder( |
2257 new GlobalProgramInformation(compiler), | 2265 new GlobalProgramInformation(compiler), |
2258 compiler.backend.constantSystem, | 2266 compiler.backend.constants, |
2259 element); | 2267 element); |
2260 } | 2268 } |
2261 | 2269 |
2262 /// Builds the IR for a given constructor. | 2270 /// Builds the IR for a given constructor. |
2263 /// | 2271 /// |
2264 /// 1. Computes the type held in all own or "inherited" type variables. | 2272 /// 1. Computes the type held in all own or "inherited" type variables. |
2265 /// 2. Evaluates all own or inherited field initializers. | 2273 /// 2. Evaluates all own or inherited field initializers. |
2266 /// 3. Creates the object and assigns its fields and runtime type. | 2274 /// 3. Creates the object and assigns its fields and runtime type. |
2267 /// 4. Calls constructor body and super constructor bodies. | 2275 /// 4. Calls constructor body and super constructor bodies. |
2268 /// 5. Returns the created object. | 2276 /// 5. Returns the created object. |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2804 @override | 2812 @override |
2805 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { | 2813 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
2806 SourceInformation src = sourceInformationBuilder.buildGet(node); | 2814 SourceInformation src = sourceInformationBuilder.buildGet(node); |
2807 return buildStaticFieldGet(field, src); | 2815 return buildStaticFieldGet(field, src); |
2808 } | 2816 } |
2809 | 2817 |
2810 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { | 2818 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { |
2811 ConstantExpression constant = | 2819 ConstantExpression constant = |
2812 backend.constants.getConstantForVariable(field); | 2820 backend.constants.getConstantForVariable(field); |
2813 if (constant != null && !field.isAssignable) { | 2821 if (constant != null && !field.isAssignable) { |
2814 return irBuilder.buildConstant(constant); | 2822 return buildConstant(constant); |
2815 } else if (backend.constants.lazyStatics.contains(field)) { | 2823 } else if (backend.constants.lazyStatics.contains(field)) { |
2816 return irBuilder.buildStaticFieldLazyGet(field, src); | 2824 return irBuilder.buildStaticFieldLazyGet(field, src); |
2817 } else { | 2825 } else { |
2818 return irBuilder.buildStaticFieldGet(field, src); | 2826 return irBuilder.buildStaticFieldGet(field, src); |
2819 } | 2827 } |
2820 } | 2828 } |
2821 } | 2829 } |
2822 | 2830 |
2823 /// Perform simple post-processing on the initial CPS-translated root term. | 2831 /// Perform simple post-processing on the initial CPS-translated root term. |
2824 /// | 2832 /// |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2879 node.body = replacementFor(node.body); | 2887 node.body = replacementFor(node.body); |
2880 } | 2888 } |
2881 } | 2889 } |
2882 | 2890 |
2883 /// Visit a just-deleted subterm and unlink all [Reference]s in it. | 2891 /// Visit a just-deleted subterm and unlink all [Reference]s in it. |
2884 class RemovalVisitor extends ir.RecursiveVisitor { | 2892 class RemovalVisitor extends ir.RecursiveVisitor { |
2885 processReference(ir.Reference reference) { | 2893 processReference(ir.Reference reference) { |
2886 reference.unlink(); | 2894 reference.unlink(); |
2887 } | 2895 } |
2888 } | 2896 } |
OLD | NEW |