on master help sign in
Added SLIDE for tail calls
commitccc0f673b32cb323865cb761bf25f30cbdbc5763 authorEdwin Brady <eb@cs.st-andrews.ac.uk> dateThu 30 Aug 2012, 17:26 (14 years ago) parent204d938
3 files changed+24−9
iif/ctest.c+16−9 rts/closure.c+7 rts/closure.h+1
iif/ctest.c+16−9
@@ -7,7 +7,7 @@ void plus(VM* vm, VAL* oldbase) {
77
88 switch(TAG(LOC(0))) {
99 case 0:
10−// PROJECT(vm, LOC(0), 2, 0);
10+ PROJECT(vm, LOC(0), 2, 0);
1111 RVAL = LOC(1);
1212 TOPBASE(0);
1313 REBASE;
@@ -36,7 +36,7 @@ void natToInt(VM* vm, VAL* oldbase) {
3636
3737 switch(TAG(LOC(0))) {
3838 case 0:
39− // PROJECT(vm, LOC(0), 2, 0);
39+ PROJECT(vm, LOC(0), 2, 0);
4040 RVAL = MKINT(0);
4141 TOPBASE(0);
4242 REBASE;
@@ -57,10 +57,8 @@ void natToInt(VM* vm, VAL* oldbase) {
5757 }
5858}
5959
60−int main() {
60+int do_main(VM* vm, VAL* oldbase) {
6161 INITFRAME;
62− VM* vm = init_vm(100,100);
63−
6462 RESERVE(2);
6563 ADDTOP(2);
6664
@@ -87,13 +85,22 @@ int main() {
8785
8886 RESERVE(1);
8987 TOP(0) = LOC(0);
90− STOREOLD;
88+ SLIDE(vm, 1);
89+ TOPBASE(1);
90+ TAILCALL(natToInt);
91+/* STOREOLD;
9192 BASETOP(0);
9293 ADDTOP(1);
9394 CALL(natToInt);
94− LOC(0) = RVAL;
95+ TOPBASE(0);
96+ REBASE; */
97+}
98+
99+int main() {
100+ VM* vm = init_vm(100,100);
95101
96− printf("%ld\n", GETINT(LOC(0)));
102+ do_main(vm, NULL);
103+ printf("%ld\n", GETINT(RVAL));
97104
98− printf("%d %d\n", vm->valstack, vm->valstack_base);
105+ printf("%d %d %d\n", vm->valstack, vm->valstack_base, vm->valstack_top);
99106}
rts/closure.c+7
@@ -88,6 +88,13 @@ void PROJECT(VM* vm, VAL r, int loc, int arity) {
8888 }
8989}
9090
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+
9198void dumpVal(VAL v) {
9299 int i;
93100 switch(v->ty) {
rts/closure.h+1
@@ -100,6 +100,7 @@ VAL MKSTR(VM* vm, char* str);
100100VAL MKCON(VM* vm, int tag, int arity, ...);
101101
102102void PROJECT(VM* vm, VAL r, int loc, int arity);
103+void SLIDE(VM* vm, int args);
103104
104105void dumpVal(VAL r);
105106