KT-575 Cannot ++ a class object member

This commit is contained in:
svtk
2011-11-22 18:05:50 +04:00
parent 6628920925
commit 4bf3a61621
17 changed files with 412 additions and 286 deletions
@@ -58,6 +58,9 @@ public interface JetControlFlowBuilder {
void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine);
void write(@NotNull JetElement assignment, @NotNull JetElement lValue);
void declare(@NotNull JetParameter parameter);
void declare(@NotNull JetProperty property);
// Other
void unsupported(JetElement element);
@@ -177,4 +177,16 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
assert builder != null;
builder.write(assignment, lValue);
}
@Override
public void declare(@NotNull JetParameter parameter) {
assert builder != null;
builder.declare(parameter);
}
@Override
public void declare(@NotNull JetProperty property) {
assert builder != null;
builder.declare(property);
}
}
@@ -388,6 +388,7 @@ public class JetControlFlowProcessor {
}
JetParameter catchParameter = catchClause.getCatchParameter();
if (catchParameter != null) {
builder.declare(catchParameter);
builder.write(catchParameter, catchParameter);
}
JetExpression catchBody = catchClause.getCatchBody();
@@ -458,6 +459,7 @@ public class JetControlFlowProcessor {
}
JetParameter loopParameter = expression.getLoopParameter();
if (loopParameter != null) {
builder.declare(loopParameter);
builder.write(loopParameter, loopParameter);
}
// TODO : primitive cases
@@ -669,6 +671,7 @@ public class JetControlFlowProcessor {
@Override
public void visitProperty(JetProperty property) {
builder.declare(property);
JetExpression initializer = property.getInitializer();
if (initializer != null) {
value(initializer, false);
@@ -676,14 +679,6 @@ public class JetControlFlowProcessor {
}
}
@Override
public void visitPropertyAccessor(JetPropertyAccessor accessor) {
JetExpression bodyExpression = accessor.getBodyExpression();
if (bodyExpression != null) {
processLocalDeclaration(accessor, bodyExpression);
}
}
@Override
public void visitTupleExpression(JetTupleExpression expression) {
for (JetExpression entry : expression.getEntries()) {
@@ -838,11 +833,6 @@ public class JetControlFlowProcessor {
value(declaration, inCondition);
}
}
for (JetProperty property : properties) {
for (JetPropertyAccessor accessor : property.getAccessors()) {
value(accessor, inCondition);
}
}
}
@Override
@@ -855,11 +845,4 @@ public class JetControlFlowProcessor {
builder.unsupported(element);
}
}
private final CFPVisitor FOR_LOCAL_CLASSES = new CFPVisitor(false) {
@Override
public void visitNamedFunction(JetNamedFunction function) {
// Nothing
}
};
}
@@ -440,31 +440,23 @@ public class JetFlowInformationProvider {
}
private Collection<VariableDescriptor> collectDeclaredVariables(JetElement element) {
final Pseudocode pseudocode = pseudocodeMap.get(element);
assert pseudocode != null;
final Set<VariableDescriptor> declaredVariables = Sets.newHashSet();
element.accept(new JetTreeVisitor<Void>() {
JetControlFlowGraphTraverser.<Void>create(pseudocode, false).traverseAndAnalyzeInstructionGraph(new JetControlFlowGraphTraverser.InstructionDataAnalyzeStrategy<Void>() {
@Override
public Void visitProperty(JetProperty property, Void data) {
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
if (descriptor != null) {
assert descriptor instanceof VariableDescriptor;
declaredVariables.add((VariableDescriptor) descriptor);
}
return super.visitProperty(property, data);
}
@Override
public Void visitForExpression(JetForExpression expression, Void data) {
JetParameter loopParameter = expression.getLoopParameter();
if (loopParameter != null) {
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, loopParameter);
public void execute(Instruction instruction, @Nullable Void enterData, @Nullable Void exitData) {
if (instruction instanceof VariableDeclarationInstruction) {
JetDeclaration variableDeclarationElement = ((VariableDeclarationInstruction) instruction).getVariableDeclarationElement();
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement);
if (descriptor != null) {
assert descriptor instanceof VariableDescriptor;
declaredVariables.add((VariableDescriptor) descriptor);
}
}
return super.visitForExpression(expression, data);
}
}, null);
});
return declaredVariables;
}
@@ -12,6 +12,10 @@ public class InstructionVisitor {
visitInstructionWithNext(instruction);
}
public void visitVariableDeclarationInstruction(VariableDeclarationInstruction instruction) {
visitInstructionWithNext(instruction);
}
public void visitUnconditionalJump(UnconditionalJumpInstruction instruction) {
visitJump(instruction);
}
@@ -216,6 +216,16 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
add(new WriteValueInstruction(assignment, lValue));
}
@Override
public void declare(@NotNull JetParameter parameter) {
add(new VariableDeclarationInstruction(parameter));
}
@Override
public void declare(@NotNull JetProperty property) {
add(new VariableDeclarationInstruction(property));
}
@Override
public void read(@NotNull JetExpression expression) {
add(new ReadValueInstruction(expression));
@@ -8,7 +8,7 @@ import java.util.ArrayList;
import java.util.Collection;
/**
* @author abreslav
* @author svtk
*/
public class LocalDeclarationInstruction extends InstructionWithNext {
@@ -0,0 +1,33 @@
package org.jetbrains.jet.lang.cfg.pseudocode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.psi.JetProperty;
/**
* @author svtk
*/
public class VariableDeclarationInstruction extends InstructionWithNext {
protected VariableDeclarationInstruction(@NotNull JetParameter element) {
super(element);
}
protected VariableDeclarationInstruction(@NotNull JetProperty element) {
super(element);
}
public JetDeclaration getVariableDeclarationElement() {
return (JetDeclaration) element;
}
@Override
public void accept(InstructionVisitor visitor) {
visitor.visitVariableDeclarationInstruction(this);
}
@Override
public String toString() {
return "v(" + element.getText() + ")";
}
}
@@ -67,7 +67,7 @@ public class ControlFlowAnalyzer {
? propertyDescriptor.getGetter()
: propertyDescriptor.getSetter();
assert accessorDescriptor != null;
flowInformationProvider.checkDefiniteReturn(accessor, accessorDescriptor.getReturnType());
checkFunction(accessor, accessorDescriptor.getReturnType());
}
}
}
@@ -1,16 +1,3 @@
== get_j ==
get() = 20
---------------------
l3:
<START> NEXT:[r(20)] PREV:[]
r(20) NEXT:[<END>] PREV:[<START>]
l4:
<END> NEXT:[<SINK>] PREV:[r(20)]
error:
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
=====================
== AnonymousInitializers ==
class AnonymousInitializers() {
val k = 34
@@ -29,26 +16,31 @@ 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:[jmp?(l2)] PREV:[r(13)]
jmp?(l2) NEXT:[<END>, d(get() = 20)] PREV:[w($i)]
d(get() = 20) NEXT:[<SINK>] PREV:[jmp?(l2)]
<START> NEXT:[v(val k = 34)] PREV:[]
v(val k = 34) NEXT:[r(34)] PREV:[<START>]
r(34) NEXT:[w(k)] PREV:[v(val k = 34)]
w(k) NEXT:[v(val i: Int)] PREV:[r(34)]
v(val i: Int) NEXT:[r(12)] PREV:[w(k)]
r(12) NEXT:[w($i)] PREV:[v(val i: Int)]
w($i) NEXT:[v(val j: Int get() = 20) ] PREV:[r(12)]
v(val j: Int
get() = 20) NEXT:[r(13)] PREV:[w($i)]
r(13) NEXT:[w($i)] PREV:[v(val j: Int get() = 20) ]
w($i) NEXT:[<END>] PREV:[r(13)]
l1:
l2:
<END> NEXT:[<SINK>] PREV:[jmp?(l2)]
<END> NEXT:[<SINK>] PREV:[w($i)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[d(get() = 20), <END>]
l3:
<SINK> NEXT:[] PREV:[<END>]
=====================
== get_j ==
get() = 20
---------------------
l0:
<START> NEXT:[r(20)] PREV:[]
r(20) NEXT:[<END>] PREV:[<START>]
l4:
l1:
<END> NEXT:[<SINK>] PREV:[r(20)]
error:
<ERROR> NEXT:[] PREV:[]
+25 -24
View File
@@ -10,31 +10,32 @@ fun foo() {
}
---------------------
l0:
<START> NEXT:[r(Array)] PREV:[]
r(Array) NEXT:[r(Array<Int>)] PREV:[<START>]
r(Array<Int>) NEXT:[w(a)] PREV:[r(Array)]
w(a) NEXT:[r(3)] PREV:[r(Array<Int>)]
r(3) NEXT:[r(4)] PREV:[w(a)]
r(4) NEXT:[r(10)] PREV:[r(3)]
r(10) NEXT:[r(a)] PREV:[r(4)]
r(a) NEXT:[r(=)] PREV:[r(10)]
r(=) NEXT:[w(a[10])] PREV:[r(a)]
w(a[10]) NEXT:[r(2)] PREV:[r(=)]
r(2) NEXT:[r(10)] PREV:[w(a[10])]
r(10) NEXT:[r(a)] PREV:[r(2)]
r(a) NEXT:[r(a[10])] PREV:[r(10)]
r(a[10]) NEXT:[r(100)] PREV:[r(a)]
r(100) NEXT:[r(10)] PREV:[r(a[10])]
r(10) NEXT:[r(a)] PREV:[r(100)]
r(a) NEXT:[r(a[10])] PREV:[r(10)]
r(a[10]) NEXT:[r(1)] PREV:[r(a)]
r(1) NEXT:[r(+=)] PREV:[r(a[10])]
r(+=) NEXT:[w(a[10])] PREV:[r(1)]
w(a[10]) NEXT:[<END>] PREV:[r(+=)]
<START> NEXT:[v(val a = Array<Int>)] PREV:[]
v(val a = Array<Int>) NEXT:[r(Array)] PREV:[<START>]
r(Array) NEXT:[r(Array<Int>)] PREV:[v(val a = Array<Int>)]
r(Array<Int>) NEXT:[w(a)] PREV:[r(Array)]
w(a) NEXT:[r(3)] PREV:[r(Array<Int>)]
r(3) NEXT:[r(4)] PREV:[w(a)]
r(4) NEXT:[r(10)] PREV:[r(3)]
r(10) NEXT:[r(a)] PREV:[r(4)]
r(a) NEXT:[r(=)] PREV:[r(10)]
r(=) NEXT:[w(a[10])] PREV:[r(a)]
w(a[10]) NEXT:[r(2)] PREV:[r(=)]
r(2) NEXT:[r(10)] PREV:[w(a[10])]
r(10) NEXT:[r(a)] PREV:[r(2)]
r(a) NEXT:[r(a[10])] PREV:[r(10)]
r(a[10]) NEXT:[r(100)] PREV:[r(a)]
r(100) NEXT:[r(10)] PREV:[r(a[10])]
r(10) NEXT:[r(a)] PREV:[r(100)]
r(a) NEXT:[r(a[10])] PREV:[r(10)]
r(a[10]) NEXT:[r(1)] PREV:[r(a)]
r(1) NEXT:[r(+=)] PREV:[r(a[10])]
r(+=) NEXT:[w(a[10])] PREV:[r(1)]
w(a[10]) NEXT:[<END>] PREV:[r(+=)]
l1:
<END> NEXT:[<SINK>] PREV:[w(a[10])]
<END> NEXT:[<SINK>] PREV:[w(a[10])]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
+44 -39
View File
@@ -4,13 +4,14 @@ class Test {
}
---------------------
l0:
<START> NEXT:[<END>] PREV:[]
<START> NEXT:[v(var x : Int;)] PREV:[]
v(var x : Int;) NEXT:[<END>] PREV:[<START>]
l1:
<END> NEXT:[<SINK>] PREV:[<START>]
<END> NEXT:[<SINK>] PREV:[v(var x : Int;)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== assignments ==
fun assignments() : Unit {
@@ -28,46 +29,50 @@ fun assignments() : Unit {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w(x)] PREV:[<START>]
w(x) NEXT:[r(2)] PREV:[r(1)]
r(2) NEXT:[w(x)] PREV:[w(x)]
w(x) NEXT:[r(x)] PREV:[r(2)]
r(x) NEXT:[r(2)] PREV:[w(x)]
r(2) NEXT:[r(+=)] PREV:[r(x)]
r(+=) NEXT:[w(x)] PREV:[r(2)]
w(x) NEXT:[r(true)] PREV:[r(+=)]
r(true) NEXT:[jf(l2)] PREV:[w(x)]
jf(l2) NEXT:[r(2), r(1)] PREV:[r(true)]
r(1) NEXT:[jmp(l3)] PREV:[jf(l2)]
jmp(l3) NEXT:[w(x)] PREV:[r(1)]
<START> NEXT:[v(var x = 1)] PREV:[]
v(var x = 1) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w(x)] PREV:[v(var x = 1)]
w(x) NEXT:[r(2)] PREV:[r(1)]
r(2) NEXT:[w(x)] PREV:[w(x)]
w(x) NEXT:[r(x)] PREV:[r(2)]
r(x) NEXT:[r(2)] PREV:[w(x)]
r(2) NEXT:[r(+=)] PREV:[r(x)]
r(+=) NEXT:[w(x)] PREV:[r(2)]
w(x) NEXT:[r(true)] PREV:[r(+=)]
r(true) NEXT:[jf(l2)] PREV:[w(x)]
jf(l2) NEXT:[r(2), r(1)] PREV:[r(true)]
r(1) NEXT:[jmp(l3)] PREV:[jf(l2)]
jmp(l3) NEXT:[w(x)] PREV:[r(1)]
l2:
r(2) NEXT:[w(x)] PREV:[jf(l2)]
r(2) NEXT:[w(x)] PREV:[jf(l2)]
l3:
w(x) NEXT:[r(true)] PREV:[jmp(l3), r(2)]
r(true) NEXT:[jf(l4)] PREV:[w(x)]
jf(l4) NEXT:[r(true && false), r(false)] PREV:[r(true)]
r(false) NEXT:[r(true && false)] PREV:[jf(l4)]
w(x) NEXT:[v(val y = true && false)] PREV:[jmp(l3), r(2)]
v(val y = true && false) NEXT:[r(true)] PREV:[w(x)]
r(true) NEXT:[jf(l4)] PREV:[v(val y = true && false)]
jf(l4) NEXT:[r(true && false), r(false)] PREV:[r(true)]
r(false) NEXT:[r(true && false)] PREV:[jf(l4)]
l4:
r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)]
w(y) NEXT:[r(false)] PREV:[r(true && false)]
r(false) NEXT:[jf(l5)] PREV:[w(y)]
jf(l5) NEXT:[r(false && true), r(true)] PREV:[r(false)]
r(true) NEXT:[r(false && true)] PREV:[jf(l5)]
r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)]
w(y) NEXT:[v(val z = false && true)] PREV:[r(true && false)]
v(val z = false && true) NEXT:[r(false)] PREV:[w(y)]
r(false) NEXT:[jf(l5)] PREV:[v(val z = false && true)]
jf(l5) NEXT:[r(false && true), r(true)] PREV:[r(false)]
r(true) NEXT:[r(false && true)] PREV:[jf(l5)]
l5:
r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)]
w(z) NEXT:[r(Test)] PREV:[r(false && true)]
r(Test) NEXT:[r(Test())] PREV:[w(z)]
r(Test()) NEXT:[w(t)] PREV:[r(Test)]
w(t) NEXT:[r(1)] PREV:[r(Test())]
r(1) NEXT:[r(t)] PREV:[w(t)]
r(t) NEXT:[r(=)] PREV:[r(1)]
r(=) NEXT:[w(t.x)] PREV:[r(t)]
w(t.x) NEXT:[<END>] PREV:[r(=)]
r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)]
w(z) NEXT:[v(val t = Test())] PREV:[r(false && true)]
v(val t = Test()) NEXT:[r(Test)] PREV:[w(z)]
r(Test) NEXT:[r(Test())] PREV:[v(val t = Test())]
r(Test()) NEXT:[w(t)] PREV:[r(Test)]
w(t) NEXT:[r(1)] PREV:[r(Test())]
r(1) NEXT:[r(t)] PREV:[w(t)]
r(t) NEXT:[r(=)] PREV:[r(1)]
r(=) NEXT:[w(t.x)] PREV:[r(t)]
w(t.x) NEXT:[<END>] PREV:[r(=)]
l1:
<END> NEXT:[<SINK>] PREV:[w(t.x)]
<END> NEXT:[<SINK>] PREV:[w(t.x)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
+89 -82
View File
@@ -392,8 +392,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)]
r(1..a) NEXT:[v(i)] PREV:[r(..)]
v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4:
@@ -442,8 +443,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)]
r(1..a) NEXT:[v(i)] PREV:[r(..)]
v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4:
@@ -491,8 +493,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)]
r(1..a) NEXT:[v(i)] PREV:[r(..)]
v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4:
@@ -588,33 +591,34 @@ fun t13() : Int {
}
---------------------
l0:
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(3)] PREV:[jmp?(l2)]
r(3) NEXT:[r(doSmth)] PREV:[r(1)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(3)] PREV:[jmp?(l2)]
r(3) NEXT:[r(doSmth)] PREV:[r(1)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
l3:
R jmp(l4) NEXT:[r(3)] PREV:[]
R jmp(l4) NEXT:[r(3)] PREV:[]
l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()]
r(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()]
w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)]
r(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
l5:
jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))]
jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))]
l4:
r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[<END>] PREV:[r(doSmth)]
r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[<END>] PREV:[r(doSmth)]
l1:
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(doSmth(3))]
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(doSmth(3))]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== t14 ==
fun t14() : Int {
@@ -627,27 +631,28 @@ fun t14() : Int {
}
---------------------
l0:
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)]
ret(*) l1 NEXT:[<END>] PREV:[r(1)]
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)]
ret(*) l1 NEXT:[<END>] PREV:[r(1)]
l3:
R jmp(l4) NEXT:[<END>] PREV:[]
R jmp(l4) NEXT:[<END>] PREV:[]
l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()]
r(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()]
w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)]
r(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
l5:
jmp(l4) NEXT:[<END>] PREV:[r(doSmth(2))]
jmp(l4) NEXT:[<END>] PREV:[r(doSmth(2))]
l1:
l4:
<END> NEXT:[<SINK>] PREV:[ret(*) l1, jmp(l4)]
<END> NEXT:[<SINK>] PREV:[ret(*) l1, jmp(l4)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== t15 ==
fun t15() : Int {
@@ -663,35 +668,36 @@ fun t15() : Int {
}
---------------------
l0:
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(3)] PREV:[jmp?(l2)]
r(3) NEXT:[r(doSmth)] PREV:[r(1)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(3)] PREV:[jmp?(l2)]
r(3) NEXT:[r(doSmth)] PREV:[r(1)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
l3:
R jmp(l4) NEXT:[r(3)] PREV:[]
R jmp(l4) NEXT:[r(3)] PREV:[]
l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()]
r(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()]
w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)]
r(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
l5:
R jmp(l4) NEXT:[r(3)] PREV:[]
R jmp(l4) NEXT:[r(3)] PREV:[]
l4:
R r(3) NEXT:[r(doSmth)] PREV:[]
R r(doSmth) NEXT:[r(doSmth(3))] PREV:[]
R r(doSmth(3)) NEXT:[<END>] PREV:[]
R r(3) NEXT:[r(doSmth)] PREV:[]
R r(doSmth) NEXT:[r(doSmth(3))] PREV:[]
R r(doSmth(3)) NEXT:[<END>] PREV:[]
l1:
<END> NEXT:[<SINK>] PREV:[ret(*) l1, ret(*) l1]
<END> NEXT:[<SINK>] PREV:[ret(*) l1, ret(*) l1]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== t16 ==
fun t16() : Int {
@@ -707,33 +713,34 @@ fun t16() : Int {
}
---------------------
l0:
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)]
r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)]
r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[<START>]
r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)]
r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)]
r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
l3:
jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))]
jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))]
l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()]
r(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()]
w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)]
r(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)]
ret(*) l1 NEXT:[<END>] PREV:[r(doSmth(3))]
l5:
R jmp(l4) NEXT:[r(3)] PREV:[]
R jmp(l4) NEXT:[r(3)] PREV:[]
l4:
r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[<END>] PREV:[r(doSmth)]
r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
r(doSmth(3)) NEXT:[<END>] PREV:[r(doSmth)]
l1:
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(doSmth(3))]
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(doSmth(3))]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== doSmth ==
fun doSmth(i: Int) {
+3 -2
View File
@@ -10,8 +10,9 @@ l0:
r(1) NEXT:[r(2)] PREV:[<START>]
r(2) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..2)] PREV:[r(2)]
r(1..2) NEXT:[w(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..2)]
r(1..2) NEXT:[v(i)] PREV:[r(..)]
v(i) NEXT:[w(i)] PREV:[r(1..2)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3:
jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)]
l4:
+28 -25
View File
@@ -17,36 +17,38 @@ fun t1(b: Boolean) {
}
---------------------
l0:
<START> NEXT:[r(b)] PREV:[]
r(b) NEXT:[jf(l2)] PREV:[<START>]
jf(l2) NEXT:[read (Unit), r("s")] PREV:[r(b)]
r("s") NEXT:[w(u)] PREV:[jf(l2)]
w(u) NEXT:[jmp(l3)] PREV:[r("s")]
jmp(l3) NEXT:[r(u)] PREV:[w(u)]
<START> NEXT:[v(var u: String)] PREV:[]
v(var u: String) NEXT:[r(b)] PREV:[<START>]
r(b) NEXT:[jf(l2)] PREV:[v(var u: String)]
jf(l2) NEXT:[read (Unit), r("s")] PREV:[r(b)]
r("s") NEXT:[w(u)] PREV:[jf(l2)]
w(u) NEXT:[jmp(l3)] PREV:[r("s")]
jmp(l3) NEXT:[r(u)] PREV:[w(u)]
l2:
read (Unit) NEXT:[r(u)] PREV:[jf(l2)]
read (Unit) NEXT:[r(u)] PREV:[jf(l2)]
l3:
r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)]
r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)]
r(doSmth(u)) NEXT:[r(b)] PREV:[r(doSmth)]
r(b) NEXT:[jf(l4)] PREV:[r(doSmth(u))]
jf(l4) NEXT:[r("t"), r("s")] PREV:[r(b)]
r("s") NEXT:[w(r)] PREV:[jf(l4)]
w(r) NEXT:[jmp(l5)] PREV:[r("s")]
jmp(l5) NEXT:[r(r)] PREV:[w(r)]
r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)]
r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)]
r(doSmth(u)) NEXT:[v(var r: String)] PREV:[r(doSmth)]
v(var r: String) NEXT:[r(b)] PREV:[r(doSmth(u))]
r(b) NEXT:[jf(l4)] PREV:[v(var r: String)]
jf(l4) NEXT:[r("t"), r("s")] PREV:[r(b)]
r("s") NEXT:[w(r)] PREV:[jf(l4)]
w(r) NEXT:[jmp(l5)] PREV:[r("s")]
jmp(l5) NEXT:[r(r)] PREV:[w(r)]
l4:
r("t") NEXT:[w(r)] PREV:[jf(l4)]
w(r) NEXT:[r(r)] PREV:[r("t")]
r("t") NEXT:[w(r)] PREV:[jf(l4)]
w(r) NEXT:[r(r)] PREV:[r("t")]
l5:
r(r) NEXT:[r(doSmth)] PREV:[jmp(l5), w(r)]
r(doSmth) NEXT:[r(doSmth(r))] PREV:[r(r)]
r(doSmth(r)) NEXT:[<END>] PREV:[r(doSmth)]
r(r) NEXT:[r(doSmth)] PREV:[jmp(l5), w(r)]
r(doSmth) NEXT:[r(doSmth(r))] PREV:[r(r)]
r(doSmth(r)) NEXT:[<END>] PREV:[r(doSmth)]
l1:
<END> NEXT:[<SINK>] PREV:[r(doSmth(r))]
<END> NEXT:[<SINK>] PREV:[r(doSmth(r))]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== t2 ==
fun t2(b: Boolean) {
@@ -61,8 +63,9 @@ fun t2(b: Boolean) {
}
---------------------
l0:
<START> NEXT:[r(3)] PREV:[]
r(3) NEXT:[w(i)] PREV:[<START>]
<START> NEXT:[v(val i = 3)] PREV:[]
v(val i = 3) NEXT:[r(3)] PREV:[<START>]
r(3) NEXT:[w(i)] PREV:[v(val i = 3)]
w(i) NEXT:[r(b)] PREV:[r(3)]
r(b) NEXT:[jf(l2)] PREV:[w(i)]
jf(l2) NEXT:[read (Unit), ret l1] PREV:[r(b)]
@@ -18,15 +18,16 @@ class C() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w(a)] PREV:[<START>]
w(a) NEXT:[<END>] PREV:[r(1)]
<START> NEXT:[v(val a: Int = 1)] PREV:[]
v(val a: Int = 1) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w(a)] PREV:[v(val a: Int = 1)]
w(a) NEXT:[<END>] PREV:[r(1)]
l1:
<END> NEXT:[<SINK>] PREV:[w(a)]
<END> NEXT:[<SINK>] PREV:[w(a)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== null ==
object {
@@ -44,15 +45,16 @@ object {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>]
w($x) NEXT:[<END>] PREV:[r(1)]
<START> NEXT:[v(val x : Int)] PREV:[]
v(val x : Int) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w($x)] PREV:[v(val x : Int)]
w($x) NEXT:[<END>] PREV:[r(1)]
l1:
<END> NEXT:[<SINK>] PREV:[w($x)]
<END> NEXT:[<SINK>] PREV:[w($x)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== O ==
object O {
@@ -63,15 +65,16 @@ object O {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>]
w($x) NEXT:[<END>] PREV:[r(1)]
<START> NEXT:[v(val x : Int)] PREV:[]
v(val x : Int) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w($x)] PREV:[v(val x : Int)]
w($x) NEXT:[<END>] PREV:[r(1)]
l1:
<END> NEXT:[<SINK>] PREV:[w($x)]
<END> NEXT:[<SINK>] PREV:[w($x)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== doSmth ==
fun doSmth(i: Int) {}
@@ -97,8 +100,15 @@ fun test1() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>]
<START> NEXT:[v(val a = object { val x : I..)] PREV:[]
v(val a = object {
val x : Int
{
$x = 1
}
}) NEXT:[v(val x : Int)] PREV:[<START>]
v(val x : Int) NEXT:[r(1)] PREV:[v(val a = object { val x : I..)]
r(1) NEXT:[w($x)] PREV:[v(val x : Int)]
w($x) NEXT:[r(object { val x : Int { $x ..)] PREV:[r(1)]
r(object {
val x : Int
@@ -123,21 +133,26 @@ fun test2() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w(b)] PREV:[<START>]
w(b) NEXT:[r(b)] PREV:[r(1)]
r(b) NEXT:[w(x)] PREV:[w(b)]
w(x) NEXT:[r(object { val x = b }) ] PREV:[r(b)]
r(object {
val x = b
}) NEXT:[w(a)] PREV:[w(x)]
w(a) NEXT:[<END>] PREV:[r(object { val x = b }) ]
<START> NEXT:[v(val b = 1)] PREV:[]
v(val b = 1) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w(b)] PREV:[v(val b = 1)]
w(b) NEXT:[v(val a = object { val x = b..)] PREV:[r(1)]
v(val a = object {
val x = b
}) NEXT:[v(val x = b)] PREV:[w(b)]
v(val x = b) NEXT:[r(b)] PREV:[v(val a = object { val x = b..)]
r(b) NEXT:[w(x)] PREV:[v(val x = b)]
w(x) NEXT:[r(object { val x = b }) ] PREV:[r(b)]
r(object {
val x = b
}) NEXT:[w(a)] PREV:[w(x)]
w(a) NEXT:[<END>] PREV:[r(object { val x = b }) ]
l1:
<END> NEXT:[<SINK>] PREV:[w(a)]
<END> NEXT:[<SINK>] PREV:[w(a)]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
== inner_bar ==
fun inner_bar() {
@@ -166,8 +181,15 @@ fun test3() {
}
---------------------
l0:
<START> NEXT:[jmp?(l2)] PREV:[]
jmp?(l2) NEXT:[r(object { val y : Int fun i..), d(fun inner_bar() { y = 10 }) ] PREV:[<START>]
<START> NEXT:[v(val a = object { val y : I..)] PREV:[]
v(val a = object {
val y : Int
fun inner_bar() {
y = 10
}
}) NEXT:[v(val y : Int)] PREV:[<START>]
v(val y : Int) NEXT:[jmp?(l2)] PREV:[v(val a = object { val y : I..)]
jmp?(l2) NEXT:[r(object { val y : Int fun i..), d(fun inner_bar() { y = 10 }) ] PREV:[v(val y : Int)]
d(fun inner_bar() {
y = 10
}) NEXT:[<SINK>] PREV:[jmp?(l2)]
@@ -227,8 +249,20 @@ fun test4() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>]
<START> NEXT:[v(val a = object { val x : I..)] PREV:[]
v(val a = object {
val x : Int
val y : Int
{
$x = 1
}
fun ggg() {
y = 10
}
}) NEXT:[v(val x : Int)] PREV:[<START>]
v(val x : Int) NEXT:[v(val y : Int)] PREV:[v(val a = object { val x : I..)]
v(val y : Int) NEXT:[r(1)] PREV:[v(val x : Int)]
r(1) NEXT:[w($x)] PREV:[v(val y : Int)]
w($x) NEXT:[jmp?(l2)] PREV:[r(1)]
jmp?(l2) NEXT:[r(object { val x : Int val y..), d(fun ggg() { y = 10 }) ] PREV:[w($x)]
d(fun ggg() {
@@ -312,8 +346,21 @@ fun test5() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w(x)] PREV:[<START>]
<START> NEXT:[v(val a = object { var x = 1..)] PREV:[]
v(val a = object {
var x = 1
{
$x = 2
}
fun foo() {
x = 3
}
fun bar() {
x = 4
}
}) NEXT:[v(var x = 1)] PREV:[<START>]
v(var x = 1) NEXT:[r(1)] PREV:[v(val a = object { var x = 1..)]
r(1) NEXT:[w(x)] PREV:[v(var x = 1)]
w(x) NEXT:[r(2)] PREV:[r(1)]
r(2) NEXT:[w($x)] PREV:[w(x)]
w($x) NEXT:[jmp?(l2)] PREV:[r(2)]
@@ -374,16 +421,17 @@ fun foo() {
}
---------------------
l0:
<START> NEXT:[r(1)] PREV:[]
r(1) NEXT:[w(b)] PREV:[<START>]
w(b) NEXT:[r(b)] PREV:[r(1)]
r(b) NEXT:[r(doSmth)] PREV:[w(b)]
r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)]
r(doSmth(b)) NEXT:[<END>] PREV:[r(doSmth)]
<START> NEXT:[v(val b : Int = 1)] PREV:[]
v(val b : Int = 1) NEXT:[r(1)] PREV:[<START>]
r(1) NEXT:[w(b)] PREV:[v(val b : Int = 1)]
w(b) NEXT:[r(b)] PREV:[r(1)]
r(b) NEXT:[r(doSmth)] PREV:[w(b)]
r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)]
r(doSmth(b)) NEXT:[<END>] PREV:[r(doSmth)]
l1:
<END> NEXT:[<SINK>] PREV:[r(doSmth(b))]
<END> NEXT:[<SINK>] PREV:[r(doSmth(b))]
error:
<ERROR> NEXT:[] PREV:[]
<ERROR> NEXT:[] PREV:[]
sink:
<SINK> NEXT:[] PREV:[<END>]
<SINK> NEXT:[] PREV:[<END>]
=====================
@@ -0,0 +1,32 @@
// KT-575 Cannot ++ a class object member
namespace kt575
class Creature() {
class object {
var numCreated : Int = 0
private set
}
object A {
var bbb : Int
{
$bbb = 1
}
}
class C() {
var ccc : Int
{
$ccc = 2
}
}
{
Creature.numCreated++ // Error
A.bbb++
C().ccc++
}
}