| 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 library closureToClassMapper; | 5 library closureToClassMapper; |
| 6 | 6 |
| 7 import "elements/elements.dart"; | 7 import "elements/elements.dart"; |
| 8 import "dart2jslib.dart"; | 8 import "dart2jslib.dart"; |
| 9 import "dart_types.dart"; | 9 import "dart_types.dart"; |
| 10 import "scanner/scannerlib.dart" show Token; | 10 import "scanner/scannerlib.dart" show Token; |
| (...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 compiler.backend.classNeedsRti(currentElement.enclosingElement)) { | 763 compiler.backend.classNeedsRti(currentElement.enclosingElement)) { |
| 764 // Declare the type parameters in the scope. Generative | 764 // Declare the type parameters in the scope. Generative |
| 765 // constructors just use 'this'. | 765 // constructors just use 'this'. |
| 766 ClassElement cls = currentElement.enclosingElement; | 766 ClassElement cls = currentElement.enclosingElement; |
| 767 cls.typeVariables.forEach((TypeVariableType typeVariable) { | 767 cls.typeVariables.forEach((TypeVariableType typeVariable) { |
| 768 declareLocal(typeVariable.element); | 768 declareLocal(typeVariable.element); |
| 769 }); | 769 }); |
| 770 } | 770 } |
| 771 | 771 |
| 772 DartType type = element.computeType(compiler); | 772 DartType type = element.computeType(compiler); |
| 773 // Compute the function type and check for type variables in return or | 773 // If the method needs RTI, or checked mode is set, we need to |
| 774 // parameter types. | 774 // escape the potential type variables used in that closure. |
| 775 if (type.containsTypeVariables) { | 775 if (element is FunctionElement |
| 776 registerNeedsThis(); | 776 && (compiler.backend.methodNeedsRti(element) || |
| 777 } | 777 compiler.enableTypeAssertions)) { |
| 778 // Ensure that closure that need runtime type information has access to | 778 analyzeTypeVariables(type); |
| 779 // this of the enclosing class. | |
| 780 if (element is FunctionElement && | |
| 781 closureData.thisElement != null && | |
| 782 type.containsTypeVariables && | |
| 783 compiler.backend.methodNeedsRti(element)) { | |
| 784 registerNeedsThis(); | |
| 785 } | 779 } |
| 786 | 780 |
| 787 visitChildren(); | 781 visitChildren(); |
| 788 }); | 782 }); |
| 789 | 783 |
| 790 | 784 |
| 791 ClosureClassMap savedClosureData = closureData; | 785 ClosureClassMap savedClosureData = closureData; |
| 792 bool savedInsideClosure = insideClosure; | 786 bool savedInsideClosure = insideClosure; |
| 793 | 787 |
| 794 // Restore old values. | 788 // Restore old values. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 } | 828 } |
| 835 | 829 |
| 836 visitTryStatement(TryStatement node) { | 830 visitTryStatement(TryStatement node) { |
| 837 // TODO(ngeoffray): implement finer grain state. | 831 // TODO(ngeoffray): implement finer grain state. |
| 838 bool oldInTryStatement = inTryStatement; | 832 bool oldInTryStatement = inTryStatement; |
| 839 inTryStatement = true; | 833 inTryStatement = true; |
| 840 node.visitChildren(this); | 834 node.visitChildren(this); |
| 841 inTryStatement = oldInTryStatement; | 835 inTryStatement = oldInTryStatement; |
| 842 } | 836 } |
| 843 } | 837 } |
| OLD | NEW |