| 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.
|
|
|