Chromium Code Reviews| 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 |