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 library dart2js.compile_time_constant_evaluator; | 5 library dart2js.compile_time_constant_evaluator; |
6 | 6 |
7 import 'common.dart'; | 7 import 'common.dart'; |
8 import 'common/resolution.dart' show Resolution; | 8 import 'common/resolution.dart' show Resolution; |
9 import 'common/tasks.dart' show CompilerTask; | 9 import 'common/tasks.dart' show CompilerTask; |
10 import 'compiler.dart' show Compiler; | 10 import 'compiler.dart' show Compiler; |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 /// report an error if [element] does not typecheck. | 186 /// report an error if [element] does not typecheck. |
187 ConstantExpression internalCompileVariable( | 187 ConstantExpression internalCompileVariable( |
188 VariableElement element, bool isConst, bool checkType) { | 188 VariableElement element, bool isConst, bool checkType) { |
189 if (initialVariableValues.containsKey(element.declaration)) { | 189 if (initialVariableValues.containsKey(element.declaration)) { |
190 ConstantExpression result = initialVariableValues[element.declaration]; | 190 ConstantExpression result = initialVariableValues[element.declaration]; |
191 return result; | 191 return result; |
192 } | 192 } |
193 AstElement currentElement = element.analyzableElement; | 193 AstElement currentElement = element.analyzableElement; |
194 return reporter.withCurrentElement(currentElement, () { | 194 return reporter.withCurrentElement(currentElement, () { |
195 // TODO(johnniwinther): Avoid this eager analysis. | 195 // TODO(johnniwinther): Avoid this eager analysis. |
196 _analyzeElementEagerly(compiler, currentElement); | 196 compiler.resolution.ensureResolved(currentElement.declaration); |
197 | 197 |
198 ConstantExpression constant = compileVariableWithDefinitions( | 198 ConstantExpression constant = compileVariableWithDefinitions( |
199 element, currentElement.resolvedAst.elements, | 199 element, currentElement.resolvedAst.elements, |
200 isConst: isConst, checkType: checkType); | 200 isConst: isConst, checkType: checkType); |
201 return constant; | 201 return constant; |
202 }); | 202 }); |
203 } | 203 } |
204 | 204 |
205 /** | 205 /** |
206 * Returns the a compile-time constant if the variable could be compiled | 206 * Returns the a compile-time constant if the variable could be compiled |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 return createConstructorInvocation(node, type, constructor, callStructure, | 840 return createConstructorInvocation(node, type, constructor, callStructure, |
841 arguments: node.send.arguments); | 841 arguments: node.send.arguments); |
842 } | 842 } |
843 | 843 |
844 AstConstant createConstructorInvocation(Node node, InterfaceType type, | 844 AstConstant createConstructorInvocation(Node node, InterfaceType type, |
845 ConstructorElement constructor, CallStructure callStructure, | 845 ConstructorElement constructor, CallStructure callStructure, |
846 {Link<Node> arguments, List<AstConstant> normalizedArguments}) { | 846 {Link<Node> arguments, List<AstConstant> normalizedArguments}) { |
847 // TODO(ahe): This is nasty: we must eagerly analyze the | 847 // TODO(ahe): This is nasty: we must eagerly analyze the |
848 // constructor to ensure the redirectionTarget has been computed | 848 // constructor to ensure the redirectionTarget has been computed |
849 // correctly. Find a way to avoid this. | 849 // correctly. Find a way to avoid this. |
850 _analyzeElementEagerly(compiler, constructor); | 850 resolution.ensureResolved(constructor.declaration); |
851 | 851 |
852 // The redirection chain of this element may not have been resolved through | 852 // The redirection chain of this element may not have been resolved through |
853 // a post-process action, so we have to make sure it is done here. | 853 // a post-process action, so we have to make sure it is done here. |
854 compiler.resolver.resolveRedirectionChain(constructor, node); | 854 compiler.resolver.resolveRedirectionChain(constructor, node); |
855 | 855 |
856 bool isInvalid = false; | 856 bool isInvalid = false; |
857 InterfaceType constructedType = type; | 857 InterfaceType constructedType = type; |
858 ConstructorElement implementation; | 858 ConstructorElement implementation; |
859 if (constructor.isRedirectingFactory) { | 859 if (constructor.isRedirectingFactory) { |
860 if (constructor.isEffectiveTargetMalformed) { | 860 if (constructor.isEffectiveTargetMalformed) { |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 /** | 1097 /** |
1098 * Documentation wanted -- johnniwinther | 1098 * Documentation wanted -- johnniwinther |
1099 * | 1099 * |
1100 * Invariant: [constructor] must be an implementation element. | 1100 * Invariant: [constructor] must be an implementation element. |
1101 */ | 1101 */ |
1102 ConstructorEvaluator(InterfaceType this.constructedType, | 1102 ConstructorEvaluator(InterfaceType this.constructedType, |
1103 FunctionElement constructor, ConstantCompiler handler, Compiler compiler) | 1103 FunctionElement constructor, ConstantCompiler handler, Compiler compiler) |
1104 : this.constructor = constructor, | 1104 : this.constructor = constructor, |
1105 this.definitions = new Map<Element, AstConstant>(), | 1105 this.definitions = new Map<Element, AstConstant>(), |
1106 this.fieldValues = new Map<Element, AstConstant>(), | 1106 this.fieldValues = new Map<Element, AstConstant>(), |
1107 this.resolvedAst = _analyzeElementEagerly(compiler, constructor), | 1107 this.resolvedAst = |
| 1108 compiler.resolution.computeResolvedAst(constructor.declaration), |
1108 super(handler, null, compiler, isConst: true) { | 1109 super(handler, null, compiler, isConst: true) { |
1109 assert(invariant(constructor, constructor.isImplementation)); | 1110 assert(invariant(constructor, constructor.isImplementation)); |
1110 } | 1111 } |
1111 | 1112 |
1112 @override | 1113 @override |
1113 TreeElements get elements => resolvedAst.elements; | 1114 TreeElements get elements => resolvedAst.elements; |
1114 | 1115 |
1115 AstConstant visitSend(Send send) { | 1116 AstConstant visitSend(Send send) { |
1116 Element element = elements[send]; | 1117 Element element = elements[send]; |
1117 if (Elements.isLocal(element)) { | 1118 if (Elements.isLocal(element)) { |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1329 class ErroneousAstConstant extends AstConstant { | 1330 class ErroneousAstConstant extends AstConstant { |
1330 ErroneousAstConstant(Element element, Node node) | 1331 ErroneousAstConstant(Element element, Node node) |
1331 : super( | 1332 : super( |
1332 element, | 1333 element, |
1333 node, | 1334 node, |
1334 // TODO(johnniwinther): Return a [NonConstantValue] instead. | 1335 // TODO(johnniwinther): Return a [NonConstantValue] instead. |
1335 new ErroneousConstantExpression(), | 1336 new ErroneousConstantExpression(), |
1336 new NullConstantValue()); | 1337 new NullConstantValue()); |
1337 } | 1338 } |
1338 | 1339 |
1339 // TODO(johnniwinther): Clean this up. | |
1340 ResolvedAst _analyzeElementEagerly(Compiler compiler, AstElement element) { | |
1341 compiler.resolution.computeWorldImpact(element.declaration); | |
1342 return element.resolvedAst; | |
1343 } | |
1344 | |
1345 class _CompilerEnvironment implements Environment { | 1340 class _CompilerEnvironment implements Environment { |
1346 final Compiler compiler; | 1341 final Compiler compiler; |
1347 | 1342 |
1348 _CompilerEnvironment(this.compiler); | 1343 _CompilerEnvironment(this.compiler); |
1349 | 1344 |
1350 @override | 1345 @override |
1351 String readFromEnvironment(String name) { | 1346 String readFromEnvironment(String name) { |
1352 return compiler.fromEnvironment(name); | 1347 return compiler.fromEnvironment(name); |
1353 } | 1348 } |
1354 } | 1349 } |
OLD | NEW |