| Index: lib/compiler/implementation/ssa/nodes.dart
|
| diff --git a/lib/compiler/implementation/ssa/nodes.dart b/lib/compiler/implementation/ssa/nodes.dart
|
| index 9b32230370bfc618358872a99edcb1ac0b9e288a..e0180e602b1b70e4f19422edf92e82b50cfde3a7 100644
|
| --- a/lib/compiler/implementation/ssa/nodes.dart
|
| +++ b/lib/compiler/implementation/ssa/nodes.dart
|
| @@ -37,6 +37,7 @@ interface HVisitor<R> {
|
| R visitInvokeStatic(HInvokeStatic node);
|
| R visitInvokeSuper(HInvokeSuper node);
|
| R visitIs(HIs node);
|
| + R visitLazyStatic(HLazyStatic node);
|
| R visitLess(HLess node);
|
| R visitLessEqual(HLessEqual node);
|
| R visitLiteralList(HLiteralList node);
|
| @@ -296,6 +297,7 @@ class HBaseVisitor extends HGraphVisitor implements HVisitor {
|
| visitInvokeStatic(HInvokeStatic node) => visitInvoke(node);
|
| visitInvokeSuper(HInvokeSuper node) => visitInvoke(node);
|
| visitJump(HJump node) => visitControlFlow(node);
|
| + visitLazyStatic(HLazyStatic node) => visitStatic(node);
|
| visitLess(HLess node) => visitRelational(node);
|
| visitLessEqual(HLessEqual node) => visitRelational(node);
|
| visitLiteralList(HLiteralList node) => visitInstruction(node);
|
| @@ -2231,6 +2233,24 @@ class HStatic extends HInstruction {
|
| bool isCodeMotionInvariant() => !element.isAssignable();
|
| }
|
|
|
| +/** An [HLazyStatic] is a static that is initialized lazily at first read. */
|
| +class HLazyStatic extends HStatic {
|
| + HLazyStatic(Element element) : super(element);
|
| +
|
| + void prepareGvn() {
|
| + // TODO: The first access has side-effects, but we afterwards we should be
|
| + // able to GVN.
|
| + setAllSideEffects();
|
| + }
|
| +
|
| + toString() => 'lazy static ${element.name}';
|
| + accept(HVisitor visitor) => visitor.visitLazyStatic(this);
|
| +
|
| + int typeCode() => 30;
|
| + // TODO(floitsch): can we do better here?
|
| + bool isCodeMotionInvariant() => false;
|
| +}
|
| +
|
| class HStaticStore extends HInstruction {
|
| Element element;
|
| HStaticStore(this.element, HInstruction value) : super(<HInstruction>[value]);
|
|
|