Pseudocode: Generate correct values for postfix increment/decrement
This commit is contained in:
@@ -585,6 +585,9 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
if (incrementOrDecrement) {
|
if (incrementOrDecrement) {
|
||||||
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression);
|
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression);
|
||||||
|
if (expression instanceof JetPostfixExpression) {
|
||||||
|
copyValue(baseExpression, expression);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ fun foo(a: Array<Int>) {
|
|||||||
a <v5> NEW()
|
a <v5> NEW()
|
||||||
0 <v6> NEW()
|
0 <v6> NEW()
|
||||||
a[0] <v3> NEW(<v1>, <v2>)
|
a[0] <v3> NEW(<v1>, <v2>)
|
||||||
a[0]++ <v7> NEW(<v5>, <v6>, <v4>)
|
a[0]++ <v3> COPY
|
||||||
{ a[0]++ } <v7> COPY
|
{ a[0]++ } <v3> COPY
|
||||||
=====================
|
=====================
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ fun foo() {
|
|||||||
---------------------
|
---------------------
|
||||||
1 <v0> NEW()
|
1 <v0> NEW()
|
||||||
i <v1> NEW()
|
i <v1> NEW()
|
||||||
i++ <v2> NEW(<v1>)
|
i++ <v1> COPY
|
||||||
{ var i = 1 i++ } <v2> 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");
|
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")
|
@TestMetadata("LazyBooleans.kt")
|
||||||
public void testLazyBooleans() throws Exception {
|
public void testLazyBooleans() throws Exception {
|
||||||
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");
|
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");
|
||||||
|
|||||||
@@ -361,6 +361,11 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
|
|||||||
doTest("compiler/testData/cfg/expressions/expressionAsFunction.kt");
|
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")
|
@TestMetadata("LazyBooleans.kt")
|
||||||
public void testLazyBooleans() throws Exception {
|
public void testLazyBooleans() throws Exception {
|
||||||
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");
|
doTest("compiler/testData/cfg/expressions/LazyBooleans.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user