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
@@ -59,6 +59,9 @@ public interface JetControlFlowBuilder {
void write(@NotNull JetElement assignment, @NotNull JetElement lValue); void write(@NotNull JetElement assignment, @NotNull JetElement lValue);
void declare(@NotNull JetParameter parameter);
void declare(@NotNull JetProperty property);
// Other // Other
void unsupported(JetElement element); void unsupported(JetElement element);
} }
@@ -177,4 +177,16 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
assert builder != null; assert builder != null;
builder.write(assignment, lValue); 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(); JetParameter catchParameter = catchClause.getCatchParameter();
if (catchParameter != null) { if (catchParameter != null) {
builder.declare(catchParameter);
builder.write(catchParameter, catchParameter); builder.write(catchParameter, catchParameter);
} }
JetExpression catchBody = catchClause.getCatchBody(); JetExpression catchBody = catchClause.getCatchBody();
@@ -458,6 +459,7 @@ public class JetControlFlowProcessor {
} }
JetParameter loopParameter = expression.getLoopParameter(); JetParameter loopParameter = expression.getLoopParameter();
if (loopParameter != null) { if (loopParameter != null) {
builder.declare(loopParameter);
builder.write(loopParameter, loopParameter); builder.write(loopParameter, loopParameter);
} }
// TODO : primitive cases // TODO : primitive cases
@@ -669,6 +671,7 @@ public class JetControlFlowProcessor {
@Override @Override
public void visitProperty(JetProperty property) { public void visitProperty(JetProperty property) {
builder.declare(property);
JetExpression initializer = property.getInitializer(); JetExpression initializer = property.getInitializer();
if (initializer != null) { if (initializer != null) {
value(initializer, false); 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 @Override
public void visitTupleExpression(JetTupleExpression expression) { public void visitTupleExpression(JetTupleExpression expression) {
for (JetExpression entry : expression.getEntries()) { for (JetExpression entry : expression.getEntries()) {
@@ -838,11 +833,6 @@ public class JetControlFlowProcessor {
value(declaration, inCondition); value(declaration, inCondition);
} }
} }
for (JetProperty property : properties) {
for (JetPropertyAccessor accessor : property.getAccessors()) {
value(accessor, inCondition);
}
}
} }
@Override @Override
@@ -855,11 +845,4 @@ public class JetControlFlowProcessor {
builder.unsupported(element); 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) { private Collection<VariableDescriptor> collectDeclaredVariables(JetElement element) {
final Set<VariableDescriptor> declaredVariables = Sets.newHashSet(); final Pseudocode pseudocode = pseudocodeMap.get(element);
element.accept(new JetTreeVisitor<Void>() { assert pseudocode != null;
@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);
}
final Set<VariableDescriptor> declaredVariables = Sets.newHashSet();
JetControlFlowGraphTraverser.<Void>create(pseudocode, false).traverseAndAnalyzeInstructionGraph(new JetControlFlowGraphTraverser.InstructionDataAnalyzeStrategy<Void>() {
@Override @Override
public Void visitForExpression(JetForExpression expression, Void data) { public void execute(Instruction instruction, @Nullable Void enterData, @Nullable Void exitData) {
JetParameter loopParameter = expression.getLoopParameter(); if (instruction instanceof VariableDeclarationInstruction) {
if (loopParameter != null) { JetDeclaration variableDeclarationElement = ((VariableDeclarationInstruction) instruction).getVariableDeclarationElement();
DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, loopParameter); DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement);
if (descriptor != null) { if (descriptor != null) {
assert descriptor instanceof VariableDescriptor; assert descriptor instanceof VariableDescriptor;
declaredVariables.add((VariableDescriptor) descriptor); declaredVariables.add((VariableDescriptor) descriptor);
} }
} }
return super.visitForExpression(expression, data);
} }
}, null); });
return declaredVariables; return declaredVariables;
} }
@@ -12,6 +12,10 @@ public class InstructionVisitor {
visitInstructionWithNext(instruction); visitInstructionWithNext(instruction);
} }
public void visitVariableDeclarationInstruction(VariableDeclarationInstruction instruction) {
visitInstructionWithNext(instruction);
}
public void visitUnconditionalJump(UnconditionalJumpInstruction instruction) { public void visitUnconditionalJump(UnconditionalJumpInstruction instruction) {
visitJump(instruction); visitJump(instruction);
} }
@@ -216,6 +216,16 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd
add(new WriteValueInstruction(assignment, lValue)); 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 @Override
public void read(@NotNull JetExpression expression) { public void read(@NotNull JetExpression expression) {
add(new ReadValueInstruction(expression)); add(new ReadValueInstruction(expression));
@@ -8,7 +8,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
/** /**
* @author abreslav * @author svtk
*/ */
public class LocalDeclarationInstruction extends InstructionWithNext { 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.getGetter()
: propertyDescriptor.getSetter(); : propertyDescriptor.getSetter();
assert accessorDescriptor != null; 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 == == AnonymousInitializers ==
class AnonymousInitializers() { class AnonymousInitializers() {
val k = 34 val k = 34
@@ -29,26 +16,31 @@ class AnonymousInitializers() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(34)] PREV:[] <START> NEXT:[v(val k = 34)] PREV:[]
r(34) NEXT:[w(k)] PREV:[<START>] v(val k = 34) NEXT:[r(34)] PREV:[<START>]
w(k) NEXT:[r(12)] PREV:[r(34)] r(34) NEXT:[w(k)] PREV:[v(val k = 34)]
r(12) NEXT:[w($i)] PREV:[w(k)] w(k) NEXT:[v(val i: Int)] PREV:[r(34)]
w($i) NEXT:[r(13)] PREV:[r(12)] v(val i: Int) NEXT:[r(12)] PREV:[w(k)]
r(13) NEXT:[w($i)] PREV:[w($i)] r(12) NEXT:[w($i)] PREV:[v(val i: Int)]
w($i) NEXT:[jmp?(l2)] PREV:[r(13)] w($i) NEXT:[v(val j: Int get() = 20) ] PREV:[r(12)]
jmp?(l2) NEXT:[<END>, d(get() = 20)] PREV:[w($i)] v(val j: Int
d(get() = 20) NEXT:[<SINK>] PREV:[jmp?(l2)] 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: l1:
l2: <END> NEXT:[<SINK>] PREV:[w($i)]
<END> NEXT:[<SINK>] PREV:[jmp?(l2)]
error: error:
<ERROR> NEXT:[] PREV:[] <ERROR> NEXT:[] PREV:[]
sink: sink:
<SINK> NEXT:[] PREV:[d(get() = 20), <END>] <SINK> NEXT:[] PREV:[<END>]
l3: =====================
== get_j ==
get() = 20
---------------------
l0:
<START> NEXT:[r(20)] PREV:[] <START> NEXT:[r(20)] PREV:[]
r(20) NEXT:[<END>] PREV:[<START>] r(20) NEXT:[<END>] PREV:[<START>]
l4: l1:
<END> NEXT:[<SINK>] PREV:[r(20)] <END> NEXT:[<SINK>] PREV:[r(20)]
error: error:
<ERROR> NEXT:[] PREV:[] <ERROR> NEXT:[] PREV:[]
@@ -10,8 +10,9 @@ fun foo() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(Array)] PREV:[] <START> NEXT:[v(val a = Array<Int>)] PREV:[]
r(Array) NEXT:[r(Array<Int>)] PREV:[<START>] 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)] r(Array<Int>) NEXT:[w(a)] PREV:[r(Array)]
w(a) NEXT:[r(3)] PREV:[r(Array<Int>)] w(a) NEXT:[r(3)] PREV:[r(Array<Int>)]
r(3) NEXT:[r(4)] PREV:[w(a)] r(3) NEXT:[r(4)] PREV:[w(a)]
+15 -10
View File
@@ -4,9 +4,10 @@ class Test {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[<END>] PREV:[] <START> NEXT:[v(var x : Int;)] PREV:[]
v(var x : Int;) NEXT:[<END>] PREV:[<START>]
l1: l1:
<END> NEXT:[<SINK>] PREV:[<START>] <END> NEXT:[<SINK>] PREV:[v(var x : Int;)]
error: error:
<ERROR> NEXT:[] PREV:[] <ERROR> NEXT:[] PREV:[]
sink: sink:
@@ -28,8 +29,9 @@ fun assignments() : Unit {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(var x = 1)] PREV:[]
r(1) NEXT:[w(x)] PREV:[<START>] 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)] w(x) NEXT:[r(2)] PREV:[r(1)]
r(2) NEXT:[w(x)] PREV:[w(x)] r(2) NEXT:[w(x)] PREV:[w(x)]
w(x) NEXT:[r(x)] PREV:[r(2)] w(x) NEXT:[r(x)] PREV:[r(2)]
@@ -44,20 +46,23 @@ l0:
l2: l2:
r(2) NEXT:[w(x)] PREV:[jf(l2)] r(2) NEXT:[w(x)] PREV:[jf(l2)]
l3: l3:
w(x) NEXT:[r(true)] PREV:[jmp(l3), r(2)] w(x) NEXT:[v(val y = true && false)] PREV:[jmp(l3), r(2)]
r(true) NEXT:[jf(l4)] PREV:[w(x)] 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)] jf(l4) NEXT:[r(true && false), r(false)] PREV:[r(true)]
r(false) NEXT:[r(true && false)] PREV:[jf(l4)] r(false) NEXT:[r(true && false)] PREV:[jf(l4)]
l4: l4:
r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)] r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)]
w(y) NEXT:[r(false)] PREV:[r(true && false)] w(y) NEXT:[v(val z = false && true)] PREV:[r(true && false)]
r(false) NEXT:[jf(l5)] PREV:[w(y)] 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)] jf(l5) NEXT:[r(false && true), r(true)] PREV:[r(false)]
r(true) NEXT:[r(false && true)] PREV:[jf(l5)] r(true) NEXT:[r(false && true)] PREV:[jf(l5)]
l5: l5:
r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)] r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)]
w(z) NEXT:[r(Test)] PREV:[r(false && true)] w(z) NEXT:[v(val t = Test())] PREV:[r(false && true)]
r(Test) NEXT:[r(Test())] PREV:[w(z)] 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)] r(Test()) NEXT:[w(t)] PREV:[r(Test)]
w(t) NEXT:[r(1)] PREV:[r(Test())] w(t) NEXT:[r(1)] PREV:[r(Test())]
r(1) NEXT:[r(t)] PREV:[w(t)] r(1) NEXT:[r(t)] PREV:[w(t)]
+21 -14
View File
@@ -392,8 +392,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>] r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)] r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)] r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)] r(1..a) NEXT:[v(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3: l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4: l4:
@@ -442,8 +443,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>] r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)] r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)] r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)] r(1..a) NEXT:[v(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3: l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4: l4:
@@ -491,8 +493,9 @@ l0:
r(1) NEXT:[r(a)] PREV:[<START>] r(1) NEXT:[r(a)] PREV:[<START>]
r(a) NEXT:[r(..)] PREV:[r(1)] r(a) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..a)] PREV:[r(a)] r(..) NEXT:[r(1..a)] PREV:[r(a)]
r(1..a) NEXT:[w(i)] PREV:[r(..)] r(1..a) NEXT:[v(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] v(i) NEXT:[w(i)] PREV:[r(1..a)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3: l3:
jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)]
l4: l4:
@@ -598,8 +601,9 @@ l0:
l3: l3:
R jmp(l4) NEXT:[r(3)] PREV:[] R jmp(l4) NEXT:[r(3)] PREV:[]
l2: l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()] 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(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
@@ -634,8 +638,9 @@ l0:
l3: l3:
R jmp(l4) NEXT:[<END>] PREV:[] R jmp(l4) NEXT:[<END>] PREV:[]
l2: l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()] 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(2) NEXT:[r(doSmth)] PREV:[w(e)]
r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)]
r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)]
@@ -673,8 +678,9 @@ l0:
l3: l3:
R jmp(l4) NEXT:[r(3)] PREV:[] R jmp(l4) NEXT:[r(3)] PREV:[]
l2: l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()] 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(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)] r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
@@ -715,8 +721,9 @@ l0:
l3: l3:
jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))] jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))]
l2: l2:
jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)]
w(e) NEXT:[r(2)] PREV:[jmp?()] 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(2) NEXT:[r(3)] PREV:[w(e)]
r(3) NEXT:[r(doSmth)] PREV:[r(2)] r(3) NEXT:[r(doSmth)] PREV:[r(2)]
r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)]
+3 -2
View File
@@ -10,8 +10,9 @@ l0:
r(1) NEXT:[r(2)] PREV:[<START>] r(1) NEXT:[r(2)] PREV:[<START>]
r(2) NEXT:[r(..)] PREV:[r(1)] r(2) NEXT:[r(..)] PREV:[r(1)]
r(..) NEXT:[r(1..2)] PREV:[r(2)] r(..) NEXT:[r(1..2)] PREV:[r(2)]
r(1..2) NEXT:[w(i)] PREV:[r(..)] r(1..2) NEXT:[v(i)] PREV:[r(..)]
w(i) NEXT:[jmp?(l2)] PREV:[r(1..2)] v(i) NEXT:[w(i)] PREV:[r(1..2)]
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
l3: l3:
jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)] jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)]
l4: l4:
+9 -6
View File
@@ -17,8 +17,9 @@ fun t1(b: Boolean) {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(b)] PREV:[] <START> NEXT:[v(var u: String)] PREV:[]
r(b) NEXT:[jf(l2)] PREV:[<START>] 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)] jf(l2) NEXT:[read (Unit), r("s")] PREV:[r(b)]
r("s") NEXT:[w(u)] PREV:[jf(l2)] r("s") NEXT:[w(u)] PREV:[jf(l2)]
w(u) NEXT:[jmp(l3)] PREV:[r("s")] w(u) NEXT:[jmp(l3)] PREV:[r("s")]
@@ -28,8 +29,9 @@ l2:
l3: l3:
r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)] r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)]
r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)] r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)]
r(doSmth(u)) NEXT:[r(b)] PREV:[r(doSmth)] r(doSmth(u)) NEXT:[v(var r: String)] PREV:[r(doSmth)]
r(b) NEXT:[jf(l4)] PREV:[r(doSmth(u))] 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)] jf(l4) NEXT:[r("t"), r("s")] PREV:[r(b)]
r("s") NEXT:[w(r)] PREV:[jf(l4)] r("s") NEXT:[w(r)] PREV:[jf(l4)]
w(r) NEXT:[jmp(l5)] PREV:[r("s")] w(r) NEXT:[jmp(l5)] PREV:[r("s")]
@@ -61,8 +63,9 @@ fun t2(b: Boolean) {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(3)] PREV:[] <START> NEXT:[v(val i = 3)] PREV:[]
r(3) NEXT:[w(i)] PREV:[<START>] 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)] w(i) NEXT:[r(b)] PREV:[r(3)]
r(b) NEXT:[jf(l2)] PREV:[w(i)] r(b) NEXT:[jf(l2)] PREV:[w(i)]
jf(l2) NEXT:[read (Unit), ret l1] PREV:[r(b)] jf(l2) NEXT:[read (Unit), ret l1] PREV:[r(b)]
@@ -18,8 +18,9 @@ class C() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val a: Int = 1)] PREV:[]
r(1) NEXT:[w(a)] PREV:[<START>] 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)] w(a) NEXT:[<END>] PREV:[r(1)]
l1: l1:
<END> NEXT:[<SINK>] PREV:[w(a)] <END> NEXT:[<SINK>] PREV:[w(a)]
@@ -44,8 +45,9 @@ object {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val x : Int)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>] 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)] w($x) NEXT:[<END>] PREV:[r(1)]
l1: l1:
<END> NEXT:[<SINK>] PREV:[w($x)] <END> NEXT:[<SINK>] PREV:[w($x)]
@@ -63,8 +65,9 @@ object O {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val x : Int)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>] 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)] w($x) NEXT:[<END>] PREV:[r(1)]
l1: l1:
<END> NEXT:[<SINK>] PREV:[w($x)] <END> NEXT:[<SINK>] PREV:[w($x)]
@@ -97,8 +100,15 @@ fun test1() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val a = object { val x : I..)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>] 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)] w($x) NEXT:[r(object { val x : Int { $x ..)] PREV:[r(1)]
r(object { r(object {
val x : Int val x : Int
@@ -123,10 +133,15 @@ fun test2() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val b = 1)] PREV:[]
r(1) NEXT:[w(b)] PREV:[<START>] v(val b = 1) NEXT:[r(1)] PREV:[<START>]
w(b) NEXT:[r(b)] PREV:[r(1)] r(1) NEXT:[w(b)] PREV:[v(val b = 1)]
r(b) NEXT:[w(x)] PREV:[w(b)] 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)] w(x) NEXT:[r(object { val x = b }) ] PREV:[r(b)]
r(object { r(object {
val x = b val x = b
@@ -166,8 +181,15 @@ fun test3() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[jmp?(l2)] PREV:[] <START> NEXT:[v(val a = object { val y : I..)] PREV:[]
jmp?(l2) NEXT:[r(object { val y : Int fun i..), d(fun inner_bar() { y = 10 }) ] PREV:[<START>] 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() { d(fun inner_bar() {
y = 10 y = 10
}) NEXT:[<SINK>] PREV:[jmp?(l2)] }) NEXT:[<SINK>] PREV:[jmp?(l2)]
@@ -227,8 +249,20 @@ fun test4() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val a = object { val x : I..)] PREV:[]
r(1) NEXT:[w($x)] PREV:[<START>] 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)] 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)] jmp?(l2) NEXT:[r(object { val x : Int val y..), d(fun ggg() { y = 10 }) ] PREV:[w($x)]
d(fun ggg() { d(fun ggg() {
@@ -312,8 +346,21 @@ fun test5() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val a = object { var x = 1..)] PREV:[]
r(1) NEXT:[w(x)] PREV:[<START>] 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)] w(x) NEXT:[r(2)] PREV:[r(1)]
r(2) NEXT:[w($x)] PREV:[w(x)] r(2) NEXT:[w($x)] PREV:[w(x)]
w($x) NEXT:[jmp?(l2)] PREV:[r(2)] w($x) NEXT:[jmp?(l2)] PREV:[r(2)]
@@ -374,8 +421,9 @@ fun foo() {
} }
--------------------- ---------------------
l0: l0:
<START> NEXT:[r(1)] PREV:[] <START> NEXT:[v(val b : Int = 1)] PREV:[]
r(1) NEXT:[w(b)] PREV:[<START>] 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)] w(b) NEXT:[r(b)] PREV:[r(1)]
r(b) NEXT:[r(doSmth)] PREV:[w(b)] r(b) NEXT:[r(doSmth)] PREV:[w(b)]
r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)] r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)]
@@ -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++
}
}