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 dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 // Function signatures used in the generation of runtime type information. | |
8 typedef void FunctionTypeSignatureEmitter( | |
9 Element method, FunctionType methodType); | |
10 | |
11 typedef void SubstitutionEmitter(Element element, {bool emitNull}); | |
12 | |
13 class TypeTestProperties { | 7 class TypeTestProperties { |
14 /// The index of the function type into the metadata. | 8 /// The index of the function type into the metadata. |
15 /// | 9 /// |
16 /// If the class doesn't have a function type this field is `null`. | 10 /// If the class doesn't have a function type this field is `null`. |
17 /// | 11 /// |
18 /// If the is tests were generated with `storeFunctionTypeInMetadata` set to | 12 /// If the is tests were generated with `storeFunctionTypeInMetadata` set to |
19 /// `false`, this field is `null`, and the [properties] contain a property | 13 /// `false`, this field is `null`, and the [properties] contain a property |
20 /// that encodes the function type. | 14 /// that encodes the function type. |
21 jsAst.Expression functionTypeIndex; | 15 jsAst.Expression functionTypeIndex; |
22 | 16 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 144 |
151 /** | 145 /** |
152 * Generate "is tests" for [cls] itself, and the "is tests" for the | 146 * Generate "is tests" for [cls] itself, and the "is tests" for the |
153 * classes it implements and type argument substitution functions for these | 147 * classes it implements and type argument substitution functions for these |
154 * tests. We don't need to add the "is tests" of the super class because | 148 * tests. We don't need to add the "is tests" of the super class because |
155 * they will be inherited at runtime, but we may need to generate the | 149 * they will be inherited at runtime, but we may need to generate the |
156 * substitutions, because they may have changed. | 150 * substitutions, because they may have changed. |
157 */ | 151 */ |
158 void _generateIsTestsOn( | 152 void _generateIsTestsOn( |
159 ClassElement cls, | 153 ClassElement cls, |
160 void generateIsTest(Element element), | 154 (Element) -> void generateIsTest, |
161 FunctionTypeSignatureEmitter generateFunctionTypeSignature, | 155 (Element method, FunctionType methodType) -> void |
162 SubstitutionEmitter generateSubstitution, | 156 generateFunctionTypeSignature, |
| 157 (Element, {bool emitNull}) -> void generateSubstitution, |
163 void emitTypeCheck(TypeCheck check)) { | 158 void emitTypeCheck(TypeCheck check)) { |
164 Setlet<Element> generated = new Setlet<Element>(); | 159 Setlet<Element> generated = new Setlet<Element>(); |
165 | 160 |
166 if (checkedClasses.contains(cls)) { | 161 if (checkedClasses.contains(cls)) { |
167 generateIsTest(cls); | 162 generateIsTest(cls); |
168 generateSubstitution(cls); | 163 generateSubstitution(cls); |
169 generated.add(cls); | 164 generated.add(cls); |
170 } | 165 } |
171 | 166 |
172 // Precomputed is checks. | 167 // Precomputed is checks. |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 _generateInterfacesIsTests(interfaceType.element, generateIsTest, | 255 _generateInterfacesIsTests(interfaceType.element, generateIsTest, |
261 generateSubstitution, generated); | 256 generateSubstitution, generated); |
262 } | 257 } |
263 } | 258 } |
264 | 259 |
265 /** | 260 /** |
266 * Generate "is tests" where [cls] is being implemented. | 261 * Generate "is tests" where [cls] is being implemented. |
267 */ | 262 */ |
268 void _generateInterfacesIsTests( | 263 void _generateInterfacesIsTests( |
269 ClassElement cls, | 264 ClassElement cls, |
270 void generateIsTest(ClassElement element), | 265 ClassElement -> void generateIsTest, |
271 SubstitutionEmitter generateSubstitution, | 266 (Element, {bool emitNull}) -> void generateSubstitution, |
272 Set<Element> alreadyGenerated) { | 267 Set<Element> alreadyGenerated) { |
| 268 |
273 void tryEmitTest(ClassElement check) { | 269 void tryEmitTest(ClassElement check) { |
274 if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) { | 270 if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) { |
275 alreadyGenerated.add(check); | 271 alreadyGenerated.add(check); |
276 generateIsTest(check); | 272 generateIsTest(check); |
277 generateSubstitution(check); | 273 generateSubstitution(check); |
278 } | 274 } |
279 } | 275 } |
280 | 276 |
281 tryEmitTest(cls); | 277 tryEmitTest(cls); |
282 | 278 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 } | 329 } |
334 jsAst.Expression convertRtiToRuntimeType = backend.emitter | 330 jsAst.Expression convertRtiToRuntimeType = backend.emitter |
335 .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType); | 331 .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType); |
336 | 332 |
337 return new StubMethod( | 333 return new StubMethod( |
338 name, | 334 name, |
339 js('function () { return #(#) }', | 335 js('function () { return #(#) }', |
340 [convertRtiToRuntimeType, computeTypeVariable])); | 336 [convertRtiToRuntimeType, computeTypeVariable])); |
341 } | 337 } |
342 } | 338 } |
OLD | NEW |