| 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 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant); | 7 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant); |
| 8 | 8 |
| 9 typedef jsAst.Expression _ConstantListGenerator(jsAst.Expression array); | 9 typedef jsAst.Expression _ConstantListGenerator(jsAst.Expression array); |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 * The given [constantReferenceGenerator] function must, when invoked with a | 32 * The given [constantReferenceGenerator] function must, when invoked with a |
| 33 * constant, either return a reference or return its literal expression if it | 33 * constant, either return a reference or return its literal expression if it |
| 34 * can be inlined. | 34 * can be inlined. |
| 35 */ | 35 */ |
| 36 ConstantEmitter( | 36 ConstantEmitter( |
| 37 this.compiler, | 37 this.compiler, |
| 38 this.namer, | 38 this.namer, |
| 39 jsAst.Expression this.constantReferenceGenerator(ConstantValue constant), | 39 jsAst.Expression this.constantReferenceGenerator(ConstantValue constant), |
| 40 this.makeConstantList); | 40 this.makeConstantList); |
| 41 | 41 |
| 42 DiagnosticReporter get reporter => compiler.reporter; |
| 43 |
| 42 /** | 44 /** |
| 43 * Constructs a literal expression that evaluates to the constant. Uses a | 45 * Constructs a literal expression that evaluates to the constant. Uses a |
| 44 * canonical name unless the constant can be emitted multiple times (as for | 46 * canonical name unless the constant can be emitted multiple times (as for |
| 45 * numbers and strings). | 47 * numbers and strings). |
| 46 */ | 48 */ |
| 47 jsAst.Expression generate(ConstantValue constant) { | 49 jsAst.Expression generate(ConstantValue constant) { |
| 48 return _visit(constant); | 50 return _visit(constant); |
| 49 } | 51 } |
| 50 | 52 |
| 51 jsAst.Expression _visit(ConstantValue constant) { | 53 jsAst.Expression _visit(ConstantValue constant) { |
| 52 return constant.accept(this, null); | 54 return constant.accept(this, null); |
| 53 } | 55 } |
| 54 | 56 |
| 55 @override | 57 @override |
| 56 jsAst.Expression visitFunction(FunctionConstantValue constant, [_]) { | 58 jsAst.Expression visitFunction(FunctionConstantValue constant, [_]) { |
| 57 compiler.internalError(NO_LOCATION_SPANNABLE, | 59 reporter.internalError(NO_LOCATION_SPANNABLE, |
| 58 "The function constant does not need specific JS code."); | 60 "The function constant does not need specific JS code."); |
| 59 return null; | 61 return null; |
| 60 } | 62 } |
| 61 | 63 |
| 62 @override | 64 @override |
| 63 jsAst.Expression visitNull(NullConstantValue constant, [_]) { | 65 jsAst.Expression visitNull(NullConstantValue constant, [_]) { |
| 64 return new jsAst.LiteralNull(); | 66 return new jsAst.LiteralNull(); |
| 65 } | 67 } |
| 66 | 68 |
| 67 static final _exponentialRE = new RegExp( | 69 static final _exponentialRE = new RegExp( |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) { | 215 } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) { |
| 214 arguments.add(jsMap()); | 216 arguments.add(jsMap()); |
| 215 } else if (field.name == JavaScriptMapConstant.KEYS_NAME) { | 217 } else if (field.name == JavaScriptMapConstant.KEYS_NAME) { |
| 216 arguments.add(constantReferenceGenerator(constant.keyList)); | 218 arguments.add(constantReferenceGenerator(constant.keyList)); |
| 217 } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) { | 219 } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) { |
| 218 assert(constant.protoValue != null); | 220 assert(constant.protoValue != null); |
| 219 arguments.add(constantReferenceGenerator(constant.protoValue)); | 221 arguments.add(constantReferenceGenerator(constant.protoValue)); |
| 220 } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) { | 222 } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) { |
| 221 arguments.add(jsGeneralMap()); | 223 arguments.add(jsGeneralMap()); |
| 222 } else { | 224 } else { |
| 223 compiler.internalError(field, | 225 reporter.internalError(field, |
| 224 "Compiler has unexpected field ${field.name} for " | 226 "Compiler has unexpected field ${field.name} for " |
| 225 "${className}."); | 227 "${className}."); |
| 226 } | 228 } |
| 227 emittedArgumentCount++; | 229 emittedArgumentCount++; |
| 228 }, | 230 }, |
| 229 includeSuperAndInjectedMembers: true); | 231 includeSuperAndInjectedMembers: true); |
| 230 if ((className == JavaScriptMapConstant.DART_STRING_CLASS && | 232 if ((className == JavaScriptMapConstant.DART_STRING_CLASS && |
| 231 emittedArgumentCount != 3) || | 233 emittedArgumentCount != 3) || |
| 232 (className == JavaScriptMapConstant.DART_PROTO_CLASS && | 234 (className == JavaScriptMapConstant.DART_PROTO_CLASS && |
| 233 emittedArgumentCount != 4) || | 235 emittedArgumentCount != 4) || |
| 234 (className == JavaScriptMapConstant.DART_GENERAL_CLASS && | 236 (className == JavaScriptMapConstant.DART_GENERAL_CLASS && |
| 235 emittedArgumentCount != 1)) { | 237 emittedArgumentCount != 1)) { |
| 236 compiler.internalError(classElement, | 238 reporter.internalError(classElement, |
| 237 "Compiler and ${className} disagree on number of fields."); | 239 "Compiler and ${className} disagree on number of fields."); |
| 238 } | 240 } |
| 239 | 241 |
| 240 jsAst.Expression constructor = | 242 jsAst.Expression constructor = |
| 241 backend.emitter.constructorAccess(classElement); | 243 backend.emitter.constructorAccess(classElement); |
| 242 jsAst.Expression value = new jsAst.New(constructor, arguments); | 244 jsAst.Expression value = new jsAst.New(constructor, arguments); |
| 243 return maybeAddTypeArguments(constant.type, value); | 245 return maybeAddTypeArguments(constant.type, value); |
| 244 } | 246 } |
| 245 | 247 |
| 246 JavaScriptBackend get backend => compiler.backend; | 248 JavaScriptBackend get backend => compiler.backend; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 266 @override | 268 @override |
| 267 jsAst.Expression visitSynthetic(SyntheticConstantValue constant, [_]) { | 269 jsAst.Expression visitSynthetic(SyntheticConstantValue constant, [_]) { |
| 268 switch (constant.kind) { | 270 switch (constant.kind) { |
| 269 case SyntheticConstantKind.DUMMY_INTERCEPTOR: | 271 case SyntheticConstantKind.DUMMY_INTERCEPTOR: |
| 270 case SyntheticConstantKind.EMPTY_VALUE: | 272 case SyntheticConstantKind.EMPTY_VALUE: |
| 271 return new jsAst.LiteralNumber('0'); | 273 return new jsAst.LiteralNumber('0'); |
| 272 case SyntheticConstantKind.TYPEVARIABLE_REFERENCE: | 274 case SyntheticConstantKind.TYPEVARIABLE_REFERENCE: |
| 273 case SyntheticConstantKind.NAME: | 275 case SyntheticConstantKind.NAME: |
| 274 return constant.payload; | 276 return constant.payload; |
| 275 default: | 277 default: |
| 276 compiler.internalError(NO_LOCATION_SPANNABLE, | 278 reporter.internalError(NO_LOCATION_SPANNABLE, |
| 277 "Unexpected DummyConstantKind ${constant.kind}"); | 279 "Unexpected DummyConstantKind ${constant.kind}"); |
| 278 return null; | 280 return null; |
| 279 } | 281 } |
| 280 } | 282 } |
| 281 | 283 |
| 282 @override | 284 @override |
| 283 jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) { | 285 jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) { |
| 284 Element element = constant.type.element; | 286 Element element = constant.type.element; |
| 285 if (backend.isForeign(element) | 287 if (backend.isForeign(element) |
| 286 && element.name == 'JS_CONST') { | 288 && element.name == 'JS_CONST') { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 317 [value, argumentList]); | 319 [value, argumentList]); |
| 318 } | 320 } |
| 319 return value; | 321 return value; |
| 320 } | 322 } |
| 321 | 323 |
| 322 @override | 324 @override |
| 323 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { | 325 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { |
| 324 return constantReferenceGenerator(constant.referenced); | 326 return constantReferenceGenerator(constant.referenced); |
| 325 } | 327 } |
| 326 } | 328 } |
| OLD | NEW |