| 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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 | 146 |
| 153 /** | 147 /** |
| 154 * Generate "is tests" for [cls] itself, and the "is tests" for the | 148 * Generate "is tests" for [cls] itself, and the "is tests" for the |
| 155 * classes it implements and type argument substitution functions for these | 149 * classes it implements and type argument substitution functions for these |
| 156 * tests. We don't need to add the "is tests" of the super class because | 150 * tests. We don't need to add the "is tests" of the super class because |
| 157 * they will be inherited at runtime, but we may need to generate the | 151 * they will be inherited at runtime, but we may need to generate the |
| 158 * substitutions, because they may have changed. | 152 * substitutions, because they may have changed. |
| 159 */ | 153 */ |
| 160 void _generateIsTestsOn( | 154 void _generateIsTestsOn( |
| 161 ClassElement cls, | 155 ClassElement cls, |
| 162 void generateIsTest(Element element), | 156 void <- (Element) generateIsTest, |
| 163 FunctionTypeSignatureEmitter generateFunctionTypeSignature, | 157 void <- (Element method, FunctionType methodType) |
| 164 SubstitutionEmitter generateSubstitution, | 158 generateFunctionTypeSignature, |
| 159 void <- (Element, {bool emitNull}) generateSubstitution, |
| 165 void emitTypeCheck(TypeCheck check)) { | 160 void emitTypeCheck(TypeCheck check)) { |
| 166 Setlet<Element> generated = new Setlet<Element>(); | 161 Setlet<Element> generated = new Setlet<Element>(); |
| 167 | 162 |
| 168 if (checkedClasses.contains(cls)) { | 163 if (checkedClasses.contains(cls)) { |
| 169 generateIsTest(cls); | 164 generateIsTest(cls); |
| 170 generateSubstitution(cls); | 165 generateSubstitution(cls); |
| 171 generated.add(cls); | 166 generated.add(cls); |
| 172 } | 167 } |
| 173 | 168 |
| 174 // Precomputed is checks. | 169 // Precomputed is checks. |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 _generateInterfacesIsTests(interfaceType.element, generateIsTest, | 257 _generateInterfacesIsTests(interfaceType.element, generateIsTest, |
| 263 generateSubstitution, generated); | 258 generateSubstitution, generated); |
| 264 } | 259 } |
| 265 } | 260 } |
| 266 | 261 |
| 267 /** | 262 /** |
| 268 * Generate "is tests" where [cls] is being implemented. | 263 * Generate "is tests" where [cls] is being implemented. |
| 269 */ | 264 */ |
| 270 void _generateInterfacesIsTests( | 265 void _generateInterfacesIsTests( |
| 271 ClassElement cls, | 266 ClassElement cls, |
| 272 void generateIsTest(ClassElement element), | 267 void <- ClassElement generateIsTest, |
| 273 SubstitutionEmitter generateSubstitution, | 268 void <- (Element, {bool emitNull}) generateSubstitution, |
| 274 Set<Element> alreadyGenerated) { | 269 Set<Element> alreadyGenerated) { |
| 270 |
| 275 void tryEmitTest(ClassElement check) { | 271 void tryEmitTest(ClassElement check) { |
| 276 if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) { | 272 if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) { |
| 277 alreadyGenerated.add(check); | 273 alreadyGenerated.add(check); |
| 278 generateIsTest(check); | 274 generateIsTest(check); |
| 279 generateSubstitution(check); | 275 generateSubstitution(check); |
| 280 } | 276 } |
| 281 } | 277 } |
| 282 | 278 |
| 283 tryEmitTest(cls); | 279 tryEmitTest(cls); |
| 284 | 280 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 } | 331 } |
| 336 jsAst.Expression convertRtiToRuntimeType = backend.emitter | 332 jsAst.Expression convertRtiToRuntimeType = backend.emitter |
| 337 .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType); | 333 .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType); |
| 338 | 334 |
| 339 return new StubMethod( | 335 return new StubMethod( |
| 340 name, | 336 name, |
| 341 js('function () { return #(#) }', | 337 js('function () { return #(#) }', |
| 342 [convertRtiToRuntimeType, computeTypeVariable])); | 338 [convertRtiToRuntimeType, computeTypeVariable])); |
| 343 } | 339 } |
| 344 } | 340 } |
| OLD | NEW |