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 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 /** | 7 /** |
8 * A function element that represents a closure call. The signature is copied | 8 * A function element that represents a closure call. The signature is copied |
9 * from the given element. | 9 * from the given element. |
10 */ | 10 */ |
(...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 Function computeClassFilter() { | 1722 Function computeClassFilter() { |
1723 Set<ClassElement> unneededClasses = new Set<ClassElement>(); | 1723 Set<ClassElement> unneededClasses = new Set<ClassElement>(); |
1724 // The [Bool] class is not marked as abstract, but has a factory | 1724 // The [Bool] class is not marked as abstract, but has a factory |
1725 // constructor that always throws. We never need to emit it. | 1725 // constructor that always throws. We never need to emit it. |
1726 unneededClasses.add(compiler.boolClass); | 1726 unneededClasses.add(compiler.boolClass); |
1727 | 1727 |
1728 // Go over specialized interceptors and then constants to know which | 1728 // Go over specialized interceptors and then constants to know which |
1729 // interceptors are needed. | 1729 // interceptors are needed. |
1730 Set<ClassElement> needed = new Set<ClassElement>(); | 1730 Set<ClassElement> needed = new Set<ClassElement>(); |
1731 backend.specializedGetInterceptors.forEach( | 1731 backend.specializedGetInterceptors.forEach( |
1732 (_, Collection<ClassElement> elements) { | 1732 (_, Iterable<ClassElement> elements) { |
1733 needed.addAll(elements); | 1733 needed.addAll(elements); |
1734 } | 1734 } |
1735 ); | 1735 ); |
1736 | 1736 |
1737 // Add interceptors referenced by constants. | 1737 // Add interceptors referenced by constants. |
1738 ConstantHandler handler = compiler.constantHandler; | 1738 ConstantHandler handler = compiler.constantHandler; |
1739 List<Constant> constants = handler.getConstantsForEmission(); | 1739 List<Constant> constants = handler.getConstantsForEmission(); |
1740 for (Constant constant in constants) { | 1740 for (Constant constant in constants) { |
1741 if (constant is InterceptorConstant) { | 1741 if (constant is InterceptorConstant) { |
1742 needed.add(constant.dispatchedType.element); | 1742 needed.add(constant.dispatchedType.element); |
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2413 } else { | 2413 } else { |
2414 ${mainCall}; | 2414 ${mainCall}; |
2415 } | 2415 } |
2416 } | 2416 } |
2417 """); | 2417 """); |
2418 addComment('END invoke [main].', buffer); | 2418 addComment('END invoke [main].', buffer); |
2419 } | 2419 } |
2420 | 2420 |
2421 void emitGetInterceptorMethod(CodeBuffer buffer, | 2421 void emitGetInterceptorMethod(CodeBuffer buffer, |
2422 String key, | 2422 String key, |
2423 Collection<ClassElement> classes) { | 2423 Iterable<ClassElement> classes) { |
2424 jsAst.Statement buildReturnInterceptor(ClassElement cls) { | 2424 jsAst.Statement buildReturnInterceptor(ClassElement cls) { |
2425 return js.return_(js(namer.isolateAccess(cls))['prototype']); | 2425 return js.return_(js(namer.isolateAccess(cls))['prototype']); |
2426 } | 2426 } |
2427 | 2427 |
2428 /** | 2428 /** |
2429 * Build a JavaScrit AST node for doing a type check on | 2429 * Build a JavaScrit AST node for doing a type check on |
2430 * [cls]. [cls] must be an interceptor class. | 2430 * [cls]. [cls] must be an interceptor class. |
2431 */ | 2431 */ |
2432 jsAst.Statement buildInterceptorCheck(ClassElement cls) { | 2432 jsAst.Statement buildInterceptorCheck(ClassElement cls) { |
2433 jsAst.Expression condition; | 2433 jsAst.Expression condition; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2583 compiler)); | 2583 compiler)); |
2584 buffer.write(N); | 2584 buffer.write(N); |
2585 } | 2585 } |
2586 | 2586 |
2587 /** | 2587 /** |
2588 * Emit all versions of the [:getInterceptor:] method. | 2588 * Emit all versions of the [:getInterceptor:] method. |
2589 */ | 2589 */ |
2590 void emitGetInterceptorMethods(CodeBuffer buffer) { | 2590 void emitGetInterceptorMethods(CodeBuffer buffer) { |
2591 var specializedGetInterceptors = backend.specializedGetInterceptors; | 2591 var specializedGetInterceptors = backend.specializedGetInterceptors; |
2592 for (String name in specializedGetInterceptors.keys.toList()..sort()) { | 2592 for (String name in specializedGetInterceptors.keys.toList()..sort()) { |
2593 Collection<ClassElement> classes = specializedGetInterceptors[name]; | 2593 Iterable<ClassElement> classes = specializedGetInterceptors[name]; |
2594 emitGetInterceptorMethod(buffer, name, classes); | 2594 emitGetInterceptorMethod(buffer, name, classes); |
2595 } | 2595 } |
2596 } | 2596 } |
2597 | 2597 |
2598 /** | 2598 /** |
2599 * Compute all the classes that must be emitted. | 2599 * Compute all the classes that must be emitted. |
2600 */ | 2600 */ |
2601 void computeNeededClasses() { | 2601 void computeNeededClasses() { |
2602 instantiatedClasses = | 2602 instantiatedClasses = |
2603 compiler.codegenWorld.instantiatedClasses.where(computeClassFilter()) | 2603 compiler.codegenWorld.instantiatedClasses.where(computeClassFilter()) |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3057 """; | 3057 """; |
3058 const String HOOKS_API_USAGE = """ | 3058 const String HOOKS_API_USAGE = """ |
3059 // The code supports the following hooks: | 3059 // The code supports the following hooks: |
3060 // dartPrint(message) - if this function is defined it is called | 3060 // dartPrint(message) - if this function is defined it is called |
3061 // instead of the Dart [print] method. | 3061 // instead of the Dart [print] method. |
3062 // dartMainRunner(main) - if this function is defined, the Dart [main] | 3062 // dartMainRunner(main) - if this function is defined, the Dart [main] |
3063 // method will not be invoked directly. | 3063 // method will not be invoked directly. |
3064 // Instead, a closure that will invoke [main] is | 3064 // Instead, a closure that will invoke [main] is |
3065 // passed to [dartMainRunner]. | 3065 // passed to [dartMainRunner]. |
3066 """; | 3066 """; |
OLD | NEW |