OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 import '../common.dart'; | 5 import '../common.dart'; |
6 import '../core_types.dart'; | 6 import '../core_types.dart'; |
7 import '../elements/elements.dart' show ErroneousElement; | 7 import '../elements/elements.dart' show ErroneousElement; |
8 import '../elements/entities.dart'; | 8 import '../elements/entities.dart'; |
9 import '../elements/resolution_types.dart' show MalformedType; | 9 import '../elements/resolution_types.dart' show MalformedType; |
10 import '../elements/types.dart'; | 10 import '../elements/types.dart'; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 CallStructure get callStructure => CallStructure.TWO_ARGS; | 82 CallStructure get callStructure => CallStructure.TWO_ARGS; |
83 | 83 |
84 void generateAdditionalArguments(SsaCodeGenerator codegen, | 84 void generateAdditionalArguments(SsaCodeGenerator codegen, |
85 HTypeConversion node, List<jsAst.Expression> arguments) { | 85 HTypeConversion node, List<jsAst.Expression> arguments) { |
86 assert(node.typeExpression.isTypeVariable); | 86 assert(node.typeExpression.isTypeVariable); |
87 codegen.use(node.typeRepresentation); | 87 codegen.use(node.typeRepresentation); |
88 arguments.add(codegen.pop()); | 88 arguments.add(codegen.pop()); |
89 } | 89 } |
90 } | 90 } |
91 | 91 |
92 class FunctionWithRepresentationCheckedModeHelper extends CheckedModeHelper { | |
Emily Fortuna
2017/02/25 00:26:02
Can you add a comment here to explain what you mea
sra1
2017/02/28 05:16:03
Done.
| |
93 const FunctionWithRepresentationCheckedModeHelper(String name) : super(name); | |
94 | |
95 CallStructure get callStructure => CallStructure.TWO_ARGS; | |
96 | |
97 void generateAdditionalArguments(SsaCodeGenerator codegen, | |
98 HTypeConversion node, List<jsAst.Expression> arguments) { | |
99 codegen.use(node.typeRepresentation); | |
100 arguments.add(codegen.pop()); | |
101 } | |
102 } | |
103 | |
92 class SubtypeCheckedModeHelper extends CheckedModeHelper { | 104 class SubtypeCheckedModeHelper extends CheckedModeHelper { |
93 const SubtypeCheckedModeHelper(String name) : super(name); | 105 const SubtypeCheckedModeHelper(String name) : super(name); |
94 | 106 |
95 CallStructure get callStructure => const CallStructure.unnamed(4); | 107 CallStructure get callStructure => const CallStructure.unnamed(4); |
96 | 108 |
97 void generateAdditionalArguments(SsaCodeGenerator codegen, | 109 void generateAdditionalArguments(SsaCodeGenerator codegen, |
98 HTypeConversion node, List<jsAst.Expression> arguments) { | 110 HTypeConversion node, List<jsAst.Expression> arguments) { |
99 InterfaceType type = node.typeExpression; | 111 InterfaceType type = node.typeExpression; |
100 ClassEntity element = type.element; | 112 ClassEntity element = type.element; |
101 jsAst.Name isField = codegen.backend.namer.operatorIs(element); | 113 jsAst.Name isField = codegen.backend.namer.operatorIs(element); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
142 const PropertyCheckedModeHelper('listSuperTypeCast'), | 154 const PropertyCheckedModeHelper('listSuperTypeCast'), |
143 const PropertyCheckedModeHelper('listSuperTypeCheck'), | 155 const PropertyCheckedModeHelper('listSuperTypeCheck'), |
144 const PropertyCheckedModeHelper('interceptedTypeCast'), | 156 const PropertyCheckedModeHelper('interceptedTypeCast'), |
145 const PropertyCheckedModeHelper('interceptedTypeCheck'), | 157 const PropertyCheckedModeHelper('interceptedTypeCheck'), |
146 const SubtypeCheckedModeHelper('subtypeCast'), | 158 const SubtypeCheckedModeHelper('subtypeCast'), |
147 const SubtypeCheckedModeHelper('assertSubtype'), | 159 const SubtypeCheckedModeHelper('assertSubtype'), |
148 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), | 160 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), |
149 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), | 161 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), |
150 const PropertyCheckedModeHelper('propertyTypeCast'), | 162 const PropertyCheckedModeHelper('propertyTypeCast'), |
151 const PropertyCheckedModeHelper('propertyTypeCheck'), | 163 const PropertyCheckedModeHelper('propertyTypeCheck'), |
164 const FunctionWithRepresentationCheckedModeHelper('functionTypeCast'), | |
165 const FunctionWithRepresentationCheckedModeHelper('functionTypeCheck'), | |
152 ]; | 166 ]; |
153 | 167 |
154 // Checked mode helpers indexed by name. | 168 // Checked mode helpers indexed by name. |
155 static final Map<String, CheckedModeHelper> checkedModeHelperByName = | 169 static final Map<String, CheckedModeHelper> checkedModeHelperByName = |
156 new Map<String, CheckedModeHelper>.fromIterable(helpers, | 170 new Map<String, CheckedModeHelper>.fromIterable(helpers, |
157 key: (helper) => helper.name); | 171 key: (helper) => helper.name); |
158 | 172 |
159 /** | 173 /** |
160 * Returns the checked mode helper that will be needed to do a type check/type | 174 * Returns the checked mode helper that will be needed to do a type check/type |
161 * cast on [type] at runtime. Note that this method is being called both by | 175 * cast on [type] at runtime. Note that this method is being called both by |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
205 if (nativeCheckOnly) return null; | 219 if (nativeCheckOnly) return null; |
206 return 'voidTypeCheck'; | 220 return 'voidTypeCheck'; |
207 } | 221 } |
208 | 222 |
209 if (type.isTypeVariable) { | 223 if (type.isTypeVariable) { |
210 return typeCast | 224 return typeCast |
211 ? 'subtypeOfRuntimeTypeCast' | 225 ? 'subtypeOfRuntimeTypeCast' |
212 : 'assertSubtypeOfRuntimeType'; | 226 : 'assertSubtypeOfRuntimeType'; |
213 } | 227 } |
214 | 228 |
215 if (type.isFunctionType) return null; | 229 if (type.isFunctionType) { |
230 return typeCast ? 'functionTypeCast' : 'functionTypeCheck'; | |
231 } | |
216 | 232 |
217 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType, | 233 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType, |
218 message: "Unexpected type: $type")); | 234 message: "Unexpected type: $type")); |
219 InterfaceType interfaceType = type; | 235 InterfaceType interfaceType = type; |
220 ClassEntity element = interfaceType.element; | 236 ClassEntity element = interfaceType.element; |
221 bool nativeCheck = true; | 237 bool nativeCheck = true; |
222 // TODO(13955), TODO(9731). The test for non-primitive types should use an | 238 // TODO(13955), TODO(9731). The test for non-primitive types should use an |
223 // interceptor. The interceptor should be an argument to HTypeConversion so | 239 // interceptor. The interceptor should be an argument to HTypeConversion so |
224 // that it can be optimized by standard interceptor optimizations. | 240 // that it can be optimized by standard interceptor optimizations. |
225 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element); | 241 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
285 | 301 |
286 if (nativeCheck) { | 302 if (nativeCheck) { |
287 // TODO(karlklose): can we get rid of this branch when we use | 303 // TODO(karlklose): can we get rid of this branch when we use |
288 // interceptors? | 304 // interceptors? |
289 return 'intercepted$suffix'; | 305 return 'intercepted$suffix'; |
290 } else { | 306 } else { |
291 return 'property$suffix'; | 307 return 'property$suffix'; |
292 } | 308 } |
293 } | 309 } |
294 } | 310 } |
OLD | NEW |