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