| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 /// [ConstantCompilerTask] for compilation of constants for the JavaScript | 7 /// [ConstantCompilerTask] for compilation of constants for the JavaScript |
| 8 /// backend. | 8 /// backend. |
| 9 /// | 9 /// |
| 10 /// Since this task needs to distinguish between frontend and backend constants | 10 /// Since this task needs to distinguish between frontend and backend constants |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 final Set<ConstantValue> compiledConstants = new Set<ConstantValue>(); | 108 final Set<ConstantValue> compiledConstants = new Set<ConstantValue>(); |
| 109 | 109 |
| 110 // TODO(johnniwinther): Move this to the backend constant handler. | 110 // TODO(johnniwinther): Move this to the backend constant handler. |
| 111 /** Caches the statics where the initial value cannot be eagerly compiled. */ | 111 /** Caches the statics where the initial value cannot be eagerly compiled. */ |
| 112 final Set<VariableElement> lazyStatics = new Set<VariableElement>(); | 112 final Set<VariableElement> lazyStatics = new Set<VariableElement>(); |
| 113 | 113 |
| 114 // Constants computed for constant expressions. | 114 // Constants computed for constant expressions. |
| 115 final Map<Node, ConstantExpression> nodeConstantMap = | 115 final Map<Node, ConstantExpression> nodeConstantMap = |
| 116 new Map<Node, ConstantExpression>(); | 116 new Map<Node, ConstantExpression>(); |
| 117 | 117 |
| 118 // Constants computed for metadata. | |
| 119 final Map<MetadataAnnotation, ConstantExpression> metadataConstantMap = | |
| 120 new Map<MetadataAnnotation, ConstantExpression>(); | |
| 121 | |
| 122 JavaScriptConstantCompiler(Compiler compiler) | 118 JavaScriptConstantCompiler(Compiler compiler) |
| 123 : super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM); | 119 : super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM); |
| 124 | 120 |
| 125 ConstantExpression compileVariableWithDefinitions( | 121 ConstantExpression compileVariableWithDefinitions( |
| 126 VariableElement element, TreeElements definitions, | 122 VariableElement element, TreeElements definitions, |
| 127 {bool isConst: false, bool checkType: true}) { | 123 {bool isConst: false, bool checkType: true}) { |
| 128 if (!isConst && lazyStatics.contains(element)) { | 124 if (!isConst && lazyStatics.contains(element)) { |
| 129 return null; | 125 return null; |
| 130 } | 126 } |
| 131 ConstantExpression value = super.compileVariableWithDefinitions( | 127 ConstantExpression value = super.compileVariableWithDefinitions( |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 | 201 |
| 206 ConstantExpression getConstantForNode(Node node, TreeElements definitions) { | 202 ConstantExpression getConstantForNode(Node node, TreeElements definitions) { |
| 207 ConstantExpression constant = nodeConstantMap[node]; | 203 ConstantExpression constant = nodeConstantMap[node]; |
| 208 if (constant != null) { | 204 if (constant != null) { |
| 209 return constant; | 205 return constant; |
| 210 } | 206 } |
| 211 return definitions.getConstant(node); | 207 return definitions.getConstant(node); |
| 212 } | 208 } |
| 213 | 209 |
| 214 ConstantValue getConstantValueForMetadata(MetadataAnnotation metadata) { | 210 ConstantValue getConstantValueForMetadata(MetadataAnnotation metadata) { |
| 215 return getConstantValue(metadataConstantMap[metadata]); | 211 return getConstantValue(metadata.constant); |
| 216 } | |
| 217 | |
| 218 ConstantExpression compileMetadata( | |
| 219 MetadataAnnotation metadata, Node node, TreeElements elements) { | |
| 220 ConstantExpression constant = | |
| 221 super.compileMetadata(metadata, node, elements); | |
| 222 metadataConstantMap[metadata] = constant; | |
| 223 return constant; | |
| 224 } | 212 } |
| 225 | 213 |
| 226 void forgetElement(Element element) { | 214 void forgetElement(Element element) { |
| 227 super.forgetElement(element); | 215 super.forgetElement(element); |
| 228 const ForgetConstantElementVisitor().visit(element, this); | 216 const ForgetConstantElementVisitor().visit(element, this); |
| 229 if (element is AstElement && element.hasNode) { | 217 if (element is AstElement && element.hasNode) { |
| 230 element.node.accept(new ForgetConstantNodeVisitor(this)); | 218 element.node.accept(new ForgetConstantNodeVisitor(this)); |
| 231 } | 219 } |
| 232 } | 220 } |
| 233 | |
| 234 @override | |
| 235 ConstantValue getConstantValue(ConstantExpression expression) { | |
| 236 assert(invariant(CURRENT_ELEMENT_SPANNABLE, expression != null, | |
| 237 message: "ConstantExpression is null in getConstantValue.")); | |
| 238 // TODO(johhniwinther): ensure expressions have been evaluated at this | |
| 239 // point. This can't be enabled today due to dartbug.com/26406. | |
| 240 if (compiler.serialization.supportsDeserialization) { | |
| 241 evaluate(expression); | |
| 242 } | |
| 243 ConstantValue value = super.getConstantValue(expression); | |
| 244 if (value == null && | |
| 245 expression != null && | |
| 246 expression.kind == ConstantExpressionKind.ERRONEOUS) { | |
| 247 // TODO(johnniwinther): When the Dart constant system sees a constant | |
| 248 // expression as erroneous but the JavaScript constant system finds it ok | |
| 249 // we have store a constant value for the erroneous constant expression. | |
| 250 // Ensure the computed constant expressions are always the same; that only | |
| 251 // the constant values may be different. | |
| 252 value = new NullConstantValue(); | |
| 253 } | |
| 254 return value; | |
| 255 } | |
| 256 } | 221 } |
| 257 | 222 |
| 258 class ForgetConstantElementVisitor | 223 class ForgetConstantElementVisitor |
| 259 extends BaseElementVisitor<dynamic, JavaScriptConstantCompiler> { | 224 extends BaseElementVisitor<dynamic, JavaScriptConstantCompiler> { |
| 260 const ForgetConstantElementVisitor(); | 225 const ForgetConstantElementVisitor(); |
| 261 | 226 |
| 262 void visitElement(Element e, JavaScriptConstantCompiler constants) { | 227 void visitElement(Element e, JavaScriptConstantCompiler constants) { |
| 263 for (MetadataAnnotation data in e.implementation.metadata) { | 228 for (MetadataAnnotation data in e.implementation.metadata) { |
| 264 constants.metadataConstantMap.remove(data); | |
| 265 if (data.hasNode) { | 229 if (data.hasNode) { |
| 266 data.node.accept(new ForgetConstantNodeVisitor(constants)); | 230 data.node.accept(new ForgetConstantNodeVisitor(constants)); |
| 267 } | 231 } |
| 268 } | 232 } |
| 269 } | 233 } |
| 270 | 234 |
| 271 void visitFunctionElement( | 235 void visitFunctionElement( |
| 272 FunctionElement e, JavaScriptConstantCompiler constants) { | 236 FunctionElement e, JavaScriptConstantCompiler constants) { |
| 273 super.visitFunctionElement(e, constants); | 237 super.visitFunctionElement(e, constants); |
| 274 if (e.hasFunctionSignature) { | 238 if (e.hasFunctionSignature) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 289 // TODO(ahe): This doesn't belong here. Rename this class and generalize. | 253 // TODO(ahe): This doesn't belong here. Rename this class and generalize. |
| 290 var closureClassMap = constants | 254 var closureClassMap = constants |
| 291 .compiler.closureToClassMapper.closureMappingCache | 255 .compiler.closureToClassMapper.closureMappingCache |
| 292 .remove(node); | 256 .remove(node); |
| 293 if (closureClassMap != null) { | 257 if (closureClassMap != null) { |
| 294 closureClassMap | 258 closureClassMap |
| 295 .removeMyselfFrom(constants.compiler.enqueuer.codegen.universe); | 259 .removeMyselfFrom(constants.compiler.enqueuer.codegen.universe); |
| 296 } | 260 } |
| 297 } | 261 } |
| 298 } | 262 } |
| OLD | NEW |