| Index: sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/ssa/nodes.dart (revision 15192)
|
| +++ sdk/lib/_internal/compiler/implementation/ssa/nodes.dart (working copy)
|
| @@ -32,6 +32,7 @@
|
| R visitIndex(HIndex node);
|
| R visitIndexAssign(HIndexAssign node);
|
| R visitIntegerCheck(HIntegerCheck node);
|
| + R visitInterceptor(HInterceptor node);
|
| R visitInvokeClosure(HInvokeClosure node);
|
| R visitInvokeDynamicGetter(HInvokeDynamicGetter node);
|
| R visitInvokeDynamicMethod(HInvokeDynamicMethod node);
|
| @@ -291,6 +292,7 @@
|
| visitIndex(HIndex node) => visitInvokeStatic(node);
|
| visitIndexAssign(HIndexAssign node) => visitInvokeStatic(node);
|
| visitIntegerCheck(HIntegerCheck node) => visitCheck(node);
|
| + visitInterceptor(HInterceptor node) => visitInstruction(node);
|
| visitInvokeClosure(HInvokeClosure node)
|
| => visitInvokeDynamic(node);
|
| visitInvokeDynamicMethod(HInvokeDynamicMethod node)
|
| @@ -781,7 +783,7 @@
|
| static const int TYPE_GUARD_TYPECODE = 1;
|
| static const int BOUNDS_CHECK_TYPECODE = 2;
|
| static const int INTEGER_CHECK_TYPECODE = 3;
|
| - static const int INVOKE_INTERCEPTOR_TYPECODE = 4;
|
| + static const int INTERCEPTOR_TYPECODE = 4;
|
| static const int ADD_TYPECODE = 5;
|
| static const int DIVIDE_TYPECODE = 6;
|
| static const int MODULO_TYPECODE = 7;
|
| @@ -1391,7 +1393,6 @@
|
| }
|
|
|
| class HInvokeStatic extends HInvoke {
|
| - bool isSideEffectFree = false;
|
| /** The first input must be the target. */
|
| HInvokeStatic(inputs, [HType knownType = HType.UNKNOWN]) : super(inputs) {
|
| guaranteedType = knownType;
|
| @@ -1416,13 +1417,6 @@
|
| Compiler compiler) {
|
| return HType.UNKNOWN;
|
| }
|
| -
|
| - void prepareGvn(HTypeMap types) {
|
| - clearAllSideEffects();
|
| - if (!isSideEffectFree) {
|
| - setAllSideEffects();
|
| - }
|
| - }
|
| }
|
|
|
| class HInvokeSuper extends HInvokeStatic {
|
| @@ -2401,6 +2395,21 @@
|
| bool isCodeMotionInvariant() => !element.isAssignable();
|
| }
|
|
|
| +class HInterceptor extends HInstruction {
|
| + final Set<ClassElement> interceptedClasses;
|
| + HInterceptor(this.interceptedClasses, HInstruction receiver)
|
| + : super(<HInstruction>[receiver]);
|
| + String toString() => 'interceptor on $interceptedClasses';
|
| + accept(HVisitor visitor) => visitor.visitInterceptor(this);
|
| + HInstruction get receiver => inputs[0];
|
| +
|
| + void prepareGvn(HTypeMap types) {
|
| + clearAllSideEffects();
|
| + }
|
| +
|
| + int typeCode() => HInstruction.INTERCEPTOR_TYPECODE;
|
| +}
|
| +
|
| /** An [HLazyStatic] is a static that is initialized lazily at first read. */
|
| class HLazyStatic extends HStatic {
|
| HLazyStatic(Element element) : super(element);
|
|
|