on master help sign in
Added SLIDE for tail calls
ccc0f67Edwin Brady
iif/ctest.c+16−9
@@ -7,7 +7,7 @@ void plus(VM* vm, VAL* oldbase) {
7
7
8 switch(TAG(LOC(0))) {
8 switch(TAG(LOC(0))) {
9 case 0:
9 case 0:
10−// PROJECT(vm, LOC(0), 2, 0);
10+ PROJECT(vm, LOC(0), 2, 0);
11 RVAL = LOC(1);
11 RVAL = LOC(1);
12 TOPBASE(0);
12 TOPBASE(0);
13 REBASE;
13 REBASE;
@@ -36,7 +36,7 @@ void natToInt(VM* vm, VAL* oldbase) {
36
36
37 switch(TAG(LOC(0))) {
37 switch(TAG(LOC(0))) {
38 case 0:
38 case 0:
39− // PROJECT(vm, LOC(0), 2, 0);
39+ PROJECT(vm, LOC(0), 2, 0);
40 RVAL = MKINT(0);
40 RVAL = MKINT(0);
41 TOPBASE(0);
41 TOPBASE(0);
42 REBASE;
42 REBASE;
@@ -57,10 +57,8 @@ void natToInt(VM* vm, VAL* oldbase) {
57 }
57 }
58}
58}
59
59
60−int main() {
60+int do_main(VM* vm, VAL* oldbase) {
61 INITFRAME;
61 INITFRAME;
62− VM* vm = init_vm(100,100);
63−
64 RESERVE(2);
62 RESERVE(2);
65 ADDTOP(2);
63 ADDTOP(2);
66
64
@@ -87,13 +85,22 @@ int main() {
87
85
88 RESERVE(1);
86 RESERVE(1);
89 TOP(0) = LOC(0);
87 TOP(0) = LOC(0);
88+ SLIDE(vm, 1);
89+ TOPBASE(1);
90+ TAILCALL(natToInt);
90− STOREOLD;
91+/* STOREOLD;
91 BASETOP(0);
92 BASETOP(0);
92 ADDTOP(1);
93 ADDTOP(1);
93 CALL(natToInt);
94 CALL(natToInt);
94− LOC(0) = RVAL;
95+ TOPBASE(0);
96+ REBASE; */
97+}
98+
99+int main() {
100+ VM* vm = init_vm(100,100);
95
101
102+ do_main(vm, NULL);
96− printf("%ld\n", GETINT(LOC(0)));
103+ printf("%ld\n", GETINT(RVAL));
97
104
98− printf("%d %d\n", vm->valstack, vm->valstack_base);
105+ printf("%d %d %d\n", vm->valstack, vm->valstack_base, vm->valstack_top);
99}
106}
rts/closure.c+7
@@ -88,6 +88,13 @@ void PROJECT(VM* vm, VAL r, int loc, int arity) {
88 }
88 }
89}
89}
90
90
91+void SLIDE(VM* vm, int args) {
92+ int i;
93+ for(i = 0; i < args; ++i) {
94+ LOC(i) = TOP(i);
95+ }
96+}
97+
91void dumpVal(VAL v) {
98void dumpVal(VAL v) {
92 int i;
99 int i;
93 switch(v->ty) {
100 switch(v->ty) {
rts/closure.h+1
@@ -100,6 +100,7 @@ VAL MKSTR(VM* vm, char* str);
100VAL MKCON(VM* vm, int tag, int arity, ...);
100VAL MKCON(VM* vm, int tag, int arity, ...);
101
101
102void PROJECT(VM* vm, VAL r, int loc, int arity);
102void PROJECT(VM* vm, VAL r, int loc, int arity);
103+void SLIDE(VM* vm, int args);
103
104
104void dumpVal(VAL r);
105void dumpVal(VAL r);
105
106