| 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 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 class CheckedModeHelper { | 7 class CheckedModeHelper { |
| 8 final String name; | 8 final String name; |
| 9 | 9 |
| 10 const CheckedModeHelper(String this.name); | 10 const CheckedModeHelper(String this.name); |
| 11 | 11 |
| 12 StaticUse getStaticUse(Compiler compiler) { | 12 StaticUse getStaticUse(Compiler compiler) { |
| 13 JavaScriptBackend backend = compiler.backend; | 13 JavaScriptBackend backend = compiler.backend; |
| 14 return new StaticUse.staticInvoke( | 14 return new StaticUse.staticInvoke( |
| 15 backend.helpers.findHelper(name), callStructure); | 15 backend.helpers.findHelper(name), callStructure); |
| 16 } | 16 } |
| 17 | 17 |
| 18 CallStructure get callStructure => CallStructure.ONE_ARG; | 18 CallStructure get callStructure => CallStructure.ONE_ARG; |
| 19 | 19 |
| 20 jsAst.Expression generateCall(SsaCodeGenerator codegen, | 20 jsAst.Expression generateCall( |
| 21 HTypeConversion node) { | 21 SsaCodeGenerator codegen, HTypeConversion node) { |
| 22 StaticUse staticUse = getStaticUse(codegen.compiler); | 22 StaticUse staticUse = getStaticUse(codegen.compiler); |
| 23 codegen.registry.registerStaticUse(staticUse); | 23 codegen.registry.registerStaticUse(staticUse); |
| 24 List<jsAst.Expression> arguments = <jsAst.Expression>[]; | 24 List<jsAst.Expression> arguments = <jsAst.Expression>[]; |
| 25 codegen.use(node.checkedInput); | 25 codegen.use(node.checkedInput); |
| 26 arguments.add(codegen.pop()); | 26 arguments.add(codegen.pop()); |
| 27 generateAdditionalArguments(codegen, node, arguments); | 27 generateAdditionalArguments(codegen, node, arguments); |
| 28 jsAst.Expression helper = | 28 jsAst.Expression helper = |
| 29 codegen.backend.emitter.staticFunctionAccess(staticUse.element); | 29 codegen.backend.emitter.staticFunctionAccess(staticUse.element); |
| 30 return new jsAst.Call(helper, arguments); | 30 return new jsAst.Call(helper, arguments); |
| 31 } | 31 } |
| 32 | 32 |
| 33 void generateAdditionalArguments(SsaCodeGenerator codegen, | 33 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 34 HTypeConversion node, | 34 HTypeConversion node, List<jsAst.Expression> arguments) { |
| 35 List<jsAst.Expression> arguments) { | |
| 36 // No additional arguments needed. | 35 // No additional arguments needed. |
| 37 } | 36 } |
| 38 | 37 |
| 39 static const List<CheckedModeHelper> helpers = const <CheckedModeHelper> [ | 38 static const List<CheckedModeHelper> helpers = const <CheckedModeHelper>[ |
| 40 const MalformedCheckedModeHelper('checkMalformedType'), | 39 const MalformedCheckedModeHelper('checkMalformedType'), |
| 41 const CheckedModeHelper('voidTypeCheck'), | 40 const CheckedModeHelper('voidTypeCheck'), |
| 42 const CheckedModeHelper('stringTypeCast'), | 41 const CheckedModeHelper('stringTypeCast'), |
| 43 const CheckedModeHelper('stringTypeCheck'), | 42 const CheckedModeHelper('stringTypeCheck'), |
| 44 const CheckedModeHelper('doubleTypeCast'), | 43 const CheckedModeHelper('doubleTypeCast'), |
| 45 const CheckedModeHelper('doubleTypeCheck'), | 44 const CheckedModeHelper('doubleTypeCheck'), |
| 46 const CheckedModeHelper('numTypeCast'), | 45 const CheckedModeHelper('numTypeCast'), |
| 47 const CheckedModeHelper('numTypeCheck'), | 46 const CheckedModeHelper('numTypeCheck'), |
| 48 const CheckedModeHelper('boolTypeCast'), | 47 const CheckedModeHelper('boolTypeCast'), |
| 49 const CheckedModeHelper('boolTypeCheck'), | 48 const CheckedModeHelper('boolTypeCheck'), |
| 50 const CheckedModeHelper('intTypeCast'), | 49 const CheckedModeHelper('intTypeCast'), |
| 51 const CheckedModeHelper('intTypeCheck'), | 50 const CheckedModeHelper('intTypeCheck'), |
| 52 const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCast'), | 51 const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCast'), |
| 53 const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCheck'), | 52 const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCheck'), |
| 54 const PropertyCheckedModeHelper('numberOrStringSuperTypeCast'), | 53 const PropertyCheckedModeHelper('numberOrStringSuperTypeCast'), |
| 55 const PropertyCheckedModeHelper('numberOrStringSuperTypeCheck'), | 54 const PropertyCheckedModeHelper('numberOrStringSuperTypeCheck'), |
| 56 const PropertyCheckedModeHelper('stringSuperNativeTypeCast'), | 55 const PropertyCheckedModeHelper('stringSuperNativeTypeCast'), |
| 57 const PropertyCheckedModeHelper('stringSuperNativeTypeCheck'), | 56 const PropertyCheckedModeHelper('stringSuperNativeTypeCheck'), |
| 58 const PropertyCheckedModeHelper('stringSuperTypeCast'), | 57 const PropertyCheckedModeHelper('stringSuperTypeCast'), |
| 59 const PropertyCheckedModeHelper('stringSuperTypeCheck'), | 58 const PropertyCheckedModeHelper('stringSuperTypeCheck'), |
| 60 const CheckedModeHelper('listTypeCast'), | 59 const CheckedModeHelper('listTypeCast'), |
| 61 const CheckedModeHelper('listTypeCheck'), | 60 const CheckedModeHelper('listTypeCheck'), |
| 62 const PropertyCheckedModeHelper('listSuperNativeTypeCast'), | 61 const PropertyCheckedModeHelper('listSuperNativeTypeCast'), |
| 63 const PropertyCheckedModeHelper('listSuperNativeTypeCheck'), | 62 const PropertyCheckedModeHelper('listSuperNativeTypeCheck'), |
| 64 const PropertyCheckedModeHelper('listSuperTypeCast'), | 63 const PropertyCheckedModeHelper('listSuperTypeCast'), |
| 65 const PropertyCheckedModeHelper('listSuperTypeCheck'), | 64 const PropertyCheckedModeHelper('listSuperTypeCheck'), |
| 66 const PropertyCheckedModeHelper('interceptedTypeCast'), | 65 const PropertyCheckedModeHelper('interceptedTypeCast'), |
| 67 const PropertyCheckedModeHelper('interceptedTypeCheck'), | 66 const PropertyCheckedModeHelper('interceptedTypeCheck'), |
| 68 const SubtypeCheckedModeHelper('subtypeCast'), | 67 const SubtypeCheckedModeHelper('subtypeCast'), |
| 69 const SubtypeCheckedModeHelper('assertSubtype'), | 68 const SubtypeCheckedModeHelper('assertSubtype'), |
| 70 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), | 69 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), |
| 71 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), | 70 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), |
| 72 const PropertyCheckedModeHelper('propertyTypeCast'), | 71 const PropertyCheckedModeHelper('propertyTypeCast'), |
| 73 const PropertyCheckedModeHelper('propertyTypeCheck')]; | 72 const PropertyCheckedModeHelper('propertyTypeCheck') |
| 73 ]; |
| 74 } | 74 } |
| 75 | 75 |
| 76 class MalformedCheckedModeHelper extends CheckedModeHelper { | 76 class MalformedCheckedModeHelper extends CheckedModeHelper { |
| 77 const MalformedCheckedModeHelper(String name) : super(name); | 77 const MalformedCheckedModeHelper(String name) : super(name); |
| 78 | 78 |
| 79 CallStructure get callStructure => CallStructure.TWO_ARGS; | 79 CallStructure get callStructure => CallStructure.TWO_ARGS; |
| 80 | 80 |
| 81 void generateAdditionalArguments(SsaCodeGenerator codegen, | 81 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 82 HTypeConversion node, | 82 HTypeConversion node, List<jsAst.Expression> arguments) { |
| 83 List<jsAst.Expression> arguments) { | |
| 84 ErroneousElement element = node.typeExpression.element; | 83 ErroneousElement element = node.typeExpression.element; |
| 85 arguments.add(js.escapedString(element.message)); | 84 arguments.add(js.escapedString(element.message)); |
| 86 } | 85 } |
| 87 } | 86 } |
| 88 | 87 |
| 89 class PropertyCheckedModeHelper extends CheckedModeHelper { | 88 class PropertyCheckedModeHelper extends CheckedModeHelper { |
| 90 const PropertyCheckedModeHelper(String name) : super(name); | 89 const PropertyCheckedModeHelper(String name) : super(name); |
| 91 | 90 |
| 92 CallStructure get callStructure => CallStructure.TWO_ARGS; | 91 CallStructure get callStructure => CallStructure.TWO_ARGS; |
| 93 | 92 |
| 94 void generateAdditionalArguments(SsaCodeGenerator codegen, | 93 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 95 HTypeConversion node, | 94 HTypeConversion node, List<jsAst.Expression> arguments) { |
| 96 List<jsAst.Expression> arguments) { | |
| 97 DartType type = node.typeExpression; | 95 DartType type = node.typeExpression; |
| 98 jsAst.Name additionalArgument = codegen.backend.namer.operatorIsType(type); | 96 jsAst.Name additionalArgument = codegen.backend.namer.operatorIsType(type); |
| 99 arguments.add(js.quoteName(additionalArgument)); | 97 arguments.add(js.quoteName(additionalArgument)); |
| 100 } | 98 } |
| 101 } | 99 } |
| 102 | 100 |
| 103 class TypeVariableCheckedModeHelper extends CheckedModeHelper { | 101 class TypeVariableCheckedModeHelper extends CheckedModeHelper { |
| 104 const TypeVariableCheckedModeHelper(String name) : super(name); | 102 const TypeVariableCheckedModeHelper(String name) : super(name); |
| 105 | 103 |
| 106 CallStructure get callStructure => CallStructure.TWO_ARGS; | 104 CallStructure get callStructure => CallStructure.TWO_ARGS; |
| 107 | 105 |
| 108 void generateAdditionalArguments(SsaCodeGenerator codegen, | 106 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 109 HTypeConversion node, | 107 HTypeConversion node, List<jsAst.Expression> arguments) { |
| 110 List<jsAst.Expression> arguments) { | |
| 111 assert(node.typeExpression.isTypeVariable); | 108 assert(node.typeExpression.isTypeVariable); |
| 112 codegen.use(node.typeRepresentation); | 109 codegen.use(node.typeRepresentation); |
| 113 arguments.add(codegen.pop()); | 110 arguments.add(codegen.pop()); |
| 114 } | 111 } |
| 115 } | 112 } |
| 116 | 113 |
| 117 class SubtypeCheckedModeHelper extends CheckedModeHelper { | 114 class SubtypeCheckedModeHelper extends CheckedModeHelper { |
| 118 const SubtypeCheckedModeHelper(String name) : super(name); | 115 const SubtypeCheckedModeHelper(String name) : super(name); |
| 119 | 116 |
| 120 CallStructure get callStructure => const CallStructure.unnamed(4); | 117 CallStructure get callStructure => const CallStructure.unnamed(4); |
| 121 | 118 |
| 122 void generateAdditionalArguments(SsaCodeGenerator codegen, | 119 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 123 HTypeConversion node, | 120 HTypeConversion node, List<jsAst.Expression> arguments) { |
| 124 List<jsAst.Expression> arguments) { | |
| 125 DartType type = node.typeExpression; | 121 DartType type = node.typeExpression; |
| 126 Element element = type.element; | 122 Element element = type.element; |
| 127 jsAst.Name isField = codegen.backend.namer.operatorIs(element); | 123 jsAst.Name isField = codegen.backend.namer.operatorIs(element); |
| 128 arguments.add(js.quoteName(isField)); | 124 arguments.add(js.quoteName(isField)); |
| 129 codegen.use(node.typeRepresentation); | 125 codegen.use(node.typeRepresentation); |
| 130 arguments.add(codegen.pop()); | 126 arguments.add(codegen.pop()); |
| 131 jsAst.Name asField = codegen.backend.namer.substitutionName(element); | 127 jsAst.Name asField = codegen.backend.namer.substitutionName(element); |
| 132 arguments.add(js.quoteName(asField)); | 128 arguments.add(js.quoteName(asField)); |
| 133 } | 129 } |
| 134 } | 130 } |
| OLD | NEW |