OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 7 /** |
8 * A function element that represents a closure call. The signature is copied | 8 * A function element that represents a closure call. The signature is copied |
9 * from the given element. | 9 * from the given element. |
10 */ | 10 */ |
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 addInstanceMember(member, builder); | 1168 addInstanceMember(member, builder); |
1169 } | 1169 } |
1170 } | 1170 } |
1171 | 1171 |
1172 classElement.implementation.forEachMember( | 1172 classElement.implementation.forEachMember( |
1173 visitMember, | 1173 visitMember, |
1174 includeBackendMembers: true, | 1174 includeBackendMembers: true, |
1175 includeSuperMembers: false); | 1175 includeSuperMembers: false); |
1176 | 1176 |
1177 void generateIsTest(Element other) { | 1177 void generateIsTest(Element other) { |
1178 jsAst.Expression code; | |
1179 if (other == compiler.objectClass && other != classElement) { | 1178 if (other == compiler.objectClass && other != classElement) { |
1180 // Avoid emitting [:$isObject:] on all classes but [Object]. | 1179 // Avoid emitting [:$isObject:] on all classes but [Object]. |
1181 return; | 1180 return; |
1182 } | 1181 } |
1183 if (nativeEmitter.requiresNativeIsCheck(other)) { | 1182 builder.addProperty(namer.operatorIs(other), js('true')); |
1184 code = js.fun([], [js.return_(true)]); | |
1185 } else { | |
1186 code = js('true'); | |
1187 } | |
1188 builder.addProperty(namer.operatorIs(other), code); | |
1189 } | 1183 } |
1190 | 1184 |
1191 void generateSubstitution(Element other, {bool emitNull: false}) { | 1185 void generateSubstitution(Element other, {bool emitNull: false}) { |
1192 RuntimeTypes rti = backend.rti; | 1186 RuntimeTypes rti = backend.rti; |
1193 // TODO(karlklose): support typedefs with variables. | 1187 // TODO(karlklose): support typedefs with variables. |
1194 jsAst.Expression expression; | 1188 jsAst.Expression expression; |
1195 bool needsNativeCheck = nativeEmitter.requiresNativeIsCheck(other); | 1189 bool needsNativeCheck = nativeEmitter.requiresNativeIsCheck(other); |
1196 if (other.kind == ElementKind.CLASS) { | 1190 if (other.kind == ElementKind.CLASS) { |
1197 String substitution = rti.getSupertypeSubstitution(classElement, other, | 1191 String substitution = rti.getSupertypeSubstitution(classElement, other, |
1198 alwaysGenerateFunction: true); | 1192 alwaysGenerateFunction: true); |
1199 if (substitution != null) { | 1193 if (substitution != null) { |
1200 expression = new jsAst.LiteralExpression(substitution); | 1194 expression = new jsAst.LiteralExpression(substitution); |
1201 } else if (emitNull || needsNativeCheck) { | 1195 } else if (emitNull || needsNativeCheck) { |
1202 expression = new jsAst.LiteralNull(); | 1196 expression = new jsAst.LiteralNull(); |
1203 } | 1197 } |
1204 } | 1198 } |
1205 if (expression != null) { | 1199 if (expression != null) { |
1206 if (needsNativeCheck) { | |
1207 expression = js.fun([], js.return_(expression)); | |
1208 } | |
1209 builder.addProperty(namer.substitutionName(other), expression); | 1200 builder.addProperty(namer.substitutionName(other), expression); |
1210 } | 1201 } |
1211 } | 1202 } |
1212 | 1203 |
1213 generateIsTestsOn(classElement, generateIsTest, generateSubstitution); | 1204 generateIsTestsOn(classElement, generateIsTest, generateSubstitution); |
1214 | 1205 |
1215 if (identical(classElement, compiler.objectClass) | 1206 if (identical(classElement, compiler.objectClass) |
1216 && compiler.enabledNoSuchMethod) { | 1207 && compiler.enabledNoSuchMethod) { |
1217 // Emit the noSuchMethod handlers on the Object prototype now, | 1208 // Emit the noSuchMethod handlers on the Object prototype now, |
1218 // so that the code in the dynamicFunction helper can find | 1209 // so that the code in the dynamicFunction helper can find |
(...skipping 1828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3047 """; | 3038 """; |
3048 const String HOOKS_API_USAGE = """ | 3039 const String HOOKS_API_USAGE = """ |
3049 // The code supports the following hooks: | 3040 // The code supports the following hooks: |
3050 // dartPrint(message) - if this function is defined it is called | 3041 // dartPrint(message) - if this function is defined it is called |
3051 // instead of the Dart [print] method. | 3042 // instead of the Dart [print] method. |
3052 // dartMainRunner(main) - if this function is defined, the Dart [main] | 3043 // dartMainRunner(main) - if this function is defined, the Dart [main] |
3053 // method will not be invoked directly. | 3044 // method will not be invoked directly. |
3054 // Instead, a closure that will invoke [main] is | 3045 // Instead, a closure that will invoke [main] is |
3055 // passed to [dartMainRunner]. | 3046 // passed to [dartMainRunner]. |
3056 """; | 3047 """; |
OLD | NEW |