Mark some expressions after processing their components

when it's semantically correct

Expressions: calls, 'for' loops, elvis operators
It's significant for reporting 'unreachable code' correctly
This commit is contained in:
Svetlana Isakova
2014-06-12 12:58:57 +04:00
parent 6e622f2301
commit 9480907514
39 changed files with 181 additions and 178 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.jet.lang.cfg;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
@@ -333,9 +332,6 @@ public class JetControlFlowProcessor {
public void visitBinaryExpressionVoid(@NotNull JetBinaryExpression expression, CFPContext context) {
JetSimpleNameExpression operationReference = expression.getOperationReference();
IElementType operationType = operationReference.getReferencedNameElementType();
if (!ImmutableSet.of(ANDAND, OROR, EQ, ELVIS).contains(operationType)) {
mark(expression);
}
JetExpression left = expression.getLeft();
JetExpression right = expression.getRight();
@@ -385,11 +381,12 @@ public class JetControlFlowProcessor {
}
}
else {
generateBothArguments(expression);
generateBothArgumentsAndMark(expression);
}
}
else if (operationType == ELVIS) {
generateInstructions(left, NOT_IN_CONDITION);
mark(expression);
Label afterElvis = builder.createUnboundLabel();
builder.jumpOnTrue(afterElvis, expression, builder.getBoundValue(left));
if (right != null) {
@@ -400,7 +397,7 @@ public class JetControlFlowProcessor {
}
else {
if (!generateCall(expression, operationReference)) {
generateBothArguments(expression);
generateBothArgumentsAndMark(expression);
}
}
}
@@ -430,7 +427,7 @@ public class JetControlFlowProcessor {
);
}
private void generateBothArguments(JetBinaryExpression expression) {
private void generateBothArgumentsAndMark(JetBinaryExpression expression) {
JetExpression left = JetPsiUtil.deparenthesize(expression.getLeft());
if (left != null) {
generateInstructions(left, NOT_IN_CONDITION);
@@ -439,8 +436,8 @@ public class JetControlFlowProcessor {
if (right != null) {
generateInstructions(right, NOT_IN_CONDITION);
}
createNonSyntheticValue(expression, left, right);
mark(expression);
}
private void visitAssignment(JetExpression lhs, @NotNull Function0<PseudoValue> rhsDeferredValue, JetExpression parentExpression) {
@@ -592,7 +589,6 @@ public class JetControlFlowProcessor {
@Override
public void visitUnaryExpressionVoid(@NotNull JetUnaryExpression expression, CFPContext context) {
mark(expression);
JetSimpleNameExpression operationSign = expression.getOperationReference();
IElementType operationType = operationSign.getReferencedNameElementType();
JetExpression baseExpression = expression.getBaseExpression();
@@ -795,7 +791,6 @@ public class JetControlFlowProcessor {
@Override
public void visitWhileExpressionVoid(@NotNull JetWhileExpression expression, CFPContext context) {
mark(expression);
LoopInfo loopInfo = builder.enterLoop(expression, null, null);
builder.bindLabel(loopInfo.getConditionEntryPoint());
@@ -803,6 +798,7 @@ public class JetControlFlowProcessor {
if (condition != null) {
generateInstructions(condition, IN_CONDITION);
}
mark(expression);
boolean conditionIsTrueConstant = CompileTimeConstantUtils.canBeReducedToBooleanConstant(condition, trace, true);
if (!conditionIsTrueConstant) {
builder.jumpOnFalse(loopInfo.getExitPoint(), expression, builder.getBoundValue(condition));
@@ -843,7 +839,6 @@ public class JetControlFlowProcessor {
@Override
public void visitForExpressionVoid(@NotNull JetForExpression expression, CFPContext context) {
builder.enterLexicalScope(expression);
mark(expression);
JetExpression loopRange = expression.getLoopRange();
if (loopRange != null) {
@@ -863,6 +858,7 @@ public class JetControlFlowProcessor {
builder.bindLabel(loopInfo.getBodyEntryPoint());
writeLoopParameterAssignment(expression);
mark(expression);
JetExpression body = expression.getBody();
if (body != null) {
generateInstructions(body, NOT_IN_CONDITION);
@@ -1070,8 +1066,6 @@ public class JetControlFlowProcessor {
@Override
public void visitCallExpressionVoid(@NotNull JetCallExpression expression, CFPContext context) {
mark(expression);
JetExpression calleeExpression = expression.getCalleeExpression();
if (!generateCall(expression, calleeExpression)) {
List<JetExpression> inputExpressions = new ArrayList<JetExpression>();
@@ -1090,6 +1084,7 @@ public class JetControlFlowProcessor {
inputExpressions.add(calleeExpression);
inputExpressions.add(generateAndGetReceiverIfAny(expression));
mark(expression);
createNonSyntheticValue(expression, inputExpressions);
}
}
@@ -1416,6 +1411,7 @@ public class JetControlFlowProcessor {
: "Variable-based call with non-empty argument list: " + resolvedCall.getCall().getCallElement().getText();
return builder.readVariable(calleeExpression, callExpression, resolvedCall, receivers);
}
mark(resolvedCall.getCall().getCallElement());
return builder.call(calleeExpression, callExpression, resolvedCall, receivers, parameterValues);
}
@@ -882,7 +882,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
context.trace, "trace to resolve 'equals(Any?)' interpreting as of type Any? an expression:", right);
traceInterpretingRightAsNullableAny.record(EXPRESSION_TYPE, right, KotlinBuiltIns.getInstance().getNullableAnyType());
Call call = CallMaker.makeCallWithExpressions(operationSign, receiver, null, operationSign, Collections.singletonList(right));
Call call = CallMaker.makeCallWithExpressions(expression, receiver, null, operationSign, Collections.singletonList(right));
ExpressionTypingContext newContext = context.replaceBindingTrace(traceInterpretingRightAsNullableAny);
OverloadResolutionResults<FunctionDescriptor> resolutionResults =
components.callResolver.resolveCallWithGivenName(newContext, call, operationSign, OperatorConventions.EQUALS);
@@ -14,14 +14,14 @@ L0:
2 mark({ val b: Boolean if (1 < 2) { use(b) } else { b = true } })
v(val b: Boolean) INIT: in: {} out: {b=D}
mark(if (1 < 2) { use(b) } else { b = true }) INIT: in: {b=D} out: {b=D}
mark(1 < 2)
r(1) -> <v0>
r(2) -> <v1>
mark(1 < 2)
call(<, compareTo|<v0>, <v1>) -> <v2>
jf(L2|<v2>)
3 mark({ use(b) })
mark(use(b)) USE: in: {b=READ} out: {b=READ}
3 mark({ use(b) }) USE: in: {b=READ} out: {b=READ}
r(b) -> <v3> USE: in: {} out: {b=READ}
mark(use(b))
call(use, use|<v3>) -> <v4>
2 jmp(L3) USE: in: {} out: {}
L2:
@@ -39,14 +39,14 @@ L3:
magic(x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
4 mark(val y = x + a use(a)) INIT: in: {x=ID} out: {x=ID}
v(val y = x + a) INIT: in: {x=ID} out: {x=ID, y=D}
mark(x + a) INIT: in: {x=ID, y=D} out: {x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ}
r(x) -> <v1> USE: in: {a=READ} out: {a=READ, x=READ}
v(val y = x + a) INIT: in: {x=ID} out: {x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ}
r(x) -> <v1> INIT: in: {x=ID, y=D} out: {x=ID, y=D} USE: in: {a=READ} out: {a=READ, x=READ}
r(a) -> <v2>
mark(x + a)
call(+, plus|<v1>, <v2>) -> <v3>
w(y|<v3>) INIT: in: {x=ID, y=D} out: {x=ID, y=ID}
mark(use(a)) INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {a=READ} out: {a=READ}
r(a) -> <v4> USE: in: {} out: {a=READ}
w(y|<v3>) INIT: in: {x=ID, y=D} out: {x=ID, y=ID} USE: in: {a=READ} out: {a=READ}
r(a) -> <v4> INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {} out: {a=READ}
mark(use(a))
call(use, use|<v4>) -> <v5>
L4:
3 <END> INIT: in: {x=ID} out: {x=ID}
@@ -11,14 +11,14 @@ L0:
2 mark({ var a = 1 use(a) a = 2 use(a) })
v(var a = 1) INIT: in: {} out: {a=D}
r(1) -> <v0> INIT: in: {a=D} out: {a=D}
w(a|<v0>) INIT: in: {a=D} out: {a=ID}
mark(use(a)) INIT: in: {a=ID} out: {a=ID} USE: in: {a=READ} out: {a=READ}
r(a) -> <v1> USE: in: {a=WRITTEN_AFTER_READ} out: {a=READ}
w(a|<v0>) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ}
r(a) -> <v1> INIT: in: {a=ID} out: {a=ID} USE: in: {a=WRITTEN_AFTER_READ} out: {a=READ}
mark(use(a))
call(use, use|<v1>) -> <v2>
r(2) -> <v3> USE: in: {a=WRITTEN_AFTER_READ} out: {a=WRITTEN_AFTER_READ}
w(a|<v3>) USE: in: {a=READ} out: {a=WRITTEN_AFTER_READ}
mark(use(a)) USE: in: {a=READ} out: {a=READ}
r(a) -> <v4> USE: in: {} out: {a=READ}
mark(use(a))
call(use, use|<v4>) -> <v5>
L1:
1 <END> INIT: in: {} out: {}
@@ -32,16 +32,16 @@ L3:
magic(x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
3 mark(sum(x - 1) + x) INIT: in: {x=ID} out: {x=ID}
mark(sum(x - 1) + x)
mark(sum(x - 1))
magic(sum) -> <v1> USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ}
r(sum|<v1>) -> <v2> USE: in: {x=READ} out: {sum=READ, x=READ}
mark(x - 1)
r(x) -> <v3>
r(1) -> <v4>
mark(x - 1)
call(-, minus|<v3>, <v4>) -> <v5>
mark(sum(x - 1))
call(sum, invoke|<v2>, <v5>) -> <v6> USE: in: {x=READ} out: {x=READ}
r(x) -> <v7> USE: in: {} out: {x=READ}
mark(sum(x - 1) + x)
call(+, plus|<v6>, <v7>) -> <v8>
L4:
2 <END>
@@ -127,10 +127,10 @@ class TestOther {
L0:
1 <START> INIT: in: {} out: {}
v(val x: Int = x + 1) INIT: in: {} out: {x=D}
mark(x + 1) INIT: in: {x=D} out: {x=D}
magic(x) -> <v0> USE: in: {x=READ} out: {x=READ}
magic(x) -> <v0> INIT: in: {x=D} out: {x=D} USE: in: {x=READ} out: {x=READ}
r(x|<v0>) -> <v1> USE: in: {} out: {x=READ}
r(1) -> <v2>
mark(x + 1)
call(+, plus|<v1>, <v2>) -> <v3>
w(x|<v3>) INIT: in: {x=D} out: {x=ID}
L1:
@@ -15,9 +15,9 @@ L0:
2 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) })
v(val b: Boolean) INIT: in: {} out: {b=D}
mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D} out: {b=D}
mark(1 < 2)
r(1) -> <v0>
r(2) -> <v1>
mark(1 < 2)
call(<, compareTo|<v0>, <v1>) -> <v2>
jf(L2|<v2>)
3 mark({ b = false })
@@ -29,10 +29,10 @@ L2:
r(true) -> <v4> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ}
w(b|<v4>) INIT: in: {b=D} out: {b=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ}
L3:
2 mark(use(b)) INIT: in: {b=ID} out: {b=ID}
error(use, No resolved call) USE: in: {b=READ} out: {b=READ}
2 error(use, No resolved call) INIT: in: {b=ID} out: {b=ID} USE: in: {b=READ} out: {b=READ}
r(b) -> <v5> USE: in: {} out: {b=READ}
error(use, No resolved call)
mark(use(b))
magic(use(b)|<v5>) -> <v6>
L1:
1 <END> INIT: in: {} out: {}
@@ -18,22 +18,22 @@ L0:
v(numbers: Collection<Int>) INIT: in: {} out: {numbers=D}
magic(numbers: Collection<Int>) -> <v0> INIT: in: {numbers=D} out: {numbers=D}
w(numbers|<v0>) INIT: in: {numbers=D} out: {numbers=ID}
2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID}
3 mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) USE: in: {numbers=READ} out: {numbers=READ}
r(numbers) -> <v1> USE: in: {} out: {numbers=READ}
2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} USE: in: {numbers=READ} out: {numbers=READ}
3 r(numbers) -> <v1> USE: in: {} out: {numbers=READ}
v(i) INIT: in: {numbers=ID} out: {i=D, numbers=ID}
L3:
jmp?(L2) INIT: in: {i=D, numbers=ID} out: {i=D, numbers=ID}
L4 [loop entry point]:
L5 [body entry point]:
magic(numbers|<v1>) -> <v2>
w(i|<v2>) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID} USE: in: {} out: {}
4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID}
w(i|<v2>) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID}
mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} USE: in: {} out: {}
4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue })
v(val b: Boolean) INIT: in: {i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID}
mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D, i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID}
mark(1 < 2)
r(1) -> <v3>
r(2) -> <v4>
mark(1 < 2)
call(<, compareTo|<v3>, <v4>) -> <v5>
jf(L6|<v5>)
5 mark({ b = false })
@@ -45,8 +45,8 @@ L6:
r(true) -> <v7> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ}
w(b|<v7>) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ}
L7:
4 mark(use(b)) INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=READ}
r(b) -> <v8> USE: in: {} out: {b=READ}
4 r(b) -> <v8> INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {} out: {b=READ}
mark(use(b))
call(use, use|<v8>) -> <v9>
jmp(L4 [loop entry point]) USE: in: {} out: {}
- 3 jmp?(L4 [loop entry point])
@@ -20,9 +20,9 @@ L4 [body entry point]:
r(2) -> <v1>
w(a|<v1>)
L5 [condition entry point]:
mark(a > 0)
r(a) -> <v2>
r(0) -> <v3>
mark(a > 0)
call(>, compareTo|<v2>, <v3>) -> <v4>
jt(L2 [loop entry point]|<v4>) USE: in: {a=READ} out: {a=READ}
L3 [loop exit point]:
@@ -12,10 +12,9 @@ L0:
2 mark({ "before" for (i in 1..10) { val a = i } "after" })
mark("before")
r("before") -> <v0> USE: in: {} out: {}
3 mark(for (i in 1..10) { val a = i })
mark(1..10)
r(1) -> <v1>
3 r(1) -> <v1>
r(10) -> <v2>
mark(1..10)
call(.., rangeTo|<v1>, <v2>) -> <v3>
v(i) INIT: in: {} out: {i=D}
L3:
@@ -24,7 +23,8 @@ L4 [loop entry point]:
L5 [body entry point]:
magic(1..10|<v3>) -> <v4>
w(i|<v4>) INIT: in: {i=D} out: {i=ID}
4 mark({ val a = i }) INIT: in: {i=ID} out: {i=ID}
mark(for (i in 1..10) { val a = i }) INIT: in: {i=ID} out: {i=ID}
4 mark({ val a = i })
v(val a = i) INIT: in: {i=ID} out: {a=D, i=ID}
r(i) -> <v5> INIT: in: {a=D, i=ID} out: {a=D, i=ID}
w(a|<v5>) INIT: in: {a=D, i=ID} out: {a=ID, i=ID}
@@ -43,10 +43,10 @@ L3:
magic(x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
4 mark(val a = x + b) INIT: in: {x=ID} out: {x=ID}
v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID}
mark(x + b) INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> USE: in: {b=READ} out: {b=READ, x=READ}
v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ} out: {b=READ, x=READ}
r(b) -> <v2> USE: in: {} out: {b=READ}
mark(x + b)
call(+, plus|<v1>, <v2>) -> <v3>
w(a|<v3>) INIT: in: {a=D, x=ID} out: {a=ID, x=ID}
L4:
@@ -39,10 +39,10 @@ L3:
magic(x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
4 mark({ val a = x + b }) INIT: in: {x=ID} out: {x=ID}
v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID}
mark(x + b) INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> USE: in: {b=READ} out: {b=READ, x=READ}
v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ} out: {b=READ, x=READ}
r(b) -> <v2> USE: in: {} out: {b=READ}
mark(x + b)
call(+, plus|<v1>, <v2>) -> <v3>
w(a|<v3>) INIT: in: {a=D, x=ID} out: {a=ID, x=ID}
L4:
@@ -33,10 +33,10 @@ L3:
3 <START> INIT: in: {} out: {}
v(x: Int) INIT: in: {} out: {x=D}
magic(x: Int) -> <v0> INIT: in: {x=D} out: {x=D}
w(x|<v0>) INIT: in: {x=D} out: {x=ID}
mark(x + b) INIT: in: {x=ID} out: {x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> USE: in: {b=READ} out: {b=READ, x=READ}
w(x|<v0>) INIT: in: {x=D} out: {x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ}
r(x) -> <v1> INIT: in: {x=ID} out: {x=ID} USE: in: {b=READ} out: {b=READ, x=READ}
r(b) -> <v2> USE: in: {} out: {b=READ}
mark(x + b)
call(+, plus|<v1>, <v2>) -> <v3>
L4:
<END>
@@ -12,10 +12,10 @@ L0:
2 mark({ "before" while (true) { val a: Int } "after" })
mark("before")
r("before") -> <v0>
mark(while (true) { val a: Int })
L2 [loop entry point]:
L5 [condition entry point]:
r(true) -> <v1>
mark(while (true) { val a: Int })
L4 [body entry point]:
3 mark({ val a: Int })
v(val a: Int) INIT: in: {} out: {a=D}
@@ -26,14 +26,16 @@ L0:
mark(a[10])
r(a) -> <v7>
r(10) -> <v8>
mark(a[10])
call(a[10], get|<v7>, <v8>) -> <v9>
r(100) -> <v10>
mark(a[10] += 1)
mark(a[10])
r(a) -> <v11>
r(10) -> <v12>
mark(a[10])
call(a[10], get|<v11>, <v12>) -> <v13>
r(1) -> <v14>
mark(a[10] += 1)
call(+=, plus|<v13>, <v14>) -> <v15>
r(a) -> <v16>
r(10) -> <v17>
@@ -9,12 +9,13 @@ L0:
magic(array: Array<(Int)->Unit>) -> <v0>
w(array|<v0>)
2 mark({ array[11](3) })
mark(array[11](3))
mark(array[11])
r(array) -> <v1>
r(11) -> <v2>
mark(array[11])
call(array[11], get|<v1>, <v2>) -> <v3>
r(3) -> <v4>
mark(array[11](3))
call(array[11], invoke|<v3>, <v4>) -> <v5>
L1:
1 <END> NEXT:[<SINK>]
@@ -37,10 +37,11 @@ L0:
2 mark({ ab.getArray()[1] })
mark(ab.getArray()[1])
mark(ab.getArray())
mark(getArray())
r(ab) -> <v1>
mark(getArray())
call(getArray, getArray|<v1>) -> <v2>
r(1) -> <v3>
mark(ab.getArray()[1])
call(ab.getArray()[1], get|<v2>, <v3>) -> <v4>
L1:
1 <END> NEXT:[<SINK>]
@@ -9,11 +9,12 @@ L0:
magic(a: Array<Int>) -> <v0>
w(a|<v0>)
2 mark({ a[0]++ })
mark(a[0]++)
mark(a[0])
r(a) -> <v1>
r(0) -> <v2>
mark(a[0])
call(a[0], get|<v1>, <v2>) -> <v3>
mark(a[0]++)
call(++, inc|<v3>) -> <v4>
r(a) -> <v5>
r(0) -> <v6>
@@ -9,12 +9,13 @@ L0:
magic(a: Array<Int>) -> <v0>
w(a|<v0>)
2 mark({ a[0] += 1 })
mark(a[0] += 1)
mark(a[0])
r(a) -> <v1>
r(0) -> <v2>
mark(a[0])
call(a[0], get|<v1>, <v2>) -> <v3>
r(1) -> <v4>
mark(a[0] += 1)
call(+=, plus|<v3>, <v4>) -> <v5>
r(a) -> <v6>
r(0) -> <v7>
@@ -26,34 +26,34 @@ L0:
r(1) -> <v1>
r(a) -> <v2>
mark(2.toLong())
mark(toLong())
r(2) -> <v3>
mark(toLong())
call(toLong, toLong|<v3>) -> <v4>
mark(foo(a, 3))
r(a) -> <v5>
r(3) -> <v6>
mark(foo(a, 3))
call(foo, foo|<v5>, <v6>) -> <v7>
mark(genfun<Any>())
call(genfun, genfun) -> <v8>
mark(flfun {1})
mark({1})
jmp?(L2) NEXT:[r({1}) -> <v9>, d({1})]
d({1}) NEXT:[<SINK>]
L2:
r({1}) -> <v9> PREV:[jmp?(L2)]
mark(flfun {1})
call(flfun, flfun|<v9>) -> <v10>
mark(3.equals(4))
mark(equals(4))
r(3) -> <v11>
r(4) -> <v12>
mark(equals(4))
call(equals, equals|<v11>, <v12>) -> <v13>
mark(3 equals 4)
r(3) -> <v14>
r(4) -> <v15>
mark(3 equals 4)
call(equals, equals|<v14>, <v15>) -> <v16>
mark(1 + 2)
r(1) -> <v17>
r(2) -> <v18>
mark(1 + 2)
call(+, plus|<v17>, <v18>) -> <v19>
r(a) -> <v20>
jf(L5|<v20>) NEXT:[magic(a && true|<v20>, <v21>) -> <v22>, r(true) -> <v21>]
@@ -13,8 +13,7 @@ L0:
magic(c: Collection<Int>) -> <v0>
w(c|<v0>)
2 mark({ for (e in c) { { break } } })
3 mark(for (e in c) { { break } })
r(c) -> <v1>
3 r(c) -> <v1>
v(e)
L3:
jmp?(L2) NEXT:[read (Unit), magic(c|<v1>) -> <v2>]
@@ -22,6 +21,7 @@ L4 [loop entry point]:
L5 [body entry point]:
magic(c|<v1>) -> <v2> PREV:[jmp?(L2), jmp?(L4 [loop entry point])]
w(e|<v2>)
mark(for (e in c) { { break } })
4 mark({ { break } })
mark({ break })
jmp?(L6) NEXT:[r({ break }) -> <v3>, d({ break })]
@@ -51,9 +51,9 @@ L0:
3 mark({ 1 if (2 > 3) { return } })
r(1) -> <v0>
mark(if (2 > 3) { return })
mark(2 > 3)
r(2) -> <v1>
r(3) -> <v2>
mark(2 > 3)
call(>, compareTo|<v1>, <v2>) -> <v3>
jf(L3|<v3>) NEXT:[read (Unit), mark({ return })]
4 mark({ return })
@@ -136,9 +136,9 @@ L4:
4 <START>
5 mark(if (2 > 3) { return@l })
mark(if (2 > 3) { return@l })
mark(2 > 3)
r(2) -> <v0>
r(3) -> <v1>
mark(2 > 3)
call(>, compareTo|<v0>, <v1>) -> <v2>
jf(L6|<v2>) NEXT:[read (Unit), mark({ return@l })]
6 mark({ return@l })
@@ -204,9 +204,9 @@ L3:
5 mark({ 1 if (2 > 3) { return@l } })
r(1) -> <v0>
mark(if (2 > 3) { return@l })
mark(2 > 3)
r(2) -> <v1>
r(3) -> <v2>
mark(2 > 3)
call(>, compareTo|<v1>, <v2>) -> <v3>
jf(L6|<v3>) NEXT:[read (Unit), mark({ return@l })]
6 mark({ return@l })
@@ -252,10 +252,10 @@ L0:
1 <START>
2 mark({ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } })
mark(@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } })
mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } })
L2 [loop entry point]:
L5 [condition entry point]:
r(true) -> <v0> PREV:[mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }), jmp(L2 [loop entry point])]
r(true) -> <v0> PREV:[mark(@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }), jmp(L2 [loop entry point])]
mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } })
L4 [body entry point]:
3 mark({ try { 1 if (2 > 3) { break @l } } finally { 2 } })
mark(try { 1 if (2 > 3) { break @l } } finally { 2 })
@@ -263,9 +263,9 @@ L4 [body entry point]:
4 mark({ 1 if (2 > 3) { break @l } })
r(1) -> <v1>
mark(if (2 > 3) { break @l })
mark(2 > 3)
r(2) -> <v2>
r(3) -> <v3>
mark(2 > 3)
call(>, compareTo|<v2>, <v3>) -> <v4>
jf(L7|<v4>) NEXT:[read (Unit), mark({ break @l })]
5 mark({ break @l })
@@ -318,17 +318,17 @@ L0:
jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 })]
3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 })
mark(@l while(true) { 1 if (2 > 3) { break @l } })
mark(while(true) { 1 if (2 > 3) { break @l } })
L3 [loop entry point]:
L6 [condition entry point]:
r(true) -> <v0> PREV:[mark(while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])]
r(true) -> <v0> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])]
mark(while(true) { 1 if (2 > 3) { break @l } })
L5 [body entry point]:
4 mark({ 1 if (2 > 3) { break @l } })
r(1) -> <v1>
mark(if (2 > 3) { break @l })
mark(2 > 3)
r(2) -> <v2>
r(3) -> <v3>
mark(2 > 3)
call(>, compareTo|<v2>, <v3>) -> <v4>
jf(L7|<v4>) NEXT:[read (Unit), mark({ break @l })]
5 mark({ break @l })
@@ -379,17 +379,17 @@ L0:
jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } })]
3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } })
mark(@l while(true) { 1 if (2 > 3) { break @l } })
mark(while(true) { 1 if (2 > 3) { break @l } })
L3 [loop entry point]:
L6 [condition entry point]:
r(true) -> <v0> PREV:[mark(while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])]
r(true) -> <v0> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])]
mark(while(true) { 1 if (2 > 3) { break @l } })
L5 [body entry point]:
4 mark({ 1 if (2 > 3) { break @l } })
r(1) -> <v1>
mark(if (2 > 3) { break @l })
mark(2 > 3)
r(2) -> <v2>
r(3) -> <v3>
mark(2 > 3)
call(>, compareTo|<v2>, <v3>) -> <v4>
jf(L7|<v4>) NEXT:[read (Unit), mark({ break @l })]
5 mark({ break @l })
@@ -439,10 +439,9 @@ L0:
w(a|<v0>)
2 mark({ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } })
mark(@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } })
3 mark(for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } })
mark(1..a)
r(1) -> <v1>
3 r(1) -> <v1>
r(a) -> <v2>
mark(1..a)
call(.., rangeTo|<v1>, <v2>) -> <v3>
v(i)
L3:
@@ -451,15 +450,16 @@ L4 [loop entry point]:
L5 [body entry point]:
magic(1..a|<v3>) -> <v4> PREV:[jmp?(L2), jmp(L4 [loop entry point]), jmp?(L4 [loop entry point])]
w(i|<v4>)
mark(for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } })
4 mark({ try { 1 if (2 > 3) { continue @l } } finally { 2 } })
mark(try { 1 if (2 > 3) { continue @l } } finally { 2 })
jmp?(L6 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { continue @l } })]
5 mark({ 1 if (2 > 3) { continue @l } })
r(1) -> <v5>
mark(if (2 > 3) { continue @l })
mark(2 > 3)
r(2) -> <v6>
r(3) -> <v7>
mark(2 > 3)
call(>, compareTo|<v6>, <v7>) -> <v8>
jf(L7|<v8>) NEXT:[read (Unit), mark({ continue @l })]
6 mark({ continue @l })
@@ -515,10 +515,9 @@ L0:
jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 })]
3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 })
mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } })
4 mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } })
mark(1..a)
r(1) -> <v1>
4 r(1) -> <v1>
r(a) -> <v2>
mark(1..a)
call(.., rangeTo|<v1>, <v2>) -> <v3>
v(i)
L4:
@@ -527,12 +526,13 @@ L5 [loop entry point]:
L6 [body entry point]:
magic(1..a|<v3>) -> <v4> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])]
w(i|<v4>)
mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } })
5 mark({ 1 if (2 > 3) { continue @l } })
r(1) -> <v5>
mark(if (2 > 3) { continue @l })
mark(2 > 3)
r(2) -> <v6>
r(3) -> <v7>
mark(2 > 3)
call(>, compareTo|<v6>, <v7>) -> <v8>
jf(L7|<v8>) NEXT:[read (Unit), mark({ continue @l })]
6 mark({ continue @l })
@@ -586,10 +586,9 @@ L0:
jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } })]
3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } })
mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } })
4 mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } })
mark(1..a)
r(1) -> <v1>
4 r(1) -> <v1>
r(a) -> <v2>
mark(1..a)
call(.., rangeTo|<v1>, <v2>) -> <v3>
v(i)
L4:
@@ -598,12 +597,13 @@ L5 [loop entry point]:
L6 [body entry point]:
magic(1..a|<v3>) -> <v4> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])]
w(i|<v4>)
mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } })
5 mark({ 1 if (2 > 3) { continue @l } })
r(1) -> <v5>
mark(if (2 > 3) { continue @l })
mark(2 > 3)
r(2) -> <v6>
r(3) -> <v7>
mark(2 > 3)
call(>, compareTo|<v6>, <v7>) -> <v8>
jf(L7|<v8>) NEXT:[read (Unit), mark({ continue @l })]
6 mark({ continue @l })
@@ -691,22 +691,22 @@ L0:
r(1) -> <v0>
L3 [start finally]:
4 mark({ doSmth(3) })
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
L4 [finish finally]:
3 ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
L2 [onExceptionToFinallyBlock]:
4 mark({ doSmth(3) }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
2 jmp(error) NEXT:[<ERROR>]
L5 [skipFinallyToErrorBlock]:
- 4 mark({ doSmth(3) }) PREV:[]
- mark(doSmth(3)) PREV:[]
- r(3) -> <v1> PREV:[]
- mark(doSmth(3)) PREV:[]
- call(doSmth, doSmth|<v1>) -> <v2> PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1]
@@ -738,8 +738,8 @@ L0:
r(1) -> <v0>
L4 [start finally]:
4 mark({ doSmth(3) })
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
L5 [finish finally]:
3 ret(*|<v0>) L1 NEXT:[<END>]
@@ -749,22 +749,22 @@ L2 [onException]:
magic(e: UnsupportedOperationException) -> <v3>
w(e|<v3>)
4 mark({ doSmth(2) })
mark(doSmth(2))
r(2) -> <v4>
mark(doSmth(2))
call(doSmth, doSmth|<v4>) -> <v5>
3 jmp(L6 [afterCatches])
L6 [afterCatches]:
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })]
L3 [onExceptionToFinallyBlock]:
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, call(doSmth, doSmth|<v1>) -> <v2>]
@@ -797,8 +797,8 @@ L2 [onException]:
magic(e: UnsupportedOperationException) -> <v1>
w(e|<v1>)
4 mark({ doSmth(2) })
mark(doSmth(2))
r(2) -> <v2>
mark(doSmth(2))
call(doSmth, doSmth|<v2>) -> <v3>
3 jmp(L3 [afterCatches])
L1:
@@ -832,8 +832,8 @@ L0:
r(1) -> <v0>
L4 [start finally]:
4 mark({ doSmth(3) })
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
L5 [finish finally]:
3 ret(*|<v0>) L1 NEXT:[<END>]
@@ -845,8 +845,8 @@ L2 [onException]:
4 mark({ return 2 })
r(2) -> <v4>
mark({ doSmth(3) })
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
ret(*|<v4>) L1 NEXT:[<END>]
- 3 jmp(L6 [afterCatches]) PREV:[]
@@ -854,14 +854,14 @@ L6 [afterCatches]:
- 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
L3 [onExceptionToFinallyBlock]:
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
mark(doSmth(3))
r(3) -> <v1>
mark(doSmth(3))
call(doSmth, doSmth|<v1>) -> <v2>
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
- 4 mark({ doSmth(3) }) PREV:[]
- mark(doSmth(3)) PREV:[]
- r(3) -> <v1> PREV:[]
- mark(doSmth(3)) PREV:[]
- call(doSmth, doSmth|<v1>) -> <v2> PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v4>) L1]
@@ -890,8 +890,8 @@ L0:
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })]
3 mark({ doSmth(1) })
mark(doSmth(1))
r(1) -> <v0>
mark(doSmth(1))
call(doSmth, doSmth|<v0>) -> <v1>
2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])]
L2 [onException]:
@@ -902,8 +902,8 @@ L2 [onException]:
r(2) -> <v3>
L5 [start finally]:
5 mark({ doSmth(3) })
mark(doSmth(3))
r(3) -> <v4>
mark(doSmth(3))
call(doSmth, doSmth|<v4>) -> <v5>
L6 [finish finally]:
4 ret(*|<v3>) L1 NEXT:[<END>]
@@ -912,14 +912,14 @@ L4 [afterCatches]:
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])]
L3 [onExceptionToFinallyBlock]:
5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
mark(doSmth(3))
r(3) -> <v4>
mark(doSmth(3))
call(doSmth, doSmth|<v4>) -> <v5>
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
mark(doSmth(3))
r(3) -> <v4>
mark(doSmth(3))
call(doSmth, doSmth|<v4>) -> <v5>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, call(doSmth, doSmth|<v4>) -> <v5>]
@@ -140,11 +140,11 @@ fun testCopy2() {
L0:
1 <START>
2 mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } })
mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
L2 [loop entry point]:
L5 [condition entry point]:
mark(cond()) PREV:[mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
call(cond, cond) -> <v0>
mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
jf(L3 [loop exit point]|<v0>) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })]
L4 [body entry point]:
3 mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
@@ -256,11 +256,11 @@ L4 [afterCatches]:
L3 [onExceptionToFinallyBlock]:
L7 [start finally]:
3 mark({ while (cond()); }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
mark(while (cond()))
L8 [loop entry point]:
L11 [condition entry point]:
mark(cond()) PREV:[mark(while (cond())), jmp(L8 [loop entry point])]
mark(cond()) PREV:[mark({ while (cond()); }), jmp(L8 [loop entry point])]
call(cond, cond) -> <v5>
mark(while (cond()))
jf(L9 [loop exit point]|<v5>) NEXT:[read (Unit), jmp(L8 [loop entry point])]
L10 [body entry point]:
jmp(L8 [loop entry point]) NEXT:[mark(cond())]
@@ -270,9 +270,9 @@ L12 [finish finally]:
2 jmp(error) NEXT:[<ERROR>]
L6 [skipFinallyToErrorBlock]:
3 mark({ while (cond()); }) PREV:[jmp(L6 [skipFinallyToErrorBlock])]
mark(while (cond()))
mark(cond()) PREV:[mark(while (cond())), jmp(copy L8 [loop entry point])]
mark(cond()) PREV:[mark({ while (cond()); }), jmp(copy L8 [loop entry point])]
call(cond, cond) -> <v5>
mark(while (cond()))
jf(copy L9 [loop exit point]|<v5>) NEXT:[read (Unit), jmp(copy L8 [loop entry point])]
jmp(copy L8 [loop entry point]) NEXT:[mark(cond())]
read (Unit) PREV:[jf(copy L9 [loop exit point]|<v5>)]
@@ -311,9 +311,9 @@ L2 [onExceptionToFinallyBlock]:
L4 [start finally]:
3 mark({ if(list != null) { } }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
mark(if(list != null) { })
mark(list != null)
r(list) -> <v2>
r(null) -> <v3>
mark(list != null)
call(!=, equals|<v2>, <v3>) -> <v4>
jf(L5|<v4>) NEXT:[read (Unit), mark({ })]
4 mark({ })
@@ -327,9 +327,9 @@ L7 [finish finally]:
L3 [skipFinallyToErrorBlock]:
3 mark({ if(list != null) { } }) PREV:[jmp(L3 [skipFinallyToErrorBlock])]
mark(if(list != null) { })
mark(list != null)
r(list) -> <v2>
r(null) -> <v3>
mark(list != null)
call(!=, equals|<v2>, <v3>) -> <v4>
jf(copy L5|<v4>) NEXT:[read (Unit), mark({ })]
4 mark({ })
@@ -8,10 +8,9 @@ fun t1() {
L0:
1 <START>
2 mark({ for (i in 1..2) { doSmth(i) } })
3 mark(for (i in 1..2) { doSmth(i) })
mark(1..2)
r(1) -> <v0>
3 r(1) -> <v0>
r(2) -> <v1>
mark(1..2)
call(.., rangeTo|<v0>, <v1>) -> <v2>
v(i)
L3:
@@ -20,9 +19,10 @@ L4 [loop entry point]:
L5 [body entry point]:
magic(1..2|<v2>) -> <v3> PREV:[jmp?(L2), jmp?(L4 [loop entry point])]
w(i|<v3>)
mark(for (i in 1..2) { doSmth(i) })
4 mark({ doSmth(i) })
mark(doSmth(i))
r(i) -> <v4>
mark(doSmth(i))
call(doSmth, doSmth|<v4>) -> <v5>
3 jmp?(L4 [loop entry point]) NEXT:[magic(1..2|<v2>) -> <v3>, read (Unit)]
L2:
@@ -30,12 +30,12 @@ L0:
mark("s")
r("s") -> <v2>
w(u|<v2>)
2 jmp(L3) NEXT:[mark(doSmth(u))]
2 jmp(L3) NEXT:[r(u) -> <v3>]
L2:
read (Unit) PREV:[jf(L2|<v1>)]
L3:
mark(doSmth(u)) PREV:[jmp(L3), read (Unit)]
r(u) -> <v3>
r(u) -> <v3> PREV:[jmp(L3), read (Unit)]
mark(doSmth(u))
call(doSmth, doSmth|<v3>) -> <v4>
v(var r: String)
mark(if (b) { r = "s" } else { r = "t" })
@@ -45,15 +45,15 @@ L3:
mark("s")
r("s") -> <v6>
w(r|<v6>)
2 jmp(L5) NEXT:[mark(doSmth(r))]
2 jmp(L5) NEXT:[r(r) -> <v8>]
L4:
3 mark({ r = "t" }) PREV:[jf(L4|<v5>)]
mark("t")
r("t") -> <v7>
w(r|<v7>)
L5:
2 mark(doSmth(r)) PREV:[jmp(L5), w(r|<v7>)]
r(r) -> <v8>
2 r(r) -> <v8> PREV:[jmp(L5), w(r|<v7>)]
mark(doSmth(r))
call(doSmth, doSmth|<v8>) -> <v9>
L1:
1 <END> NEXT:[<SINK>]
@@ -88,12 +88,12 @@ L0:
jf(L2|<v2>) NEXT:[read (Unit), mark({ return; })]
3 mark({ return; })
ret L1 NEXT:[<END>]
- 2 jmp(L3) NEXT:[mark(doSmth(i))] PREV:[]
- 2 jmp(L3) NEXT:[r(i) -> <v3>] PREV:[]
L2:
read (Unit) PREV:[jf(L2|<v2>)]
L3:
mark(doSmth(i))
r(i) -> <v3>
mark(doSmth(i))
call(doSmth, doSmth|<v3>) -> <v4>
mark(if (i is Int) { return; })
mark(i is Int)
@@ -8,18 +8,18 @@ fun main() {
L0:
1 <START>
2 mark({ while(0 > 1) { 2 } })
mark(while(0 > 1) { 2 })
L2 [loop entry point]:
L5 [condition entry point]:
mark(0 > 1) PREV:[mark(while(0 > 1) { 2 }), jmp(L2 [loop entry point])]
r(0) -> <v0>
r(0) -> <v0> PREV:[mark({ while(0 > 1) { 2 } }), jmp(L2 [loop entry point])]
r(1) -> <v1>
mark(0 > 1)
call(>, compareTo|<v0>, <v1>) -> <v2>
mark(while(0 > 1) { 2 })
jf(L3 [loop exit point]|<v2>) NEXT:[read (Unit), mark({ 2 })]
L4 [body entry point]:
3 mark({ 2 })
r(2) -> <v3>
2 jmp(L2 [loop entry point]) NEXT:[mark(0 > 1)]
2 jmp(L2 [loop entry point]) NEXT:[r(0) -> <v0>]
L3 [loop exit point]:
read (Unit) PREV:[jf(L3 [loop exit point]|<v2>)]
L1:
@@ -44,9 +44,9 @@ L4 [body entry point]:
mark({return})
ret L1 NEXT:[<END>]
L5 [condition entry point]:
- mark(0 > 1) PREV:[]
- r(0) -> <v0> PREV:[]
- r(1) -> <v1> PREV:[]
- mark(0 > 1) PREV:[]
- call(>, compareTo|<v0>, <v1>) -> <v2> PREV:[]
- jt(L2 [loop entry point]|<v2>) NEXT:[read (Unit), mark({return})] PREV:[]
L3 [loop exit point]:
@@ -14,9 +14,9 @@ L0:
w(b|<v1>)
2 mark({ if (a == b) { } })
mark(if (a == b) { })
mark(a == b)
r(a) -> <v2>
r(b) -> <v3>
mark(a == b)
call(==, equals|<v2>, <v3>) -> <v4>
jf(L2|<v4>) NEXT:[read (Unit), mark({ })]
3 mark({ })
@@ -10,8 +10,8 @@ L0:
v(var i = 1)
r(1) -> <v0>
w(i|<v0>)
mark(i++)
r(i) -> <v1>
mark(i++)
call(++, inc|<v1>) -> <v2>
w(i|<v2>)
L1:
@@ -9,8 +9,8 @@ L0:
magic(f: () -> Unit) -> <v0>
w(f|<v0>)
2 mark({ f() })
mark(f())
r(f) -> <v1>
mark(f())
call(f, invoke|<v1>) -> <v2>
L1:
1 <END> NEXT:[<SINK>]
@@ -13,9 +13,9 @@ L0:
w(b|<v1>)
2 mark({ if (a != b) {} })
mark(if (a != b) {})
mark(a != b)
r(a) -> <v2>
r(b) -> <v3>
mark(a != b)
call(!=, equals|<v2>, <v3>) -> <v4>
jf(L2|<v4>) NEXT:[read (Unit), mark({})]
3 mark({})
@@ -7,6 +7,7 @@ L0:
1 <START>
2 mark({ return ?: null })
ret L1 NEXT:[<END>]
- mark(return ?: null) PREV:[]
- jt(L2) NEXT:[r(null) -> <v0>, <END>] PREV:[]
- r(null) -> <v0> PREV:[]
L1:
@@ -70,8 +70,8 @@ L0:
r(object : A by b {}) -> <v2>
w(o|<v2>)
mark(o.foo())
mark(foo())
r(o) -> <v3>
mark(foo())
call(foo, foo|<v3>) -> <v4>
ret(*|<v4>) L1
L1:
@@ -19,12 +19,12 @@ fun foo() = "foo" + this.$bar
---------------------
L0:
1 <START>
mark("foo" + this.$bar)
mark("foo")
r("foo") -> <v0>
mark(this.$bar)
r(this) -> <v1>
r($bar|<v1>) -> <v2>
mark("foo" + this.$bar)
call(+, plus|<v0>, <v2>) -> <v3>
L1:
<END> NEXT:[<SINK>]
@@ -37,9 +37,9 @@ L0:
w(x|<v0>)
r(2) -> <v1>
w(x|<v1>)
mark(x += 2)
r(x) -> <v2>
r(2) -> <v3>
mark(x += 2)
call(+=, plus|<v2>, <v3>) -> <v4>
w(x|<v4>)
mark(if (true) 1 else 2)
@@ -73,11 +73,11 @@ L5:
r(t) -> <v16>
r(1) -> <v17>
w(t.x|<v16>, <v17>)
mark(t.x += 1)
mark(t.x)
r(t) -> <v18>
r(x|<v18>) -> <v19>
r(1) -> <v20>
mark(t.x += 1)
call(+=, plus|<v19>, <v20>) -> <v21>
r(t) -> <v22>
w(t.x|<v22>, <v21>)
@@ -65,158 +65,158 @@ L0:
r(1.0) -> <v0>
w(inTopLevel|<v0>)
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll())
mark(registerAll())
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode))
mark(add(OBJECT_KEYWORD, unresolvedCode))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel))
mark(add(OUT_KEYWORD, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel))
mark(add(IN_KEYWORD, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel))
mark(add(OVERRIDE_KEYWORD, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel))
mark(add(PACKAGE_KEYWORD, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel))
mark(add(IMPORT_KEYWORD, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
mark(BunchKeywordRegister())
magic(BunchKeywordRegister()) -> <v1>
mark(BunchKeywordRegister())
call(BunchKeywordRegister, <init>|<v1>) -> <v2>
r(ABSTRACT_KEYWORD) -> <v3>
r(inTopLevel) -> <v4>
r(inTopLevel) -> <v5>
r(inTopLevel) -> <v6>
mark(add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v2>, <v3>, <v4>, <v5>, <v6>) -> <v7>
r(FINAL_KEYWORD) -> <v8>
r(inTopLevel) -> <v9>
r(inTopLevel) -> <v10>
r(inTopLevel) -> <v11>
mark(add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v7>, <v8>, <v9>, <v10>, <v11>) -> <v12>
r(OPEN_KEYWORD) -> <v13>
r(inTopLevel) -> <v14>
r(inTopLevel) -> <v15>
r(inTopLevel) -> <v16>
mark(add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v12>, <v13>, <v14>, <v15>, <v16>) -> <v17>
r(INTERNAL_KEYWORD) -> <v18>
r(inTopLevel) -> <v19>
r(inTopLevel) -> <v20>
r(inTopLevel) -> <v21>
r(inTopLevel) -> <v22>
mark(add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v17>, <v18>, <v19>, <v20>, <v21>, <v22>) -> <v23>
r(PRIVATE_KEYWORD) -> <v24>
r(inTopLevel) -> <v25>
r(inTopLevel) -> <v26>
r(inTopLevel) -> <v27>
r(inTopLevel) -> <v28>
mark(add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v23>, <v24>, <v25>, <v26>, <v27>, <v28>) -> <v29>
r(PROTECTED_KEYWORD) -> <v30>
r(inTopLevel) -> <v31>
r(inTopLevel) -> <v32>
r(inTopLevel) -> <v33>
r(inTopLevel) -> <v34>
mark(add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v29>, <v30>, <v31>, <v32>, <v33>, <v34>) -> <v35>
r(PUBLIC_KEYWORD) -> <v36>
r(inTopLevel) -> <v37>
r(inTopLevel) -> <v38>
r(inTopLevel) -> <v39>
r(inTopLevel) -> <v40>
mark(add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v35>, <v36>, <v37>, <v38>, <v39>, <v40>) -> <v41>
r(CLASS_KEYWORD) -> <v42>
r(inTopLevel) -> <v43>
r(inTopLevel) -> <v44>
r(inTopLevel) -> <v45>
mark(add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v41>, <v42>, <v43>, <v44>, <v45>) -> <v46>
r(ENUM_KEYWORD) -> <v47>
r(inTopLevel) -> <v48>
r(inTopLevel) -> <v49>
r(inTopLevel) -> <v50>
mark(add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v46>, <v47>, <v48>, <v49>, <v50>) -> <v51>
r(FUN_KEYWORD) -> <v52>
r(inTopLevel) -> <v53>
r(inTopLevel) -> <v54>
r(inTopLevel) -> <v55>
mark(add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v51>, <v52>, <v53>, <v54>, <v55>) -> <v56>
r(GET_KEYWORD) -> <v57>
r(inTopLevel) -> <v58>
r(inTopLevel) -> <v59>
r(inTopLevel) -> <v60>
mark(add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v56>, <v57>, <v58>, <v59>, <v60>) -> <v61>
r(SET_KEYWORD) -> <v62>
r(inTopLevel) -> <v63>
r(inTopLevel) -> <v64>
r(inTopLevel) -> <v65>
mark(add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v61>, <v62>, <v63>, <v64>, <v65>) -> <v66>
r(TRAIT_KEYWORD) -> <v67>
r(inTopLevel) -> <v68>
r(inTopLevel) -> <v69>
r(inTopLevel) -> <v70>
mark(add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v66>, <v67>, <v68>, <v69>, <v70>) -> <v71>
r(VAL_KEYWORD) -> <v72>
r(inTopLevel) -> <v73>
r(inTopLevel) -> <v74>
r(inTopLevel) -> <v75>
mark(add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v71>, <v72>, <v73>, <v74>, <v75>) -> <v76>
r(VAR_KEYWORD) -> <v77>
r(inTopLevel) -> <v78>
r(inTopLevel) -> <v79>
r(inTopLevel) -> <v80>
mark(add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v76>, <v77>, <v78>, <v79>, <v80>) -> <v81>
r(TYPE_KEYWORD) -> <v82>
r(inTopLevel) -> <v83>
r(inTopLevel) -> <v84>
r(inTopLevel) -> <v85>
mark(add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
call(add, add|<v81>, <v82>, <v83>, <v84>, <v85>) -> <v86>
r(IMPORT_KEYWORD) -> <v87>
r(inTopLevel) -> <v88>
mark(add(IMPORT_KEYWORD, inTopLevel))
call(add, add|<v86>, <v87>, <v88>) -> <v89>
r(PACKAGE_KEYWORD) -> <v90>
r(inTopLevel) -> <v91>
mark(add(PACKAGE_KEYWORD, inTopLevel))
call(add, add|<v89>, <v90>, <v91>) -> <v92>
r(OVERRIDE_KEYWORD) -> <v93>
r(inTopLevel) -> <v94>
mark(add(OVERRIDE_KEYWORD, inTopLevel))
call(add, add|<v92>, <v93>, <v94>) -> <v95>
r(IN_KEYWORD) -> <v96>
r(inTopLevel) -> <v97>
r(inTopLevel) -> <v98>
mark(add(IN_KEYWORD, inTopLevel, inTopLevel))
call(add, add|<v95>, <v96>, <v97>, <v98>) -> <v99>
r(OUT_KEYWORD) -> <v100>
r(inTopLevel) -> <v101>
mark(add(OUT_KEYWORD, inTopLevel))
call(add, add|<v99>, <v100>, <v101>) -> <v102>
r(OBJECT_KEYWORD) -> <v103>
error(unresolvedCode, No resolved call)
magic(unresolvedCode) -> <v104>
mark(add(OBJECT_KEYWORD, unresolvedCode))
call(add, add|<v102>, <v103>, <v104>) -> <v105>
mark(registerAll())
call(registerAll, registerAll|<v105>) -> <v106>
L1:
1 <END> NEXT:[<SINK>]
@@ -9,9 +9,9 @@ L0:
magic(f: () -> Unit) -> <v0>
w(f|<v0>)
2 mark({ (f)() })
mark((f)())
mark((f))
r(f) -> <v1>
mark((f)())
call((f), invoke|<v1>) -> <v2>
L1:
1 <END> NEXT:[<SINK>]
@@ -38,16 +38,16 @@ L0:
1 <START>
2 mark({ null!!.doSomething() bar().doSomething })
mark(null!!.doSomething())
mark(doSomething())
mark(null!!)
r(null) -> <v0>
magic(null!!|<v0>) -> <v1>
jmp(error) NEXT:[<ERROR>]
- mark(doSomething()) PREV:[]
- call(doSomething, doSomething|<v1>) -> <v2> PREV:[]
- mark(bar().doSomething) PREV:[]
- mark(bar()) PREV:[]
- call(bar, bar) PREV:[]
- jmp(error) NEXT:[<ERROR>] PREV:[]
- mark(doSomething) PREV:[]
- call(doSomething, doSomething) -> <v3> PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[]
@@ -10,10 +10,10 @@ L0:
w(a|<v0>)
2 mark({ a.foo() })
mark(a.foo())
mark(foo())
error(foo, No resolved call)
error(foo, No resolved call)
r(a) -> <v1>
mark(foo())
magic(foo()|<v1>) -> <v2>
L1:
1 <END> NEXT:[<SINK>]
@@ -14,29 +14,29 @@ L0:
w(sum|<v1>)
2 mark({ if (x == 0.toLong()) return sum return sum(x - 1, sum + x) })
mark(if (x == 0.toLong()) return sum)
mark(x == 0.toLong())
r(x) -> <v2>
mark(0.toLong())
mark(toLong())
r(0) -> <v3>
mark(toLong())
call(toLong, toLong|<v3>) -> <v4>
mark(x == 0.toLong())
call(==, equals|<v2>, <v4>) -> <v5>
jf(L2|<v5>) NEXT:[read (Unit), r(sum) -> <v6>]
r(sum) -> <v6>
ret(*|<v6>) L1 NEXT:[<END>]
- jmp(L3) NEXT:[mark(sum(x - 1, sum + x))] PREV:[]
- jmp(L3) NEXT:[r(x) -> <v7>] PREV:[]
L2:
read (Unit) PREV:[jf(L2|<v5>)]
L3:
mark(sum(x - 1, sum + x))
mark(x - 1)
r(x) -> <v7>
r(1) -> <v8>
mark(x - 1)
call(-, minus|<v7>, <v8>) -> <v9>
mark(sum + x)
r(sum) -> <v10>
r(x) -> <v11>
mark(sum + x)
call(+, plus|<v10>, <v11>) -> <v12>
mark(sum(x - 1, sum + x))
call(sum, sum|<v9>, <v12>) -> <v13>
ret(*|<v13>) L1
L1: