| 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 dart2js; | 5 part of dart2js; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * The [ConstantHandler] keeps track of compile-time constants, | 8 * The [ConstantHandler] keeps track of compile-time constants, |
| 9 * initializations of global and static fields, and default values of | 9 * initializations of global and static fields, and default values of |
| 10 * optional parameters. | 10 * optional parameters. |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 DartType keysType = new InterfaceType(compiler.listClass); | 332 DartType keysType = new InterfaceType(compiler.listClass); |
| 333 ListConstant keysList = new ListConstant(keysType, keys); | 333 ListConstant keysList = new ListConstant(keysType, keys); |
| 334 compiler.constantHandler.registerCompileTimeConstant(keysList); | 334 compiler.constantHandler.registerCompileTimeConstant(keysList); |
| 335 SourceString className = hasProtoKey | 335 SourceString className = hasProtoKey |
| 336 ? MapConstant.DART_PROTO_CLASS | 336 ? MapConstant.DART_PROTO_CLASS |
| 337 : MapConstant.DART_CLASS; | 337 : MapConstant.DART_CLASS; |
| 338 ClassElement classElement = compiler.jsHelperLibrary.find(className); | 338 ClassElement classElement = compiler.jsHelperLibrary.find(className); |
| 339 classElement.ensureResolved(compiler); | 339 classElement.ensureResolved(compiler); |
| 340 // TODO(floitsch): copy over the generic type. | 340 // TODO(floitsch): copy over the generic type. |
| 341 DartType type = new InterfaceType(classElement); | 341 DartType type = new InterfaceType(classElement); |
| 342 compiler.enqueuer.codegen.registerInstantiatedClass(classElement); | 342 registerInstantiatedClass(classElement); |
| 343 Constant constant = new MapConstant(type, keysList, values, protoValue); | 343 Constant constant = new MapConstant(type, keysList, values, protoValue); |
| 344 compiler.constantHandler.registerCompileTimeConstant(constant); | 344 compiler.constantHandler.registerCompileTimeConstant(constant); |
| 345 return constant; | 345 return constant; |
| 346 } | 346 } |
| 347 | 347 |
| 348 Constant visitLiteralNull(LiteralNull node) { | 348 Constant visitLiteralNull(LiteralNull node) { |
| 349 return constantSystem.createNull(); | 349 return constantSystem.createNull(); |
| 350 } | 350 } |
| 351 | 351 |
| 352 void registerInstantiatedClass(ClassElement element) { |
| 353 compiler.enqueuer.codegen.registerInstantiatedClass(element); |
| 354 } |
| 355 |
| 356 void registerStringInstance() { |
| 357 registerInstantiatedClass(compiler.stringClass); |
| 358 } |
| 359 |
| 352 Constant visitLiteralString(LiteralString node) { | 360 Constant visitLiteralString(LiteralString node) { |
| 361 registerStringInstance(); |
| 353 return constantSystem.createString(node.dartString, node); | 362 return constantSystem.createString(node.dartString, node); |
| 354 } | 363 } |
| 355 | 364 |
| 356 Constant visitStringJuxtaposition(StringJuxtaposition node) { | 365 Constant visitStringJuxtaposition(StringJuxtaposition node) { |
| 357 StringConstant left = evaluate(node.first); | 366 StringConstant left = evaluate(node.first); |
| 358 StringConstant right = evaluate(node.second); | 367 StringConstant right = evaluate(node.second); |
| 359 if (left == null || right == null) return null; | 368 if (left == null || right == null) return null; |
| 369 registerStringInstance(); |
| 360 return constantSystem.createString( | 370 return constantSystem.createString( |
| 361 new DartString.concat(left.value, right.value), node); | 371 new DartString.concat(left.value, right.value), node); |
| 362 } | 372 } |
| 363 | 373 |
| 364 Constant visitStringInterpolation(StringInterpolation node) { | 374 Constant visitStringInterpolation(StringInterpolation node) { |
| 365 StringConstant initialString = evaluate(node.string); | 375 StringConstant initialString = evaluate(node.string); |
| 366 if (initialString == null) return null; | 376 if (initialString == null) return null; |
| 367 DartString accumulator = initialString.value; | 377 DartString accumulator = initialString.value; |
| 368 for (StringInterpolationPart part in node.parts) { | 378 for (StringInterpolationPart part in node.parts) { |
| 369 Constant expression = evaluate(part.expression); | 379 Constant expression = evaluate(part.expression); |
| 370 DartString expressionString; | 380 DartString expressionString; |
| 371 if (expression == null) { | 381 if (expression == null) { |
| 372 return signalNotCompileTimeConstant(part.expression); | 382 return signalNotCompileTimeConstant(part.expression); |
| 373 } else if (expression.isNum() || expression.isBool()) { | 383 } else if (expression.isNum() || expression.isBool()) { |
| 374 PrimitiveConstant primitive = expression; | 384 PrimitiveConstant primitive = expression; |
| 375 expressionString = new DartString.literal(primitive.value.toString()); | 385 expressionString = new DartString.literal(primitive.value.toString()); |
| 376 } else if (expression.isString()) { | 386 } else if (expression.isString()) { |
| 377 PrimitiveConstant primitive = expression; | 387 PrimitiveConstant primitive = expression; |
| 378 expressionString = primitive.value; | 388 expressionString = primitive.value; |
| 379 } else { | 389 } else { |
| 380 return signalNotCompileTimeConstant(part.expression); | 390 return signalNotCompileTimeConstant(part.expression); |
| 381 } | 391 } |
| 382 accumulator = new DartString.concat(accumulator, expressionString); | 392 accumulator = new DartString.concat(accumulator, expressionString); |
| 383 StringConstant partString = evaluate(part.string); | 393 StringConstant partString = evaluate(part.string); |
| 384 if (partString == null) return null; | 394 if (partString == null) return null; |
| 385 accumulator = new DartString.concat(accumulator, partString.value); | 395 accumulator = new DartString.concat(accumulator, partString.value); |
| 386 }; | 396 }; |
| 397 registerStringInstance(); |
| 387 return constantSystem.createString(accumulator, node); | 398 return constantSystem.createString(accumulator, node); |
| 388 } | 399 } |
| 389 | 400 |
| 390 // TODO(floitsch): provide better error-messages. | 401 // TODO(floitsch): provide better error-messages. |
| 391 Constant visitSend(Send send) { | 402 Constant visitSend(Send send) { |
| 392 Element element = elements[send]; | 403 Element element = elements[send]; |
| 393 if (send.isPropertyAccess) { | 404 if (send.isPropertyAccess) { |
| 394 if (Elements.isStaticOrTopLevelFunction(element)) { | 405 if (Elements.isStaticOrTopLevelFunction(element)) { |
| 395 compiler.codegenWorld.staticFunctionsNeedingGetter.add(element); | 406 compiler.codegenWorld.staticFunctionsNeedingGetter.add(element); |
| 396 Constant constant = new FunctionConstant(element); | 407 Constant constant = new FunctionConstant(element); |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 // Use the default value. | 820 // Use the default value. |
| 810 fieldValue = compiler.compileConstant(field); | 821 fieldValue = compiler.compileConstant(field); |
| 811 } | 822 } |
| 812 jsNewArguments.add(fieldValue); | 823 jsNewArguments.add(fieldValue); |
| 813 }, | 824 }, |
| 814 includeBackendMembers: true, | 825 includeBackendMembers: true, |
| 815 includeSuperMembers: true); | 826 includeSuperMembers: true); |
| 816 return jsNewArguments; | 827 return jsNewArguments; |
| 817 } | 828 } |
| 818 } | 829 } |
| OLD | NEW |