Added 'sink' instruction to pseudocode
This commit is contained in:
@@ -20,4 +20,6 @@ public interface Instruction {
|
||||
Collection<Instruction> getNextInstructions();
|
||||
|
||||
void accept(InstructionVisitor visitor);
|
||||
|
||||
boolean isDead();
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ public class InstructionVisitor {
|
||||
visitInstructionWithNext(instruction);
|
||||
}
|
||||
|
||||
public void visitFunctionLiteralValue(LocalDeclarationInstruction instruction) {
|
||||
visitReadValue(instruction);
|
||||
public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) {
|
||||
visitInstructionWithNext(instruction);
|
||||
}
|
||||
|
||||
public void visitUnconditionalJump(UnconditionalJumpInstruction instruction) {
|
||||
@@ -40,6 +40,10 @@ public class InstructionVisitor {
|
||||
visitInstruction(instruction);
|
||||
}
|
||||
|
||||
public void visitSubroutineSink(SubroutineSinkInstruction instruction) {
|
||||
visitInstruction(instruction);
|
||||
}
|
||||
|
||||
public void visitJump(AbstractJumpInstruction instruction) {
|
||||
visitInstruction(instruction);
|
||||
}
|
||||
|
||||
+4
@@ -70,11 +70,13 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
|
||||
|
||||
private final Pseudocode pseudocode;
|
||||
private final Label error;
|
||||
private final Label sink;
|
||||
private final JetElement currentSubroutine;
|
||||
|
||||
private JetControlFlowInstructionsGeneratorWorker(@NotNull JetElement scopingElement, @NotNull JetElement currentSubroutine) {
|
||||
this.pseudocode = new Pseudocode(scopingElement);
|
||||
this.error = pseudocode.createLabel("error");
|
||||
this.sink = pseudocode.createLabel("sink");
|
||||
this.currentSubroutine = currentSubroutine;
|
||||
}
|
||||
|
||||
@@ -183,6 +185,8 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
|
||||
pseudocode.addExitInstruction(new SubroutineExitInstruction(subroutine, "<END>"));
|
||||
bindLabel(error);
|
||||
add(new SubroutineExitInstruction(subroutine, "<ERROR>"));
|
||||
bindLabel(sink);
|
||||
pseudocode.addSinkInstruction(new SubroutineSinkInstruction(subroutine, "<SINK>"));
|
||||
elementToBlockInfo.remove(subroutine);
|
||||
allBlocks.pop();
|
||||
}
|
||||
|
||||
+20
-3
@@ -1,17 +1,22 @@
|
||||
package org.jetbrains.jet.lang.cfg.pseudocode;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.psi.JetClass;
|
||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||
import org.jetbrains.jet.lang.psi.JetFunction;
|
||||
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author abreslav
|
||||
*/
|
||||
public class LocalDeclarationInstruction extends ReadValueInstruction {
|
||||
public class LocalDeclarationInstruction extends InstructionWithNext {
|
||||
|
||||
private Pseudocode body;
|
||||
private final Pseudocode body;
|
||||
private Instruction sink;
|
||||
|
||||
public LocalDeclarationInstruction(@NotNull JetDeclaration element, Pseudocode body) {
|
||||
super(element);
|
||||
@@ -22,9 +27,21 @@ public class LocalDeclarationInstruction extends ReadValueInstruction {
|
||||
return body;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<Instruction> getNextInstructions() {
|
||||
ArrayList<Instruction> instructions = Lists.newArrayList(sink);
|
||||
instructions.addAll(super.getNextInstructions());
|
||||
return instructions;
|
||||
}
|
||||
|
||||
public void setSink(SubroutineSinkInstruction sink) {
|
||||
this.sink = outgoingEdgeTo(sink);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(InstructionVisitor visitor) {
|
||||
visitor.visitFunctionLiteralValue(this);
|
||||
visitor.visitLocalDeclarationInstruction(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -59,6 +59,7 @@ public class Pseudocode {
|
||||
|
||||
private final JetElement correspondingElement;
|
||||
private SubroutineExitInstruction exitInstruction;
|
||||
private SubroutineSinkInstruction sinkInstruction;
|
||||
private boolean postPrecessed = false;
|
||||
|
||||
public Pseudocode(JetElement correspondingElement) {
|
||||
@@ -84,7 +85,7 @@ public class Pseudocode {
|
||||
public List<Instruction> getDeadInstructions() {
|
||||
List<Instruction> deadInstructions = Lists.newArrayList();
|
||||
for (Instruction instruction : instructions) {
|
||||
if (((InstructionImpl)instruction).isDead()) {
|
||||
if (instruction.isDead()) {
|
||||
deadInstructions.add(instruction);
|
||||
}
|
||||
}
|
||||
@@ -101,6 +102,12 @@ public class Pseudocode {
|
||||
assert this.exitInstruction == null;
|
||||
this.exitInstruction = exitInstruction;
|
||||
}
|
||||
|
||||
public void addSinkInstruction(SubroutineSinkInstruction sinkInstruction) {
|
||||
addInstruction(sinkInstruction);
|
||||
assert this.sinkInstruction == null;
|
||||
this.sinkInstruction = sinkInstruction;
|
||||
}
|
||||
|
||||
public void addInstruction(Instruction instruction) {
|
||||
instructions.add(instruction);
|
||||
@@ -112,6 +119,12 @@ public class Pseudocode {
|
||||
return exitInstruction;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public SubroutineSinkInstruction getSinkInstruction() {
|
||||
return sinkInstruction;
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
public SubroutineEnterInstruction getEnterInstruction() {
|
||||
return (SubroutineEnterInstruction) instructions.get(0);
|
||||
@@ -163,9 +176,10 @@ public class Pseudocode {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitFunctionLiteralValue(LocalDeclarationInstruction instruction) {
|
||||
public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) {
|
||||
instruction.getBody().postProcess();
|
||||
super.visitFunctionLiteralValue(instruction);
|
||||
instruction.setSink(getSinkInstruction());
|
||||
super.visitLocalDeclarationInstruction(instruction);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -173,12 +187,18 @@ public class Pseudocode {
|
||||
// Nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSubroutineSink(SubroutineSinkInstruction instruction) {
|
||||
// Nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitInstruction(Instruction instruction) {
|
||||
throw new UnsupportedOperationException(instruction.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
getExitInstruction().setSink(getSinkInstruction());
|
||||
removeDeadInstructions();
|
||||
}
|
||||
|
||||
@@ -188,7 +208,7 @@ public class Pseudocode {
|
||||
while (hasRemovedInstruction) {
|
||||
hasRemovedInstruction = false;
|
||||
for (Instruction instruction : instructions) {
|
||||
if (!(instruction instanceof SubroutineEnterInstruction || instruction instanceof SubroutineExitInstruction) &&
|
||||
if (!(instruction instanceof SubroutineEnterInstruction || instruction instanceof SubroutineExitInstruction || instruction instanceof SubroutineSinkInstruction) &&
|
||||
instruction.getPreviousInstructions().isEmpty() && !processedInstructions.contains(instruction)) {
|
||||
hasRemovedInstruction = true;
|
||||
for (Instruction nextInstruction : instruction.getNextInstructions()) {
|
||||
|
||||
+8
@@ -12,6 +12,7 @@ import java.util.Collections;
|
||||
public class SubroutineExitInstruction extends InstructionImpl {
|
||||
private final JetElement subroutine;
|
||||
private final String debugLabel;
|
||||
private SubroutineSinkInstruction sinkInstruction;
|
||||
|
||||
public SubroutineExitInstruction(@NotNull JetElement subroutine, @NotNull String debugLabel) {
|
||||
this.subroutine = subroutine;
|
||||
@@ -22,9 +23,16 @@ public class SubroutineExitInstruction extends InstructionImpl {
|
||||
return subroutine;
|
||||
}
|
||||
|
||||
public void setSink(SubroutineSinkInstruction instruction) {
|
||||
sinkInstruction = (SubroutineSinkInstruction) outgoingEdgeTo(instruction);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<Instruction> getNextInstructions() {
|
||||
if (sinkInstruction != null) {
|
||||
return Collections.<Instruction>singleton(sinkInstruction);
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package org.jetbrains.jet.lang.cfg.pseudocode;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.psi.JetElement;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* @author svtk
|
||||
*/
|
||||
public class SubroutineSinkInstruction extends InstructionImpl {
|
||||
private final JetElement subroutine;
|
||||
private final String debugLabel;
|
||||
|
||||
public SubroutineSinkInstruction(@NotNull JetElement subroutine, @NotNull String debugLabel) {
|
||||
this.subroutine = subroutine;
|
||||
this.debugLabel = debugLabel;
|
||||
}
|
||||
|
||||
public JetElement getSubroutine() {
|
||||
return subroutine;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<Instruction> getNextInstructions() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(InstructionVisitor visitor) {
|
||||
visitor.visitSubroutineSink(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return debugLabel;
|
||||
}
|
||||
}
|
||||
@@ -16,26 +16,30 @@ class AnonymousInitializers() {
|
||||
}
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[r(34)] PREV:[]
|
||||
r(34) NEXT:[w(k)] PREV:[<START>]
|
||||
w(k) NEXT:[r(12)] PREV:[r(34)]
|
||||
r(12) NEXT:[w($i)] PREV:[w(k)]
|
||||
w($i) NEXT:[r(13)] PREV:[r(12)]
|
||||
r(13) NEXT:[w($i)] PREV:[w($i)]
|
||||
w($i) NEXT:[<END>] PREV:[r(13)]
|
||||
<START> NEXT:[r(34)] PREV:[]
|
||||
r(34) NEXT:[w(k)] PREV:[<START>]
|
||||
w(k) NEXT:[r(12)] PREV:[r(34)]
|
||||
r(12) NEXT:[w($i)] PREV:[w(k)]
|
||||
w($i) NEXT:[r(13)] PREV:[r(12)]
|
||||
r(13) NEXT:[w($i)] PREV:[w($i)]
|
||||
w($i) NEXT:[<END>] PREV:[r(13)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[w($i)]
|
||||
<END> NEXT:[<SINK>] PREV:[w($i)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== k ==
|
||||
val k = 34
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[r(34)] PREV:[]
|
||||
r(34) NEXT:[<END>] PREV:[<START>]
|
||||
<START> NEXT:[r(34)] PREV:[]
|
||||
r(34) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(34)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(34)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -32,7 +32,9 @@ l0:
|
||||
r(+=) NEXT:[w(a[10])] PREV:[r(1)]
|
||||
w(a[10]) NEXT:[<END>] PREV:[r(+=)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[w(a[10])]
|
||||
<END> NEXT:[<SINK>] PREV:[w(a[10])]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -4,11 +4,13 @@ class Test {
|
||||
}
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[<END>] PREV:[]
|
||||
<START> NEXT:[<END>] PREV:[]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[<START>]
|
||||
<END> NEXT:[<SINK>] PREV:[<START>]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== assignments ==
|
||||
fun assignments() : Unit {
|
||||
@@ -63,7 +65,9 @@ l5:
|
||||
r(=) NEXT:[w(t.x)] PREV:[r(t)]
|
||||
w(t.x) NEXT:[<END>] PREV:[r(=)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[w(t.x)]
|
||||
<END> NEXT:[<SINK>] PREV:[w(t.x)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
{1}
|
||||
---------------------
|
||||
l2:
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
l3:
|
||||
<END> NEXT:[] PREV:[r(1)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(1)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== f ==
|
||||
fun f(a : Boolean) : Unit {
|
||||
@@ -41,7 +43,7 @@ l0:
|
||||
r(foo(a, 3)) NEXT:[r(genfun)] PREV:[r(foo)]
|
||||
r(genfun) NEXT:[r(genfun<Any>())] PREV:[r(foo(a, 3))]
|
||||
r(genfun<Any>()) NEXT:[df({1})] PREV:[r(genfun)]
|
||||
df({1}) NEXT:[r({1})] PREV:[r(genfun<Any>())]
|
||||
df({1}) NEXT:[<SINK>, r({1})] PREV:[r(genfun<Any>())]
|
||||
r({1}) NEXT:[r(flfun)] PREV:[df({1})]
|
||||
r(flfun) NEXT:[r(flfun {1})] PREV:[r({1})]
|
||||
r(flfun {1}) NEXT:[r(3)] PREV:[r(flfun)]
|
||||
@@ -69,16 +71,20 @@ l4:
|
||||
l5:
|
||||
r(a || false) NEXT:[<END>] PREV:[jt(l5), r(false)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(a || false)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(a || false)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[df({1}), <END>]
|
||||
l2:
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
l3:
|
||||
<END> NEXT:[] PREV:[r(1)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(1)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== foo ==
|
||||
fun foo(a : Boolean, b : Int) : Unit {}
|
||||
@@ -87,9 +93,11 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== genfun ==
|
||||
fun genfun<T>() : Unit {}
|
||||
@@ -98,9 +106,11 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== flfun ==
|
||||
fun flfun(f : fun () : Any) : Unit {}
|
||||
@@ -109,7 +119,9 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -5,7 +5,9 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -13,7 +13,9 @@ l0:
|
||||
r(java.lang.RuntimeException()) NEXT:[jmp(error)] PREV:[r(RuntimeException())]
|
||||
jmp(error) NEXT:[<ERROR>] PREV:[r(java.lang.RuntimeException())]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[]
|
||||
<END> NEXT:[<SINK>] PREV:[]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -14,9 +14,11 @@ l0:
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), r(1)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -48,9 +50,11 @@ l2:
|
||||
l4:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), read (Unit)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[ret l1, r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l1, r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== anonymous_0 ==
|
||||
{ () =>
|
||||
@@ -72,9 +76,11 @@ l5:
|
||||
read (Unit) NEXT:[<END>] PREV:[jf(l5)]
|
||||
l4:
|
||||
l6:
|
||||
<END> NEXT:[] PREV:[ret l4, read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l4, read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -91,25 +97,27 @@ fun t3() {
|
||||
}
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[jmp?(l2)] PREV:[]
|
||||
jmp?(l2) NEXT:[r(2), r(1)] PREV:[<START>]
|
||||
r(1) NEXT:[df({ () => if (2 > 3) { retu..)] PREV:[jmp?(l2)]
|
||||
<START> NEXT:[jmp?(l2)] PREV:[]
|
||||
jmp?(l2) NEXT:[r(2), r(1)] PREV:[<START>]
|
||||
r(1) NEXT:[df({ () => if (2 > 3) { retu..)] PREV:[jmp?(l2)]
|
||||
df({ () =>
|
||||
if (2 > 3) {
|
||||
return@
|
||||
}
|
||||
}) NEXT:[r({ () => if (2 > 3) { retur..)] PREV:[r(1)]
|
||||
}) NEXT:[<SINK>, r({ () => if (2 > 3) { retur..)] PREV:[r(1)]
|
||||
r({ () =>
|
||||
if (2 > 3) {
|
||||
return@
|
||||
}
|
||||
}) NEXT:[r(2)] PREV:[df({ () => if (2 > 3) { retu..)]
|
||||
}) NEXT:[r(2)] PREV:[df({ () => if (2 > 3) { retu..)]
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), r({ () => if (2 > 3) { retur..)]
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), r({ () => if (2 > 3) { retur..)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[df({ () => if (2 > 3) { retu..), <END>]
|
||||
l3:
|
||||
<START> NEXT:[r(2)] PREV:[]
|
||||
r(2) NEXT:[r(3)] PREV:[<START>]
|
||||
@@ -123,9 +131,11 @@ l5:
|
||||
read (Unit) NEXT:[<END>] PREV:[jf(l5)]
|
||||
l4:
|
||||
l6:
|
||||
<END> NEXT:[] PREV:[ret l4, read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l4, read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== anonymous_1 ==
|
||||
{ () =>
|
||||
@@ -157,9 +167,11 @@ l4:
|
||||
l6:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l4), read (Unit)]
|
||||
l3:
|
||||
<END> NEXT:[] PREV:[ret l3, r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l3, r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -176,7 +188,7 @@ fun t3() {
|
||||
}
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[df({ () => try { 1 if (2 > 3..)] PREV:[]
|
||||
<START> NEXT:[df({ () => try { 1 if (2 > 3..)] PREV:[]
|
||||
df({ () =>
|
||||
try {
|
||||
1
|
||||
@@ -186,7 +198,7 @@ l0:
|
||||
} finally {
|
||||
2
|
||||
}
|
||||
}) NEXT:[r({ () => try { 1 if (2 > 3)..)] PREV:[<START>]
|
||||
}) NEXT:[<SINK>, r({ () => try { 1 if (2 > 3)..)] PREV:[<START>]
|
||||
r({ () =>
|
||||
try {
|
||||
1
|
||||
@@ -196,11 +208,13 @@ l0:
|
||||
} finally {
|
||||
2
|
||||
}
|
||||
}) NEXT:[<END>] PREV:[df({ () => try { 1 if (2 > 3..)]
|
||||
}) NEXT:[<END>] PREV:[df({ () => try { 1 if (2 > 3..)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r({ () => try { 1 if (2 > 3)..)]
|
||||
<END> NEXT:[<SINK>] PREV:[r({ () => try { 1 if (2 > 3)..)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[df({ () => try { 1 if (2 > 3..), <END>]
|
||||
l2:
|
||||
<START> NEXT:[jmp?(l4)] PREV:[]
|
||||
jmp?(l4) NEXT:[r(2), r(1)] PREV:[<START>]
|
||||
@@ -219,9 +233,11 @@ l4:
|
||||
l6:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l4), read (Unit)]
|
||||
l3:
|
||||
<END> NEXT:[] PREV:[ret l3, r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l3, r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -263,9 +279,11 @@ l8:
|
||||
l3:
|
||||
read (Unit) NEXT:[<END>] PREV:[jf(l3), jmp(l3)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -308,9 +326,11 @@ l4:
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), r(5)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -351,9 +371,11 @@ l4:
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), read (Unit)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3(a : Int) {
|
||||
@@ -399,9 +421,11 @@ l8:
|
||||
l2:
|
||||
read (Unit) NEXT:[<END>] PREV:[jmp?(l2), jmp?(l4)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3(a : Int) {
|
||||
@@ -448,9 +472,11 @@ l3:
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), r(5)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3(a : Int) {
|
||||
@@ -495,9 +521,11 @@ l3:
|
||||
l2:
|
||||
r(2) NEXT:[<END>] PREV:[jmp?(l2), read (Unit)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(2)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(2)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== tf ==
|
||||
fun tf() {
|
||||
@@ -520,7 +548,9 @@ l2:
|
||||
r(2) NEXT:[ret(*) l1] PREV:[jmp?(l2)]
|
||||
ret(*) l1 NEXT:[<END>] PREV:[r(2)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[ret(*) l1, ret(*) l1]
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*) l1, ret(*) l1]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -23,9 +23,11 @@ l5:
|
||||
l2:
|
||||
read (Unit) NEXT:[<END>] PREV:[jmp?(l2), jmp?(l4)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(i: Int) {}
|
||||
@@ -34,7 +36,9 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -42,9 +42,11 @@ l5:
|
||||
r(doSmth) NEXT:[r(doSmth(r))] PREV:[r(r)]
|
||||
r(doSmth(r)) NEXT:[<END>] PREV:[r(doSmth)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(doSmth(r))]
|
||||
<END> NEXT:[<SINK>] PREV:[r(doSmth(r))]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== t2 ==
|
||||
fun t2(b: Boolean) {
|
||||
@@ -81,9 +83,11 @@ l4:
|
||||
read (Unit) NEXT:[<END>] PREV:[jf(l4)]
|
||||
l1:
|
||||
l5:
|
||||
<END> NEXT:[] PREV:[ret l1, ret l1, read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l1, ret l1, read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(s: String) {}
|
||||
@@ -92,7 +96,9 @@ l0:
|
||||
<START> NEXT:[read (Unit)] PREV:[]
|
||||
read (Unit) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -66,7 +66,9 @@ l12:
|
||||
l13:
|
||||
r(14) NEXT:[<END>] PREV:[jmp(l13), r(13)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(14)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(14)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -20,9 +20,11 @@ l4:
|
||||
l3:
|
||||
read (Unit) NEXT:[<END>] PREV:[jf(l3)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[read (Unit)]
|
||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
== dowhile ==
|
||||
fun dowhile() {
|
||||
@@ -44,7 +46,9 @@ l5:
|
||||
l3:
|
||||
* read (Unit) NEXT:[<END>] PREV:[]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[ret l1]
|
||||
<END> NEXT:[<SINK>] PREV:[ret l1]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -12,7 +12,9 @@ l0:
|
||||
l2:
|
||||
r(false || (return false)) NEXT:[<END>] PREV:[jt(l2)]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[ret(*) l1, r(false || (return false))]
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(false || (return false))]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
fun short() = 1
|
||||
---------------------
|
||||
l0:
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
<START> NEXT:[r(1)] PREV:[]
|
||||
r(1) NEXT:[<END>] PREV:[<START>]
|
||||
l1:
|
||||
<END> NEXT:[] PREV:[r(1)]
|
||||
<END> NEXT:[<SINK>] PREV:[r(1)]
|
||||
error:
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
<ERROR> NEXT:[] PREV:[]
|
||||
sink:
|
||||
<SINK> NEXT:[] PREV:[<END>]
|
||||
=====================
|
||||
|
||||
@@ -123,7 +123,7 @@ public class JetControlFlowTest extends JetLiteFixture {
|
||||
//check edges directions
|
||||
Collection<Instruction> instructions = pseudocode.getInstructions();
|
||||
for (Instruction instruction : instructions) {
|
||||
if (!((InstructionImpl) instruction).isDead()) {
|
||||
if (!instruction.isDead()) {
|
||||
for (Instruction nextInstruction : instruction.getNextInstructions()) {
|
||||
assertTrue("instruction '" + instruction + "' has '" + nextInstruction + "' among next instructions list, but not vice versa",
|
||||
nextInstruction.getPreviousInstructions().contains(instruction));
|
||||
@@ -170,7 +170,7 @@ public class JetControlFlowTest extends JetLiteFixture {
|
||||
|
||||
private static String formatInstruction(Instruction instruction, int maxLength) {
|
||||
String[] parts = instruction.toString().split("\n");
|
||||
String prefix = ((InstructionImpl)instruction).isDead() ? "* " : " ";
|
||||
String prefix = instruction.isDead() ? "* " : " ";
|
||||
if (parts.length == 1) {
|
||||
return prefix + String.format("%1$-" + maxLength + "s", instruction);
|
||||
}
|
||||
@@ -266,7 +266,7 @@ public class JetControlFlowTest extends JetLiteFixture {
|
||||
for (final Instruction fromInst : instructions) {
|
||||
fromInst.accept(new InstructionVisitor() {
|
||||
@Override
|
||||
public void visitFunctionLiteralValue(LocalDeclarationInstruction instruction) {
|
||||
public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) {
|
||||
int index = count[0];
|
||||
// instruction.getBody().dumpSubgraph(out, "subgraph cluster_" + index, count, "color=blue;\nlabel = \"f" + index + "\";", nodeToName);
|
||||
printEdge(out, nodeToName.get(instruction), nodeToName.get(instruction.getBody().getInstructions().get(0)), null);
|
||||
|
||||
Reference in New Issue
Block a user