| Index: pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
|
| index dcab36a23909a0250981dd8ee8384431b36fd66b..6077e6d0579633df18e7acdbcf92b904f48d2159 100644
|
| --- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
|
| @@ -115,6 +115,10 @@ class JavaScriptConstantCompiler extends ConstantCompilerBase
|
| final Map<Node, ConstantExpression> nodeConstantMap =
|
| new Map<Node, ConstantExpression>();
|
|
|
| + // Constants computed for metadata.
|
| + final Map<MetadataAnnotation, ConstantExpression> metadataConstantMap =
|
| + new Map<MetadataAnnotation, ConstantExpression>();
|
| +
|
| JavaScriptConstantCompiler(Compiler compiler)
|
| : super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM);
|
|
|
| @@ -208,7 +212,15 @@ class JavaScriptConstantCompiler extends ConstantCompilerBase
|
| }
|
|
|
| ConstantValue getConstantValueForMetadata(MetadataAnnotation metadata) {
|
| - return getConstantValue(metadata.constant);
|
| + return getConstantValue(metadataConstantMap[metadata]);
|
| + }
|
| +
|
| + ConstantExpression compileMetadata(
|
| + MetadataAnnotation metadata, Node node, TreeElements elements) {
|
| + ConstantExpression constant =
|
| + super.compileMetadata(metadata, node, elements);
|
| + metadataConstantMap[metadata] = constant;
|
| + return constant;
|
| }
|
|
|
| void forgetElement(Element element) {
|
| @@ -218,6 +230,29 @@ class JavaScriptConstantCompiler extends ConstantCompilerBase
|
| element.node.accept(new ForgetConstantNodeVisitor(this));
|
| }
|
| }
|
| +
|
| + @override
|
| + ConstantValue getConstantValue(ConstantExpression expression) {
|
| + assert(invariant(CURRENT_ELEMENT_SPANNABLE, expression != null,
|
| + message: "ConstantExpression is null in getConstantValue."));
|
| + // TODO(johhniwinther): ensure expressions have been evaluated at this
|
| + // point. This can't be enabled today due to dartbug.com/26406.
|
| + if (compiler.serialization.supportsDeserialization) {
|
| + evaluate(expression);
|
| + }
|
| + ConstantValue value = super.getConstantValue(expression);
|
| + if (value == null &&
|
| + expression != null &&
|
| + expression.kind == ConstantExpressionKind.ERRONEOUS) {
|
| + // TODO(johnniwinther): When the Dart constant system sees a constant
|
| + // expression as erroneous but the JavaScript constant system finds it ok
|
| + // we have store a constant value for the erroneous constant expression.
|
| + // Ensure the computed constant expressions are always the same; that only
|
| + // the constant values may be different.
|
| + value = new NullConstantValue();
|
| + }
|
| + return value;
|
| + }
|
| }
|
|
|
| class ForgetConstantElementVisitor
|
| @@ -226,6 +261,7 @@ class ForgetConstantElementVisitor
|
|
|
| void visitElement(Element e, JavaScriptConstantCompiler constants) {
|
| for (MetadataAnnotation data in e.implementation.metadata) {
|
| + constants.metadataConstantMap.remove(data);
|
| if (data.hasNode) {
|
| data.node.accept(new ForgetConstantNodeVisitor(constants));
|
| }
|
|
|