| Index: pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| index 50b77b13a4ba51caee691132083c9b9e2a321e2d..7f788189c94067f1bc2290eec4351887202fa743 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
|
| @@ -599,7 +599,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| }
|
|
|
| /// Inserts [insertedCode] before [node].
|
| - ///
|
| + ///
|
| /// [node] will end up in the hole of [insertedCode], and [insertedCode]
|
| /// will become rooted where [node] was.
|
| void insertBefore(Expression node, CpsFragment insertedCode) {
|
| @@ -614,7 +614,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| // We want to recompute the types for [insertedCode] without
|
| // traversing the entire subtree of [node]. Temporarily close the
|
| // term with a dummy node while recomputing types.
|
| - context.body = new Unreachable();
|
| + context.body = new Unreachable();
|
| new ParentVisitor().visit(insertedCode.root);
|
| reanalyze(insertedCode.root);
|
|
|
| @@ -653,7 +653,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| /// The new expression will be visited.
|
| ///
|
| /// Returns true if the node was replaced.
|
| - bool constifyExpression(Invoke node) {
|
| + bool constifyExpression(CallExpression node) {
|
| Continuation continuation = node.continuation.definition;
|
| ConstantValue constant = replacements[node];
|
| if (constant == null) return false;
|
| @@ -692,13 +692,13 @@ class TransformingVisitor extends RecursiveVisitor {
|
| return;
|
| }
|
|
|
| - if (condition is ApplyBuiltinOperator &&
|
| + if (condition is ApplyBuiltinOperator &&
|
| condition.operator == BuiltinOperator.LooseEq) {
|
| Primitive leftArg = condition.arguments[0].definition;
|
| Primitive rightArg = condition.arguments[1].definition;
|
| AbstractValue left = getValue(leftArg);
|
| AbstractValue right = getValue(rightArg);
|
| - if (right.isNullConstant &&
|
| + if (right.isNullConstant &&
|
| lattice.isDefinitelyNotNumStringBool(left)) {
|
| // Rewrite:
|
| // if (x == null) S1 else S2
|
| @@ -707,7 +707,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| Branch branch = new Branch(new IsTrue(leftArg), falseCont, trueCont);
|
| replaceSubtree(node, branch);
|
| return;
|
| - } else if (left.isNullConstant &&
|
| + } else if (left.isNullConstant &&
|
| lattice.isDefinitelyNotNumStringBool(right)) {
|
| Branch branch = new Branch(new IsTrue(rightArg), falseCont, trueCont);
|
| replaceSubtree(node, branch);
|
| @@ -843,7 +843,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| }
|
|
|
| /// Create a check that throws if [index] is not a valid index on [list].
|
| - ///
|
| + ///
|
| /// This function assumes that [index] is an integer.
|
| ///
|
| /// Returns a CPS fragment whose context is the branch where no error
|
| @@ -894,7 +894,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| int count = 0;
|
| for (Reference ref = list.firstRef; ref != null; ref = ref.next) {
|
| Node use = ref.parent;
|
| - if (use is InvokeMethod &&
|
| + if (use is InvokeMethod &&
|
| (use.selector.isIndex || use.selector.isIndexSet) &&
|
| getDartReceiver(use) == list) {
|
| ++count;
|
| @@ -918,7 +918,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| if (!lattice.isDefinitelyNativeList(listValue, allowNull: true)) {
|
| return false;
|
| }
|
| - bool isFixedLength =
|
| + bool isFixedLength =
|
| lattice.isDefinitelyFixedNativeList(listValue, allowNull: true);
|
| bool isMutable =
|
| lattice.isDefinitelyMutableNativeList(listValue, allowNull: true);
|
| @@ -1041,23 +1041,23 @@ class TransformingVisitor extends RecursiveVisitor {
|
| MutableVariable current = new MutableVariable(new LoopItemEntity());
|
|
|
| // Rewrite all uses of the iterator.
|
| - while (iterator.firstRef != null) {
|
| + while (iterator.firstRef != null) {
|
| InvokeMethod use = iterator.firstRef.parent;
|
| Continuation useCont = use.continuation.definition;
|
| - if (use.selector == currentSelector) {
|
| + if (use.selector == currentSelector) {
|
| // Rewrite iterator.current to a use of the 'current' variable.
|
| Parameter result = useCont.parameters.single;
|
| if (result.hint != null) {
|
| // If 'current' was originally moved into a named variable, use
|
| // that variable name for the mutable variable.
|
| - current.hint = result.hint;
|
| + current.hint = result.hint;
|
| }
|
| - LetPrim let =
|
| + LetPrim let =
|
| makeLetPrimInvoke(new GetMutableVariable(current), useCont);
|
| replaceSubtree(use, let);
|
| } else {
|
| assert (use.selector == moveNextSelector);
|
| - // Rewrite iterator.moveNext() to:
|
| + // Rewrite iterator.moveNext() to:
|
| //
|
| // if (index < list.length) {
|
| // current = null;
|
| @@ -1075,16 +1075,16 @@ class TransformingVisitor extends RecursiveVisitor {
|
|
|
| // We must check for concurrent modification when calling moveNext.
|
| // When moveNext is used as a loop condition, the check prevents
|
| - // `index < list.length` from becoming the loop condition, and we
|
| + // `index < list.length` from becoming the loop condition, and we
|
| // get code like this:
|
| //
|
| // while (true) {
|
| // if (originalLength !== list.length) throw;
|
| - // if (index < list.length) {
|
| + // if (index < list.length) {
|
| + // ...
|
| + // } else {
|
| // ...
|
| - // } else {
|
| - // ...
|
| - // break;
|
| + // break;
|
| // }
|
| // }
|
| //
|
| @@ -1097,17 +1097,17 @@ class TransformingVisitor extends RecursiveVisitor {
|
| // if (originalLength !== list.length) throw;
|
| // }
|
| //
|
| - // The check before the loop can often be eliminated because it
|
| + // The check before the loop can often be eliminated because it
|
| // follows immediately after the 'iterator' call.
|
| InteriorNode parent = getEffectiveParent(use);
|
| if (!isFixedLength) {
|
| if (parent is Continuation && parent.isRecursive) {
|
| // Check for concurrent modification before every invocation
|
| // of the continuation.
|
| - // TODO(asgerf): Do this in a continuation so multiple
|
| + // TODO(asgerf): Do this in a continuation so multiple
|
| // continues can share the same code.
|
| - for (Reference ref = parent.firstRef;
|
| - ref != null;
|
| + for (Reference ref = parent.firstRef;
|
| + ref != null;
|
| ref = ref.next) {
|
| Expression invocationCaller = ref.parent;
|
| if (getEffectiveParent(invocationCaller) == iteratorCont) {
|
| @@ -1137,7 +1137,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| ..invokeContinuation(useCont, [falseBranch.makeFalse()]);
|
|
|
| // Return true if there are more element.
|
| - cps.setMutable(current,
|
| + cps.setMutable(current,
|
| cps.letPrim(new GetIndex(list, cps.getMutable(index))));
|
| cps.setMutable(index, cps.applyBuiltin(
|
| BuiltinOperator.NumAdd,
|
| @@ -1177,12 +1177,12 @@ class TransformingVisitor extends RecursiveVisitor {
|
|
|
| /// If [prim] is the parameter to a call continuation, returns the
|
| /// corresponding call.
|
| - Invoke getInvocationWithResult(Primitive prim) {
|
| + CallExpression getCallWithResult(Primitive prim) {
|
| if (prim is Parameter && prim.parent is Continuation) {
|
| Continuation cont = prim.parent;
|
| if (cont.hasExactlyOneUse) {
|
| Node use = cont.firstRef.parent;
|
| - if (use is Invoke) {
|
| + if (use is CallExpression) {
|
| return use;
|
| }
|
| }
|
| @@ -1243,7 +1243,7 @@ class TransformingVisitor extends RecursiveVisitor {
|
| visitInvokeStatic(invoke);
|
| return true;
|
| }
|
| - Invoke tearOffInvoke = getInvocationWithResult(tearOff);
|
| + CallExpression tearOffInvoke = getCallWithResult(tearOff);
|
| if (tearOffInvoke is InvokeMethod && tearOffInvoke.selector.isGetter) {
|
| Selector getter = tearOffInvoke.selector;
|
|
|
|
|