Pseudocode: Generate instructions for superclass constructor calls. Consume value of delegate expression in the by-clause

This commit is contained in:
Alexey Sedunov
2014-06-26 20:16:08 +04:00
parent 523beab902
commit 1c75a5f642
17 changed files with 248 additions and 48 deletions
@@ -83,16 +83,18 @@ L0:
mark(object: A(obj) { { val x = obj } fun foo() { val y = obj } }) INIT: in: {obj=D} out: {obj=D}
magic(obj) -> <v0>
r(obj|<v0>) -> <v1>
mark(A(obj))
call(A(obj), <init>|<v1>) -> <v2>
2 mark({ val x = obj })
v(val x = obj) INIT: in: {obj=D} out: {obj=D, x=D}
magic(obj) -> <v2> INIT: in: {obj=D, x=D} out: {obj=D, x=D}
r(obj|<v2>) -> <v3>
w(x|<v3>) INIT: in: {obj=D, x=D} out: {obj=D, x=ID}
magic(obj) -> <v3> INIT: in: {obj=D, x=D} out: {obj=D, x=D}
r(obj|<v3>) -> <v4>
w(x|<v4>) INIT: in: {obj=D, x=D} out: {obj=D, x=ID}
1 jmp?(L2) INIT: in: {obj=D} out: {obj=D}
d(fun foo() { val y = obj }) USE: in: {obj=READ} out: {obj=READ}
L2:
r(object: A(obj) { { val x = obj } fun foo() { val y = obj } }) -> <v4>
w(obj|<v4>) INIT: in: {obj=D} out: {obj=ID}
r(object: A(obj) { { val x = obj } fun foo() { val y = obj } }) -> <v5>
w(obj|<v5>) INIT: in: {obj=D} out: {obj=ID}
L1:
<END> INIT: in: {obj=ID} out: {obj=ID}
error:
@@ -41,10 +41,11 @@ class TestObjectLiteral {
}
---------------------
<v0>: TestObjectLiteral NEW: magic(obj) -> <v0>
<v2>: TestObjectLiteral NEW: magic(obj) -> <v2>
obj <v1>: * NEW: r(obj|<v0>) -> <v1>
obj <v3>: {<: A} NEW: r(obj|<v2>) -> <v3>
object: A(obj) { { val x = obj } fun foo() { val y = obj } } <v4>: {<: A} NEW: r(object: A(obj) { { val x = obj } fun foo() { val y = obj } }) -> <v4>
<v3>: TestObjectLiteral NEW: magic(obj) -> <v3>
obj <v1>: {<: A} NEW: r(obj|<v0>) -> <v1>
A(obj) <v2>: * NEW: call(A(obj), <init>|<v1>) -> <v2>
obj <v4>: {<: A} NEW: r(obj|<v3>) -> <v4>
object: A(obj) { { val x = obj } fun foo() { val y = obj } } <v5>: {<: A} NEW: r(object: A(obj) { { val x = obj } fun foo() { val y = obj } }) -> <v5>
=====================
== foo ==
fun foo() {
@@ -63,4 +64,4 @@ class TestOther {
x <v1>: Int NEW: r(x|<v0>) -> <v1>
1 <v2>: Int NEW: r(1) -> <v2>
x + 1 <v3>: Int NEW: call(x + 1, plus|<v1>, <v2>) -> <v3>
=====================
=====================