Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: pkg/compiler/lib/src/compile_time_constants.dart

Issue 1919143002: Store constant variable initializers in elements. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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;
11 import 'constant_system_dart.dart'; 11 import 'constant_system_dart.dart';
12 import 'constants/constant_system.dart'; 12 import 'constants/constant_system.dart';
13 import 'constants/evaluation.dart'; 13 import 'constants/evaluation.dart';
14 import 'constants/expressions.dart'; 14 import 'constants/expressions.dart';
15 import 'constants/values.dart'; 15 import 'constants/values.dart';
16 import 'core_types.dart' show CoreTypes; 16 import 'core_types.dart' show CoreTypes;
17 import 'dart_types.dart'; 17 import 'dart_types.dart';
18 import 'elements/elements.dart'; 18 import 'elements/elements.dart';
19 import 'elements/modelx.dart' show FunctionElementX; 19 import 'elements/modelx.dart' show FieldElementX, FunctionElementX;
20 import 'resolution/tree_elements.dart' show TreeElements; 20 import 'resolution/tree_elements.dart' show TreeElements;
21 import 'resolution/operators.dart'; 21 import 'resolution/operators.dart';
22 import 'tree/tree.dart'; 22 import 'tree/tree.dart';
23 import 'util/util.dart' show Link; 23 import 'util/util.dart' show Link;
24 import 'universe/call_structure.dart' show CallStructure; 24 import 'universe/call_structure.dart' show CallStructure;
25 25
26 /// A [ConstantEnvironment] provides access for constants compiled for variable 26 /// A [ConstantEnvironment] provides access for constants compiled for variable
27 /// initializers. 27 /// initializers.
28 abstract class ConstantEnvironment { 28 abstract class ConstantEnvironment {
29 /// The [ConstantSystem] used by this environment. 29 /// The [ConstantSystem] used by this environment.
30 ConstantSystem get constantSystem; 30 ConstantSystem get constantSystem;
31 31
32 /// Returns the constant value computed for [expression]. 32 /// Returns the constant value computed for [expression].
33 // TODO(johnniwinther): Support directly evaluation of [expression]. 33 // TODO(johnniwinther): Support directly evaluation of [expression].
34 ConstantValue getConstantValue(ConstantExpression expression); 34 ConstantValue getConstantValue(ConstantExpression expression);
35 35
36 /// Returns the constant value for the initializer of [element]. 36 /// Returns the constant value for the initializer of [element].
37 @deprecated
37 ConstantValue getConstantValueForVariable(VariableElement element); 38 ConstantValue getConstantValueForVariable(VariableElement element);
38
39 /// Returns the constant for the initializer of [element].
40 ConstantExpression getConstantForVariable(VariableElement element);
41 } 39 }
42 40
43 /// A class that can compile and provide constants for variables, nodes and 41 /// A class that can compile and provide constants for variables, nodes and
44 /// metadata. 42 /// metadata.
45 abstract class ConstantCompiler extends ConstantEnvironment { 43 abstract class ConstantCompiler extends ConstantEnvironment {
46 /// Compiles the compile-time constant for the initializer of [element], or 44 /// Compiles the compile-time constant for the initializer of [element], or
47 /// reports an error if the initializer is not a compile-time constant. 45 /// reports an error if the initializer is not a compile-time constant.
48 /// 46 ///
49 /// Depending on implementation, the constant compiler might also compute 47 /// Depending on implementation, the constant compiler might also compute
50 /// the compile-time constant for the backend interpretation of constants. 48 /// the compile-time constant for the backend interpretation of constants.
51 /// 49 ///
52 /// The returned constant is always of the frontend interpretation. 50 /// The returned constant is always of the frontend interpretation.
53 ConstantExpression compileConstant(VariableElement element); 51 ConstantExpression compileConstant(VariableElement element);
54 52
55 /// Computes the compile-time constant for the variable initializer, 53 /// Computes the compile-time constant for the variable initializer,
56 /// if possible. 54 /// if possible.
57 void compileVariable(VariableElement element); 55 ConstantExpression compileVariable(VariableElement element);
58 56
59 /// Compiles the constant for [node]. 57 /// Compiles the constant for [node].
60 /// 58 ///
61 /// Reports an error if [node] is not a compile-time constant and 59 /// Reports an error if [node] is not a compile-time constant and
62 /// [enforceConst]. 60 /// [enforceConst].
63 /// 61 ///
64 /// If `!enforceConst`, then if [node] is a "runtime constant" (for example 62 /// If `!enforceConst`, then if [node] is a "runtime constant" (for example
65 /// a reference to a deferred constant) it will be returned - otherwise null 63 /// a reference to a deferred constant) it will be returned - otherwise null
66 /// is returned. 64 /// is returned.
67 /// 65 ///
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 final Map<ConstantExpression, ConstantValue> constantValueMap = 147 final Map<ConstantExpression, ConstantValue> constantValueMap =
150 <ConstantExpression, ConstantValue>{}; 148 <ConstantExpression, ConstantValue>{};
151 149
152 ConstantCompilerBase(this.compiler, this.constantSystem); 150 ConstantCompilerBase(this.compiler, this.constantSystem);
153 151
154 DiagnosticReporter get reporter => compiler.reporter; 152 DiagnosticReporter get reporter => compiler.reporter;
155 153
156 CoreTypes get coreTypes => compiler.coreTypes; 154 CoreTypes get coreTypes => compiler.coreTypes;
157 155
158 @override 156 @override
157 @deprecated
159 ConstantValue getConstantValueForVariable(VariableElement element) { 158 ConstantValue getConstantValueForVariable(VariableElement element) {
160 return getConstantValue(initialVariableValues[element.declaration]); 159 return getConstantValue(initialVariableValues[element.declaration]);
161 } 160 }
162 161
163 @override
164 ConstantExpression getConstantForVariable(VariableElement element) {
165 return initialVariableValues[element.declaration];
166 }
167
168 ConstantExpression compileConstant(VariableElement element) { 162 ConstantExpression compileConstant(VariableElement element) {
169 return internalCompileVariable(element, true, true); 163 return internalCompileVariable(element, true, true);
170 } 164 }
171 165
172 @override 166 @override
173 void evaluate(ConstantExpression constant) { 167 void evaluate(ConstantExpression constant) {
174 constantValueMap.putIfAbsent(constant, () { 168 constantValueMap.putIfAbsent(constant, () {
175 return constant.evaluate( 169 return constant.evaluate(
176 new _CompilerEnvironment(compiler), constantSystem); 170 new _CompilerEnvironment(compiler), constantSystem);
177 }); 171 });
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
1270 }); 1264 });
1271 } 1265 }
1272 1266
1273 /// Builds a normalized list of the constant values for each field in the 1267 /// Builds a normalized list of the constant values for each field in the
1274 /// inheritance chain of [classElement]. 1268 /// inheritance chain of [classElement].
1275 Map<FieldElement, AstConstant> buildFieldConstants( 1269 Map<FieldElement, AstConstant> buildFieldConstants(
1276 ClassElement classElement) { 1270 ClassElement classElement) {
1277 Map<FieldElement, AstConstant> fieldConstants = 1271 Map<FieldElement, AstConstant> fieldConstants =
1278 <FieldElement, AstConstant>{}; 1272 <FieldElement, AstConstant>{};
1279 classElement.implementation.forEachInstanceField( 1273 classElement.implementation.forEachInstanceField(
1280 (ClassElement enclosing, FieldElement field) { 1274 (ClassElement enclosing, FieldElementX field) {
1281 AstConstant fieldValue = fieldValues[field]; 1275 AstConstant fieldValue = fieldValues[field];
1282 if (fieldValue == null) { 1276 if (fieldValue == null) {
1283 // Use the default value. 1277 // Use the default value.
1284 ConstantExpression fieldExpression = 1278 ConstantExpression fieldExpression =
1285 handler.internalCompileVariable(field, true, false); 1279 handler.internalCompileVariable(field, true, false);
1280 field.constant = fieldExpression;
1286 fieldValue = new AstConstant.fromDefaultValue( 1281 fieldValue = new AstConstant.fromDefaultValue(
1287 field, fieldExpression, handler.getConstantValue(fieldExpression)); 1282 field, fieldExpression, handler.getConstantValue(fieldExpression));
1288 // TODO(het): If the field value doesn't typecheck due to the type 1283 // TODO(het): If the field value doesn't typecheck due to the type
1289 // variable in the constructor invocation, then report the error on the 1284 // variable in the constructor invocation, then report the error on the
1290 // invocation rather than the field. 1285 // invocation rather than the field.
1291 potentiallyCheckType(field, fieldValue); 1286 potentiallyCheckType(field, fieldValue);
1292 } 1287 }
1293 fieldConstants[field] = fieldValue; 1288 fieldConstants[field] = fieldValue;
1294 }, includeSuperAndInjectedMembers: true); 1289 }, includeSuperAndInjectedMembers: true);
1295 return fieldConstants; 1290 return fieldConstants;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698