Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 native; | 5 part of native; |
| 6 | 6 |
| 7 /// This class is a temporary work-around until we get a more powerful DartType. | 7 /// This class is a temporary work-around until we get a more powerful DartType. |
| 8 class SpecialType { | 8 class SpecialType { |
| 9 final String name; | 9 final String name; |
| 10 const SpecialType._(this.name); | 10 const SpecialType._(this.name); |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 639 isBuiltin: false, | 639 isBuiltin: false, |
| 640 validTags: const ['returns', 'creates']); | 640 validTags: const ['returns', 'creates']); |
| 641 | 641 |
| 642 return behavior; | 642 return behavior; |
| 643 } | 643 } |
| 644 | 644 |
| 645 static NativeBehavior ofMethod(FunctionElement method, Compiler compiler) { | 645 static NativeBehavior ofMethod(FunctionElement method, Compiler compiler) { |
| 646 FunctionType type = method.computeType(compiler.resolution); | 646 FunctionType type = method.computeType(compiler.resolution); |
| 647 var behavior = new NativeBehavior(); | 647 var behavior = new NativeBehavior(); |
| 648 behavior.typesReturned.add(type.returnType); | 648 behavior.typesReturned.add(type.returnType); |
| 649 JavaScriptBackend backend = compiler.backend; | |
| 650 // Note: For dart:html and other internal libraries, we trust the return | |
| 651 // type and use it to limit what we enqueue. We are more conservative about | |
| 652 // JS interop types and assume any other JS interop type can be returned | |
| 653 // from an interop call or getter. | |
| 654 if (backend.isJsInterop(method)) { | |
| 655 behavior.typesReturned.add( | |
| 656 backend.helpers.jsJavaScriptObjectClass.thisType); | |
|
sra1
2015/11/20 19:06:24
It does seem crazy to do this for 'int'.
Perhaps
Siggi Cherem (dart-lang)
2015/11/25 21:15:25
Agree - I can't do anything for int to be sound, b
| |
| 657 behavior.typesInstantiated.add( | |
| 658 backend.helpers.jsJavaScriptObjectClass.thisType); | |
| 659 } | |
| 649 if (!type.returnType.isVoid) { | 660 if (!type.returnType.isVoid) { |
| 650 // Declared types are nullable. | 661 // Declared types are nullable. |
| 651 behavior.typesReturned.add(compiler.coreTypes.nullType); | 662 behavior.typesReturned.add(compiler.coreTypes.nullType); |
| 652 } | 663 } |
| 653 behavior._capture(type, compiler.resolution); | 664 behavior._capture(type, compiler.resolution); |
| 654 | 665 |
| 655 // TODO(sra): Optional arguments are currently missing from the | 666 // TODO(sra): Optional arguments are currently missing from the |
| 656 // DartType. This should be fixed so the following work-around can be | 667 // DartType. This should be fixed so the following work-around can be |
| 657 // removed. | 668 // removed. |
| 658 method.functionSignature.forEachOptionalParameter( | 669 method.functionSignature.forEachOptionalParameter( |
| 659 (ParameterElement parameter) { | 670 (ParameterElement parameter) { |
| 660 behavior._escape(parameter.type, compiler.resolution); | 671 behavior._escape(parameter.type, compiler.resolution); |
| 661 }); | 672 }); |
| 662 | 673 |
| 663 behavior._overrideWithAnnotations(method, compiler); | 674 behavior._overrideWithAnnotations(method, compiler); |
| 664 return behavior; | 675 return behavior; |
| 665 } | 676 } |
| 666 | 677 |
| 667 static NativeBehavior ofFieldLoad(MemberElement field, Compiler compiler) { | 678 static NativeBehavior ofFieldLoad(MemberElement field, Compiler compiler) { |
| 668 Resolution resolution = compiler.resolution; | 679 Resolution resolution = compiler.resolution; |
| 669 DartType type = field.computeType(resolution); | 680 DartType type = field.computeType(resolution); |
| 670 var behavior = new NativeBehavior(); | 681 var behavior = new NativeBehavior(); |
| 671 behavior.typesReturned.add(type); | 682 behavior.typesReturned.add(type); |
| 683 JavaScriptBackend backend = compiler.backend; | |
| 684 // See comment above on ofMethod | |
| 685 if (backend.isJsInterop(field)) { | |
| 686 behavior.typesReturned.add( | |
| 687 backend.helpers.jsJavaScriptObjectClass.thisType); | |
| 688 behavior.typesInstantiated.add( | |
| 689 backend.helpers.jsJavaScriptObjectClass.thisType); | |
| 690 } | |
| 672 // Declared types are nullable. | 691 // Declared types are nullable. |
| 673 behavior.typesReturned.add(resolution.coreTypes.nullType); | 692 behavior.typesReturned.add(resolution.coreTypes.nullType); |
| 674 behavior._capture(type, resolution); | 693 behavior._capture(type, resolution); |
| 675 behavior._overrideWithAnnotations(field, compiler); | 694 behavior._overrideWithAnnotations(field, compiler); |
| 676 return behavior; | 695 return behavior; |
| 677 } | 696 } |
| 678 | 697 |
| 679 static NativeBehavior ofFieldStore(MemberElement field, Compiler compiler) { | 698 static NativeBehavior ofFieldStore(MemberElement field, Compiler compiler) { |
| 680 Resolution resolution = compiler.resolution; | 699 Resolution resolution = compiler.resolution; |
| 681 DartType type = field.computeType(resolution); | 700 DartType type = field.computeType(resolution); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 810 MessageKind.GENERIC, | 829 MessageKind.GENERIC, |
| 811 {'text': "Type '$typeString' not found."}); | 830 {'text': "Type '$typeString' not found."}); |
| 812 return const DynamicType(); | 831 return const DynamicType(); |
| 813 } | 832 } |
| 814 | 833 |
| 815 static _errorNode(locationNodeOrElement, Parsing parsing) { | 834 static _errorNode(locationNodeOrElement, Parsing parsing) { |
| 816 if (locationNodeOrElement is Node) return locationNodeOrElement; | 835 if (locationNodeOrElement is Node) return locationNodeOrElement; |
| 817 return locationNodeOrElement.parseNode(parsing); | 836 return locationNodeOrElement.parseNode(parsing); |
| 818 } | 837 } |
| 819 } | 838 } |
| OLD | NEW |