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 |
deleted file mode 100644 |
index fb2425407a0f9f7f60648664ab695545405aad92..0000000000000000000000000000000000000000 |
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart |
+++ /dev/null |
@@ -1,263 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-part of js_backend; |
- |
-/// [ConstantCompilerTask] for compilation of constants for the JavaScript |
-/// backend. |
-/// |
-/// Since this task needs to distinguish between frontend and backend constants |
-/// the actual compilation of the constants is forwarded to a |
-/// [DartConstantCompiler] for the frontend interpretation of the constants and |
-/// to a [JavaScriptConstantCompiler] for the backend interpretation. |
-class JavaScriptConstantTask extends ConstantCompilerTask { |
- DartConstantCompiler dartConstantCompiler; |
- JavaScriptConstantCompiler jsConstantCompiler; |
- |
- JavaScriptConstantTask(Compiler compiler) |
- : this.dartConstantCompiler = new DartConstantCompiler(compiler), |
- this.jsConstantCompiler = |
- new JavaScriptConstantCompiler(compiler), |
- super(compiler); |
- |
- String get name => 'ConstantHandler'; |
- |
- ConstantExpression getConstantForVariable(VariableElement element) { |
- return dartConstantCompiler.getConstantForVariable(element); |
- } |
- |
- ConstantExpression compileConstant(VariableElement element) { |
- return measure(() { |
- ConstantExpression result = dartConstantCompiler.compileConstant(element); |
- jsConstantCompiler.compileConstant(element); |
- return result; |
- }); |
- } |
- |
- void compileVariable(VariableElement element) { |
- measure(() { |
- jsConstantCompiler.compileVariable(element); |
- }); |
- } |
- |
- ConstantExpression compileNode(Node node, TreeElements elements) { |
- return measure(() { |
- ConstantExpression result = |
- dartConstantCompiler.compileNode(node, elements); |
- jsConstantCompiler.compileNode(node, elements); |
- return result; |
- }); |
- } |
- |
- ConstantExpression compileMetadata(MetadataAnnotation metadata, |
- Node node, |
- TreeElements elements) { |
- return measure(() { |
- ConstantExpression constant = |
- dartConstantCompiler.compileMetadata(metadata, node, elements); |
- jsConstantCompiler.compileMetadata(metadata, node, elements); |
- return constant; |
- }); |
- } |
-} |
- |
-/** |
- * The [JavaScriptConstantCompiler] is used to keep track of compile-time |
- * constants, initializations of global and static fields, and default values of |
- * optional parameters for the JavaScript interpretation of constants. |
- */ |
-class JavaScriptConstantCompiler extends ConstantCompilerBase |
- implements BackendConstantEnvironment { |
- |
- /** Set of all registered compiled constants. */ |
- final Set<ConstantValue> compiledConstants = new Set<ConstantValue>(); |
- |
- // TODO(johnniwinther): Move this to the backend constant handler. |
- /** Caches the statics where the initial value cannot be eagerly compiled. */ |
- final Set<VariableElement> lazyStatics = new Set<VariableElement>(); |
- |
- // Constants computed for constant expressions. |
- 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); |
- |
- ConstantExpression compileVariableWithDefinitions(VariableElement element, |
- TreeElements definitions, |
- {bool isConst: false}) { |
- if (!isConst && lazyStatics.contains(element)) { |
- return null; |
- } |
- ConstantExpression value = super.compileVariableWithDefinitions( |
- element, definitions, isConst: isConst); |
- if (!isConst && value == null) { |
- lazyStatics.add(element); |
- } |
- return value; |
- } |
- |
- void addCompileTimeConstantForEmission(ConstantValue constant) { |
- compiledConstants.add(constant); |
- } |
- |
- /** |
- * Returns an [Iterable] of static non final fields that need to be |
- * initialized. The fields list must be evaluated in order since they might |
- * depend on each other. |
- */ |
- Iterable<VariableElement> getStaticNonFinalFieldsForEmission() { |
- return initialVariableValues.keys.where((element) { |
- return element.kind == ElementKind.FIELD && |
- !element.isInstanceMember && |
- !element.modifiers.isFinal && |
- // The const fields are all either emitted elsewhere or inlined. |
- !element.modifiers.isConst; |
- }); |
- } |
- |
- List<VariableElement> getLazilyInitializedFieldsForEmission() { |
- return new List<VariableElement>.from(lazyStatics); |
- } |
- |
- /** |
- * Returns a list of constants topologically sorted so that dependencies |
- * appear before the dependent constant. [preSortCompare] is a comparator |
- * function that gives the constants a consistent order prior to the |
- * topological sort which gives the constants an ordering that is less |
- * sensitive to perturbations in the source code. |
- */ |
- List<ConstantValue> getConstantsForEmission([preSortCompare]) { |
- // We must emit dependencies before their uses. |
- Set<ConstantValue> seenConstants = new Set<ConstantValue>(); |
- List<ConstantValue> result = new List<ConstantValue>(); |
- |
- void addConstant(ConstantValue constant) { |
- if (!seenConstants.contains(constant)) { |
- constant.getDependencies().forEach(addConstant); |
- assert(!seenConstants.contains(constant)); |
- result.add(constant); |
- seenConstants.add(constant); |
- } |
- } |
- |
- List<ConstantValue> sorted = compiledConstants.toList(); |
- if (preSortCompare != null) { |
- sorted.sort(preSortCompare); |
- } |
- sorted.forEach(addConstant); |
- return result; |
- } |
- |
- ConstantExpression getInitialValueFor(VariableElement element) { |
- ConstantExpression initialValue = |
- initialVariableValues[element.declaration]; |
- if (initialValue == null) { |
- compiler.internalError(element, "No initial value for given element."); |
- } |
- return initialValue; |
- } |
- |
- ConstantExpression compileNode(Node node, TreeElements elements) { |
- return compileNodeWithDefinitions(node, elements); |
- } |
- |
- ConstantExpression compileNodeWithDefinitions(Node node, |
- TreeElements definitions, |
- {bool isConst: true}) { |
- ConstantExpression constant = nodeConstantMap[node]; |
- if (constant != null) { |
- return constant; |
- } |
- constant = |
- super.compileNodeWithDefinitions(node, definitions, isConst: isConst); |
- if (constant != null) { |
- nodeConstantMap[node] = constant; |
- } |
- return constant; |
- } |
- |
- ConstantExpression getConstantForNode(Node node, TreeElements definitions) { |
- ConstantExpression constant = nodeConstantMap[node]; |
- if (constant != null) { |
- return constant; |
- } |
- return definitions.getConstant(node); |
- } |
- |
- ConstantExpression getConstantForMetadata(MetadataAnnotation metadata) { |
- return metadataConstantMap[metadata]; |
- } |
- |
- ConstantExpression compileMetadata(MetadataAnnotation metadata, |
- Node node, |
- TreeElements elements) { |
- ConstantExpression constant = |
- super.compileMetadata(metadata, node, elements); |
- metadataConstantMap[metadata] = constant; |
- return constant; |
- } |
- |
- ConstantExpression createTypeConstant(TypeDeclarationElement element) { |
- DartType elementType = element.rawType; |
- DartType constantType = |
- compiler.backend.typeImplementation.computeType(compiler); |
- return new TypeConstantExpression( |
- new TypeConstantValue(elementType, constantType), elementType); |
- } |
- |
- void forgetElement(Element element) { |
- super.forgetElement(element); |
- element.accept(new ForgetConstantElementVisitor(this)); |
- if (element is AstElement && element.hasNode) { |
- element.node.accept(new ForgetConstantNodeVisitor(this)); |
- } |
- } |
-} |
- |
-class ForgetConstantElementVisitor extends ElementVisitor { |
- final JavaScriptConstantCompiler constants; |
- |
- ForgetConstantElementVisitor(this.constants); |
- |
- void visitElement(Element e) { |
- for (MetadataAnnotation data in e.metadata) { |
- constants.metadataConstantMap.remove(data); |
- if (data.hasNode) { |
- data.node.accept(new ForgetConstantNodeVisitor(constants)); |
- } |
- } |
- } |
- |
- void visitFunctionElement(FunctionElement e) { |
- super.visitFunctionElement(e); |
- if (e.hasFunctionSignature) { |
- e.functionSignature.forEachParameter(this.visit); |
- } |
- } |
-} |
- |
-class ForgetConstantNodeVisitor extends Visitor { |
- final JavaScriptConstantCompiler constants; |
- |
- ForgetConstantNodeVisitor(this.constants); |
- |
- void visitNode(Node node) { |
- node.visitChildren(this); |
- constants.nodeConstantMap.remove(node); |
- |
- // TODO(ahe): This doesn't belong here. Rename this class and generalize. |
- var closureClassMap = |
- constants.compiler.closureToClassMapper.closureMappingCache |
- .remove(node); |
- if (closureClassMap != null) { |
- closureClassMap.removeMyselfFrom( |
- constants.compiler.enqueuer.codegen.universe); |
- } |
- } |
-} |