Pseudocode: Generate correct values for postfix increment/decrement

This commit is contained in:
Alexey Sedunov
2014-06-23 13:53:08 +04:00
parent 7c837909d8
commit 50228fa085
8 changed files with 123 additions and 4 deletions
@@ -585,6 +585,9 @@ public class JetControlFlowProcessor {
if (incrementOrDecrement) {
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression);
if (expression instanceof JetPostfixExpression) {
copyValue(baseExpression, expression);
}
}
}
+2 -2
View File
@@ -6,6 +6,6 @@ fun foo(a: Array<Int>) {
a <v5> NEW()
0 <v6> NEW()
a[0] <v3> NEW(<v1>, <v2>)
a[0]++ <v7> NEW(<v5>, <v6>, <v4>)
{ a[0]++ } <v7> COPY
a[0]++ <v3> COPY
{ a[0]++ } <v3> COPY
=====================
@@ -6,6 +6,6 @@ fun foo() {
---------------------
1 <v0> NEW()
i <v1> NEW()
i++ <v2> NEW(<v1>)
{ var i = 1 i++ } <v2> COPY
i++ <v1> COPY
{ var i = 1 i++ } <v1> COPY
=====================
@@ -0,0 +1,65 @@
== bar ==
fun bar(n: Int) {
}
---------------------
L0:
1 <START>
v(n: Int)
magic(n: Int) -> <v0>
w(n|<v0>)
2 mark({ })
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo() {
var a = 1
bar(a++)
bar(a--)
bar(++a)
bar(--a)
}
---------------------
L0:
1 <START>
2 mark({ var a = 1 bar(a++) bar(a--) bar(++a) bar(--a) })
v(var a = 1)
r(1) -> <v0>
w(a|<v0>)
r(a) -> <v1>
mark(a++)
call(++, inc|<v1>) -> <v2>
w(a|<v2>)
mark(bar(a++))
call(bar, bar|<v1>) -> <v3>
r(a) -> <v4>
mark(a--)
call(--, dec|<v4>) -> <v5>
w(a|<v5>)
mark(bar(a--))
call(bar, bar|<v4>) -> <v6>
r(a) -> <v7>
mark(++a)
call(++, inc|<v7>) -> <v8>
w(a|<v8>)
mark(bar(++a))
call(bar, bar|<v8>) -> <v9>
r(a) -> <v10>
mark(--a)
call(--, dec|<v10>) -> <v11>
w(a|<v11>)
mark(bar(--a))
call(bar, bar|<v11>) -> <v12>
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
@@ -0,0 +1,11 @@
fun bar(n: Int) {
}
fun foo() {
var a = 1
bar(a++)
bar(a--)
bar(++a)
bar(--a)
}
@@ -0,0 +1,30 @@
== bar ==
fun bar(n: Int) {
}
---------------------
=====================
== foo ==
fun foo() {
var a = 1
bar(a++)
bar(a--)
bar(++a)
bar(--a)
}
---------------------
1 <v0> NEW()
a <v1> NEW()
a++ <v1> COPY
bar(a++) <v3> NEW(<v1>)
a <v4> NEW()
a-- <v4> COPY
bar(a--) <v6> NEW(<v4>)
a <v7> NEW()
++a <v8> NEW(<v7>)
bar(++a) <v9> NEW(<v8>)
a <v10> NEW()
--a <v11> NEW(<v10>)
bar(--a) <v12> NEW(<v11>)
{ var a = 1 bar(a++) bar(a--) bar(++a) bar(--a) } <v12> COPY
=====================
@@ -359,6 +359,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
doTest("compiler/testData/cfg/expressions/expressionAsFunction.kt");
}
@TestMetadata("incdec.kt")
public void testIncdec() throws Exception {
doTest("compiler/testData/cfg/expressions/incdec.kt");
}
@TestMetadata("LazyBooleans.kt")
public void testLazyBooleans() throws Exception {
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");
@@ -361,6 +361,11 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
doTest("compiler/testData/cfg/expressions/expressionAsFunction.kt");
}
@TestMetadata("incdec.kt")
public void testIncdec() throws Exception {
doTest("compiler/testData/cfg/expressions/incdec.kt");
}
@TestMetadata("LazyBooleans.kt")
public void testLazyBooleans() throws Exception {
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");