Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
index 92cbd871d27b6f1813926ea9b154f716fe40c881..22350394718529305f50211dd1f350d9e29a1b4b 100644 |
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart |
@@ -222,6 +222,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
CallStructure callStructure, |
List<ir.Primitive> arguments); |
+ /// Read the value of [field]. |
+ ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src); |
+ |
/// Creates a [TypedSelector] variant of [newSelector] using the type of |
/// [oldSelector], if available. |
/// |
@@ -755,14 +758,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
} |
@override |
- ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
- return field.isConst |
- ? irBuilder.buildConstant(getConstantForVariable(field)) |
- : irBuilder.buildStaticFieldGet(field, |
- sourceInformation: sourceInformationBuilder.buildGet(node)); |
- } |
- |
- @override |
ir.Primitive handleStaticFunctionGet( |
ast.Send node, |
MethodElement function, |
@@ -1088,13 +1083,19 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
} |
@override |
+ ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
+ return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); |
+ } |
+ |
+ @override |
ir.Primitive handleStaticFieldInvoke( |
ast.Send node, |
FieldElement field, |
ast.NodeList arguments, |
CallStructure callStructure, |
_) { |
- ir.Primitive target = irBuilder.buildStaticFieldGet(field); |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
+ ir.Primitive target = buildStaticFieldGet(field, src); |
return irBuilder.buildCallInvocation(target, |
callStructure, |
translateDynamicArguments(arguments, callStructure)); |
@@ -1425,8 +1426,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
op.AssignmentOperator operator, |
ast.Node rhs, |
_) { |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
return translateCompound( |
- getValue: () => irBuilder.buildStaticFieldGet(field), |
+ getValue: () => buildStaticFieldGet(field, src), |
operator: operator, |
rhs: rhs, |
setValue: (ir.Primitive result) { |
@@ -1441,8 +1443,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
op.IncDecOperator operator, |
arg, |
{bool isPrefix}) { |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
return translatePrefixPostfix( |
- getValue: () => irBuilder.buildStaticFieldGet(field), |
+ getValue: () => buildStaticFieldGet(field, src), |
operator: operator, |
setValue: (ir.Primitive result) { |
irBuilder.buildStaticFieldSet(field, result); |
@@ -2326,8 +2329,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
FieldElement field, |
op.AssignmentOperator operator, |
ast.Node rhs, _) { |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
return translateCompound( |
- getValue: () => irBuilder.buildStaticFieldGet(field), |
+ getValue: () => buildStaticFieldGet(field, src), |
operator: operator, |
rhs: rhs, |
setValue: (value) => buildStaticNoSuchMethod( |
@@ -2378,8 +2382,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive> |
FieldElement field, |
op.AssignmentOperator operator, |
ast.Node rhs, _) { |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
return translateCompound( |
- getValue: () => irBuilder.buildStaticFieldGet(field), |
+ getValue: () => buildStaticFieldGet(field, src), |
operator: operator, |
rhs: rhs, |
setValue: (value) => buildStaticNoSuchMethod( |
@@ -2974,6 +2979,10 @@ class DartIrBuilderVisitor extends IrBuilderVisitor { |
ir.Primitive buildAbstractClassInstantiationError(ClassElement element) { |
return giveup(null, 'Abstract class instantiation: ${element.name}'); |
} |
+ |
+ ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { |
+ return irBuilder.buildStaticFieldLazyGet(field, src); |
+ } |
} |
/// The [IrBuilder]s view on the information about the program that has been |
@@ -3112,6 +3121,17 @@ class JsIrBuilderVisitor extends IrBuilderVisitor { |
root = buildFunction(element); |
break; |
+ case ElementKind.FIELD: |
+ if (Elements.isStaticOrTopLevel(element)) { |
+ root = buildStaticFieldInitializer(element); |
+ } else { |
+ // Instance field initializers are inlined in the constructor, |
+ // so we shouldn't need to build anything here. |
+ // TODO(asgerf): But what should we return? |
+ return null; |
+ } |
+ break; |
+ |
default: |
compiler.internalError(element, "Unexpected element type $element"); |
} |
@@ -3120,6 +3140,23 @@ class JsIrBuilderVisitor extends IrBuilderVisitor { |
}); |
} |
+ ir.FunctionDefinition buildStaticFieldInitializer(FieldElement element) { |
+ if (!backend.constants.lazyStatics.contains(element)) { |
+ return null; // Nothing to do. |
+ } |
+ closureClassMap = |
+ compiler.closureToClassMapper.computeClosureToClassMapping( |
+ element, |
+ element.node, |
+ elements); |
+ IrBuilder builder = getBuilderFor(element); |
+ return withBuilder(builder, () { |
+ ir.Primitive initialValue = visit(element.initializer); |
+ irBuilder.buildReturn(initialValue); |
+ return irBuilder.makeLazyFieldInitializer(); |
+ }); |
+ } |
+ |
/// Builds the IR for an [expression] taken from a different [context]. |
/// |
/// Such expressions need to be compiled with a different [sourceFile] and |
@@ -3637,6 +3674,24 @@ class JsIrBuilderVisitor extends IrBuilderVisitor { |
new CallStructure.unnamed(1), |
[irBuilder.buildStringConstant(element.name)]); |
} |
+ |
+ @override |
+ ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
+ SourceInformation src = sourceInformationBuilder.buildGet(node); |
+ return buildStaticFieldGet(field, src); |
+ } |
+ |
+ ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { |
+ ConstantExpression constant = |
+ backend.constants.getConstantForVariable(field); |
+ if (constant != null && !field.isAssignable) { |
+ return irBuilder.buildConstant(constant); |
+ } else if (backend.constants.lazyStatics.contains(field)) { |
+ return irBuilder.buildStaticFieldLazyGet(field, src); |
+ } else { |
+ return irBuilder.buildStaticFieldGet(field, src); |
+ } |
+ } |
} |
/// Perform simple post-processing on the initial CPS-translated root term. |