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 closure; | 7 import '../closure.dart' as closure; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
| 10 Identifiers, |
10 Names, | 11 Names, |
11 Selectors; | 12 Selectors; |
12 import '../common/tasks.dart' show | 13 import '../common/tasks.dart' show |
13 CompilerTask; | 14 CompilerTask; |
14 import '../compiler.dart' show | 15 import '../compiler.dart' show |
15 Compiler; | 16 Compiler; |
16 import '../constants/expressions.dart'; | 17 import '../constants/expressions.dart'; |
17 import '../dart_types.dart'; | 18 import '../dart_types.dart'; |
18 import '../elements/elements.dart'; | 19 import '../elements/elements.dart'; |
19 import '../elements/modelx.dart' show | 20 import '../elements/modelx.dart' show |
(...skipping 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 ast.Send node, | 1888 ast.Send node, |
1888 MethodElement method, | 1889 MethodElement method, |
1889 _) { | 1890 _) { |
1890 return irBuilder.buildSuperMethodGet(method); | 1891 return irBuilder.buildSuperMethodGet(method); |
1891 } | 1892 } |
1892 | 1893 |
1893 @override | 1894 @override |
1894 ir.Primitive visitUnresolvedSuperGet( | 1895 ir.Primitive visitUnresolvedSuperGet( |
1895 ast.Send node, | 1896 ast.Send node, |
1896 Element element, _) { | 1897 Element element, _) { |
1897 return buildInstanceNoSuchMethod( | 1898 return buildSuperNoSuchMethod( |
1898 elements.getSelector(node), elements.getTypeMask(node), []); | 1899 elements.getSelector(node), elements.getTypeMask(node), []); |
1899 } | 1900 } |
1900 | 1901 |
1901 @override | 1902 @override |
| 1903 ir.Primitive visitUnresolvedSuperSet( |
| 1904 ast.Send node, |
| 1905 Element element, |
| 1906 ast.Node rhs, _) { |
| 1907 return buildSuperNoSuchMethod( |
| 1908 elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)]); |
| 1909 } |
| 1910 |
| 1911 @override |
1902 ir.Primitive visitThisGet(ast.Identifier node, _) { | 1912 ir.Primitive visitThisGet(ast.Identifier node, _) { |
1903 if (irBuilder.state.thisParameter == null) { | 1913 if (irBuilder.state.thisParameter == null) { |
1904 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. | 1914 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. |
1905 // 'this' in static context. Just translate to null. | 1915 // 'this' in static context. Just translate to null. |
1906 assert(compiler.compilationFailed); | 1916 assert(compiler.compilationFailed); |
1907 return irBuilder.buildNullConstant(); | 1917 return irBuilder.buildNullConstant(); |
1908 } | 1918 } |
1909 return irBuilder.buildThis(); | 1919 return irBuilder.buildThis(); |
1910 } | 1920 } |
1911 | 1921 |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2421 | 2431 |
2422 @override | 2432 @override |
2423 ir.Primitive visitSuperMethodIncompatibleInvoke( | 2433 ir.Primitive visitSuperMethodIncompatibleInvoke( |
2424 ast.Send node, | 2434 ast.Send node, |
2425 MethodElement method, | 2435 MethodElement method, |
2426 ast.NodeList arguments, | 2436 ast.NodeList arguments, |
2427 CallStructure callStructure, _) { | 2437 CallStructure callStructure, _) { |
2428 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | 2438 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
2429 CallStructure normalizedCallStructure = | 2439 CallStructure normalizedCallStructure = |
2430 translateDynamicArguments(arguments, callStructure, normalizedArguments); | 2440 translateDynamicArguments(arguments, callStructure, normalizedArguments); |
2431 return buildInstanceNoSuchMethod( | 2441 return buildSuperNoSuchMethod( |
2432 new Selector.call(method.memberName, normalizedCallStructure), | 2442 new Selector.call(method.memberName, normalizedCallStructure), |
2433 elements.getTypeMask(node), | 2443 elements.getTypeMask(node), |
2434 normalizedArguments); | 2444 normalizedArguments); |
2435 } | 2445 } |
2436 | 2446 |
2437 @override | 2447 @override |
2438 ir.Primitive visitUnresolvedSuperInvoke( | 2448 ir.Primitive visitUnresolvedSuperInvoke( |
2439 ast.Send node, | 2449 ast.Send node, |
2440 Element element, | 2450 Element element, |
2441 ast.NodeList argumentsNode, | 2451 ast.NodeList argumentsNode, |
2442 Selector selector, _) { | 2452 Selector selector, _) { |
2443 List<ir.Primitive> arguments = <ir.Primitive>[]; | 2453 List<ir.Primitive> arguments = <ir.Primitive>[]; |
2444 CallStructure callStructure = translateDynamicArguments( | 2454 CallStructure callStructure = translateDynamicArguments( |
2445 argumentsNode, selector.callStructure, arguments); | 2455 argumentsNode, selector.callStructure, arguments); |
2446 // TODO(johnniwinther): Supply a member name to the visit function instead | 2456 // TODO(johnniwinther): Supply a member name to the visit function instead |
2447 // of looking it up in elements. | 2457 // of looking it up in elements. |
2448 return buildInstanceNoSuchMethod( | 2458 return buildSuperNoSuchMethod( |
2449 new Selector.call(elements.getSelector(node).memberName, callStructure), | 2459 new Selector.call(elements.getSelector(node).memberName, callStructure), |
2450 elements.getTypeMask(node), | 2460 elements.getTypeMask(node), |
2451 arguments); | 2461 arguments); |
2452 } | 2462 } |
2453 | 2463 |
2454 @override | 2464 @override |
2455 ir.Primitive visitThisInvoke( | 2465 ir.Primitive visitThisInvoke( |
2456 ast.Send node, | 2466 ast.Send node, |
2457 ast.NodeList arguments, | 2467 ast.NodeList arguments, |
2458 CallStructure callStructure, | 2468 CallStructure callStructure, |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2849 case CompoundSetter.INVALID: | 2859 case CompoundSetter.INVALID: |
2850 irBuilder.buildStaticNoSuchMethod( | 2860 irBuilder.buildStaticNoSuchMethod( |
2851 new Selector.setter(new Name(setter.name, setter.library)), | 2861 new Selector.setter(new Name(setter.name, setter.library)), |
2852 <ir.Primitive>[result]); | 2862 <ir.Primitive>[result]); |
2853 return; | 2863 return; |
2854 } | 2864 } |
2855 }); | 2865 }); |
2856 } | 2866 } |
2857 | 2867 |
2858 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 2868 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
2859 return buildInstanceNoSuchMethod( | 2869 return buildSuperNoSuchMethod( |
2860 new Selector.getter(new Name(element.name, element.library)), | 2870 new Selector.getter(new Name(element.name, element.library)), |
2861 mask, | 2871 mask, |
2862 const <ir.Primitive>[]); | 2872 const <ir.Primitive>[]); |
2863 } | 2873 } |
2864 | 2874 |
2865 ir.Primitive buildSuperNoSuchSetter(Element element, | 2875 ir.Primitive buildSuperNoSuchSetter(Element element, |
2866 TypeMask mask, | 2876 TypeMask mask, |
2867 ir.Primitive value) { | 2877 ir.Primitive value) { |
2868 return buildInstanceNoSuchMethod( | 2878 return buildSuperNoSuchMethod( |
2869 new Selector.setter(new Name(element.name, element.library)), | 2879 new Selector.setter(new Name(element.name, element.library)), |
2870 mask, | 2880 mask, |
2871 <ir.Primitive>[value]); | 2881 <ir.Primitive>[value]); |
2872 } | 2882 } |
2873 | 2883 |
2874 @override | 2884 @override |
2875 ir.Primitive handleSuperCompounds( | 2885 ir.Primitive handleSuperCompounds( |
2876 ast.SendSet node, | 2886 ast.SendSet node, |
2877 Element getter, | 2887 Element getter, |
2878 CompoundGetter getterKind, | 2888 CompoundGetter getterKind, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3011 Element indexSetFunction, | 3021 Element indexSetFunction, |
3012 ast.Node index, | 3022 ast.Node index, |
3013 CompoundRhs rhs, | 3023 CompoundRhs rhs, |
3014 arg, | 3024 arg, |
3015 {bool isGetterValid, | 3025 {bool isGetterValid, |
3016 bool isSetterValid}) { | 3026 bool isSetterValid}) { |
3017 ir.Primitive indexValue = visit(index); | 3027 ir.Primitive indexValue = visit(index); |
3018 return translateCompounds(node, () { | 3028 return translateCompounds(node, () { |
3019 return isGetterValid | 3029 return isGetterValid |
3020 ? irBuilder.buildSuperIndex(indexFunction, indexValue) | 3030 ? irBuilder.buildSuperIndex(indexFunction, indexValue) |
3021 : buildInstanceNoSuchMethod( | 3031 : buildSuperNoSuchMethod( |
3022 new Selector.index(), | 3032 new Selector.index(), |
3023 elements.getGetterTypeMaskInComplexSendSet(node), | 3033 elements.getGetterTypeMaskInComplexSendSet(node), |
3024 <ir.Primitive>[indexValue]); | 3034 <ir.Primitive>[indexValue]); |
3025 }, rhs, (ir.Primitive result) { | 3035 }, rhs, (ir.Primitive result) { |
3026 if (isSetterValid) { | 3036 if (isSetterValid) { |
3027 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 3037 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
3028 } else { | 3038 } else { |
3029 buildInstanceNoSuchMethod( | 3039 buildSuperNoSuchMethod( |
3030 new Selector.indexSet(), | 3040 new Selector.indexSet(), |
3031 elements.getTypeMask(node), | 3041 elements.getTypeMask(node), |
3032 <ir.Primitive>[indexValue, result]); | 3042 <ir.Primitive>[indexValue, result]); |
3033 } | 3043 } |
3034 }); | 3044 }); |
3035 } | 3045 } |
3036 | 3046 |
3037 /// Build code to handle foreign code, that is, native JavaScript code, or | 3047 /// Build code to handle foreign code, that is, native JavaScript code, or |
3038 /// builtin values and operations of the backend. | 3048 /// builtin values and operations of the backend. |
3039 ir.Primitive handleForeignCode(ast.Send node, | 3049 ir.Primitive handleForeignCode(ast.Send node, |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3320 sourceInformation: sourceInformationBuilder.buildGet(node)); | 3330 sourceInformation: sourceInformationBuilder.buildGet(node)); |
3321 } | 3331 } |
3322 | 3332 |
3323 ir.Primitive visitThrow(ast.Throw node) { | 3333 ir.Primitive visitThrow(ast.Throw node) { |
3324 assert(irBuilder.isOpen); | 3334 assert(irBuilder.isOpen); |
3325 // This function is not called for throw expressions occurring as | 3335 // This function is not called for throw expressions occurring as |
3326 // statements. | 3336 // statements. |
3327 return irBuilder.buildNonTailThrow(visit(node.expression)); | 3337 return irBuilder.buildNonTailThrow(visit(node.expression)); |
3328 } | 3338 } |
3329 | 3339 |
3330 ir.Primitive buildInstanceNoSuchMethod(Selector selector, | 3340 ir.Primitive buildSuperNoSuchMethod(Selector selector, |
3331 TypeMask mask, | 3341 TypeMask mask, |
3332 List<ir.Primitive> arguments) { | 3342 List<ir.Primitive> arguments) { |
3333 return irBuilder.buildDynamicInvocation( | 3343 ClassElement cls = elements.analyzedElement.enclosingClass; |
3334 irBuilder.buildThis(), | 3344 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); |
3335 Selectors.noSuchMethod_, | 3345 if (!Selectors.noSuchMethod_.signatureApplies(element)) { |
3336 mask, | 3346 element = compiler.coreClasses.objectClass.lookupMember( |
| 3347 Identifiers.noSuchMethod_); |
| 3348 } |
| 3349 return irBuilder.buildSuperMethodInvocation( |
| 3350 element, |
| 3351 Selectors.noSuchMethod_.callStructure, |
3337 [irBuilder.buildInvocationMirror(selector, arguments)]); | 3352 [irBuilder.buildInvocationMirror(selector, arguments)]); |
3338 } | 3353 } |
3339 | 3354 |
3340 @override | 3355 @override |
3341 ir.Primitive visitUnresolvedCompound( | 3356 ir.Primitive visitUnresolvedCompound( |
3342 ast.Send node, | 3357 ast.Send node, |
3343 Element element, | 3358 Element element, |
3344 op.AssignmentOperator operator, | 3359 op.AssignmentOperator operator, |
3345 ast.Node rhs, _) { | 3360 ast.Node rhs, _) { |
3346 // TODO(asgerf): What is unresolved? The getter and/or the setter? | 3361 // TODO(asgerf): What is unresolved? The getter and/or the setter? |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3435 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), | 3450 return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), |
3436 [visit(rhs)]); | 3451 [visit(rhs)]); |
3437 } | 3452 } |
3438 | 3453 |
3439 @override | 3454 @override |
3440 ir.Primitive visitUnresolvedSuperIndex( | 3455 ir.Primitive visitUnresolvedSuperIndex( |
3441 ast.Send node, | 3456 ast.Send node, |
3442 Element function, | 3457 Element function, |
3443 ast.Node index, _) { | 3458 ast.Node index, _) { |
3444 // Assume the index getter is missing. | 3459 // Assume the index getter is missing. |
3445 return buildInstanceNoSuchMethod( | 3460 return buildSuperNoSuchMethod( |
3446 new Selector.index(), elements.getTypeMask(node), [visit(index)]); | 3461 new Selector.index(), elements.getTypeMask(node), [visit(index)]); |
3447 } | 3462 } |
3448 | 3463 |
3449 @override | 3464 @override |
3450 ir.Primitive visitUnresolvedSuperBinary( | 3465 ir.Primitive visitUnresolvedSuperBinary( |
3451 ast.Send node, | 3466 ast.Send node, |
3452 Element element, | 3467 Element element, |
3453 op.BinaryOperator operator, | 3468 op.BinaryOperator operator, |
3454 ast.Node argument, _) { | 3469 ast.Node argument, _) { |
3455 return buildInstanceNoSuchMethod( | 3470 return buildSuperNoSuchMethod( |
3456 elements.getSelector(node), | 3471 elements.getSelector(node), |
3457 elements.getTypeMask(node), | 3472 elements.getTypeMask(node), |
3458 [visit(argument)]); | 3473 [visit(argument)]); |
3459 } | 3474 } |
3460 | 3475 |
3461 @override | 3476 @override |
3462 ir.Primitive visitUnresolvedSuperUnary( | 3477 ir.Primitive visitUnresolvedSuperUnary( |
3463 ast.Send node, | 3478 ast.Send node, |
3464 op.UnaryOperator operator, | 3479 op.UnaryOperator operator, |
3465 Element element, _) { | 3480 Element element, _) { |
3466 return buildInstanceNoSuchMethod( | 3481 return buildSuperNoSuchMethod( |
3467 elements.getSelector(node), elements.getTypeMask(node), []); | 3482 elements.getSelector(node), elements.getTypeMask(node), []); |
3468 } | 3483 } |
3469 | 3484 |
3470 @override | 3485 @override |
3471 ir.Primitive bulkHandleNode(ast.Node node, String message, _) { | 3486 ir.Primitive bulkHandleNode(ast.Node node, String message, _) { |
3472 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}"); | 3487 return giveup(node, "Unhandled node: ${message.replaceAll('#', '$node')}"); |
3473 } | 3488 } |
3474 | 3489 |
3475 @override | 3490 @override |
3476 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) { | 3491 ir.Primitive bulkHandleError(ast.Node node, ErroneousElement error, _) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3543 return irBuilder.buildStaticNoSuchMethod( | 3558 return irBuilder.buildStaticNoSuchMethod( |
3544 new Selector.setter(field.memberName), | 3559 new Selector.setter(field.memberName), |
3545 [visit(rhs)]); | 3560 [visit(rhs)]); |
3546 } | 3561 } |
3547 | 3562 |
3548 @override | 3563 @override |
3549 ir.Primitive visitFinalSuperFieldSet( | 3564 ir.Primitive visitFinalSuperFieldSet( |
3550 ast.SendSet node, | 3565 ast.SendSet node, |
3551 FieldElement field, | 3566 FieldElement field, |
3552 ast.Node rhs, _) { | 3567 ast.Node rhs, _) { |
3553 return buildInstanceNoSuchMethod( | 3568 return buildSuperNoSuchMethod( |
3554 new Selector.setter(field.memberName), | 3569 new Selector.setter(field.memberName), |
3555 elements.getTypeMask(node), | 3570 elements.getTypeMask(node), |
3556 [visit(rhs)]); | 3571 [visit(rhs)]); |
3557 } | 3572 } |
3558 | 3573 |
3559 @override | 3574 @override |
3560 ir.Primitive handleImmutableLocalSet( | 3575 ir.Primitive handleImmutableLocalSet( |
3561 ast.SendSet node, | 3576 ast.SendSet node, |
3562 LocalElement local, | 3577 LocalElement local, |
3563 ast.Node rhs, _) { | 3578 ast.Node rhs, _) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3610 new Selector.call(setter.memberName, callStructure), | 3625 new Selector.call(setter.memberName, callStructure), |
3611 arguments); | 3626 arguments); |
3612 } | 3627 } |
3613 | 3628 |
3614 @override | 3629 @override |
3615 ir.Primitive visitSuperGetterSet( | 3630 ir.Primitive visitSuperGetterSet( |
3616 ast.SendSet node, | 3631 ast.SendSet node, |
3617 GetterElement getter, | 3632 GetterElement getter, |
3618 ast.Node rhs, | 3633 ast.Node rhs, |
3619 _) { | 3634 _) { |
3620 return buildInstanceNoSuchMethod( | 3635 return buildSuperNoSuchMethod( |
3621 new Selector.setter(getter.memberName), | 3636 new Selector.setter(getter.memberName), |
3622 elements.getTypeMask(node), | 3637 elements.getTypeMask(node), |
3623 [visit(rhs)]); | 3638 [visit(rhs)]); |
3624 } | 3639 } |
3625 | 3640 |
3626 @override | 3641 @override |
3627 ir.Primitive visitSuperMethodSet( | 3642 ir.Primitive visitSuperMethodSet( |
3628 ast.Send node, | 3643 ast.Send node, |
3629 MethodElement method, | 3644 MethodElement method, |
3630 ast.Node rhs, | 3645 ast.Node rhs, |
3631 _) { | 3646 _) { |
3632 return buildInstanceNoSuchMethod( | 3647 return buildSuperNoSuchMethod( |
3633 new Selector.setter(method.memberName), | 3648 new Selector.setter(method.memberName), |
3634 elements.getTypeMask(node), | 3649 elements.getTypeMask(node), |
3635 [visit(rhs)]); | 3650 [visit(rhs)]); |
3636 } | 3651 } |
3637 | 3652 |
3638 @override | 3653 @override |
3639 ir.Primitive visitSuperSetterGet( | 3654 ir.Primitive visitSuperSetterGet( |
3640 ast.Send node, | 3655 ast.Send node, |
3641 SetterElement setter, _) { | 3656 SetterElement setter, _) { |
3642 return buildInstanceNoSuchMethod( | 3657 return buildSuperNoSuchMethod( |
3643 new Selector.setter(setter.memberName), | 3658 new Selector.setter(setter.memberName), |
3644 elements.getTypeMask(node), | 3659 elements.getTypeMask(node), |
3645 []); | 3660 []); |
3646 } | 3661 } |
3647 | 3662 |
3648 @override | 3663 @override |
3649 ir.Primitive visitSuperSetterInvoke( | 3664 ir.Primitive visitSuperSetterInvoke( |
3650 ast.Send node, | 3665 ast.Send node, |
3651 SetterElement setter, | 3666 SetterElement setter, |
3652 ast.NodeList argumentsNode, | 3667 ast.NodeList argumentsNode, |
3653 CallStructure callStructure, _) { | 3668 CallStructure callStructure, _) { |
3654 List<ir.Primitive> arguments = <ir.Primitive>[]; | 3669 List<ir.Primitive> arguments = <ir.Primitive>[]; |
3655 callStructure = | 3670 callStructure = |
3656 translateDynamicArguments(argumentsNode, callStructure, arguments); | 3671 translateDynamicArguments(argumentsNode, callStructure, arguments); |
3657 return buildInstanceNoSuchMethod( | 3672 return buildSuperNoSuchMethod( |
3658 new Selector.call(setter.memberName, callStructure), | 3673 new Selector.call(setter.memberName, callStructure), |
3659 elements.getTypeMask(node), | 3674 elements.getTypeMask(node), |
3660 arguments); | 3675 arguments); |
3661 } | 3676 } |
3662 | 3677 |
3663 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { | 3678 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { |
3664 try { | 3679 try { |
3665 return action(); | 3680 return action(); |
3666 } catch(e) { | 3681 } catch(e) { |
3667 if (e == ABORT_IRNODE_BUILDER) { | 3682 if (e == ABORT_IRNODE_BUILDER) { |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3900 } | 3915 } |
3901 | 3916 |
3902 Element get closureConverter { | 3917 Element get closureConverter { |
3903 return _backend.helpers.closureConverter; | 3918 return _backend.helpers.closureConverter; |
3904 } | 3919 } |
3905 | 3920 |
3906 void addNativeMethod(FunctionElement function) { | 3921 void addNativeMethod(FunctionElement function) { |
3907 _backend.emitter.nativeEmitter.nativeMethods.add(function); | 3922 _backend.emitter.nativeEmitter.nativeMethods.add(function); |
3908 } | 3923 } |
3909 } | 3924 } |
OLD | NEW |