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

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1136843006: dart2js cps: Access to lazily initialized fields. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebase Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698