Mercurial > hg > CbC > old > device
changeset 17:fdbf2fbc8140
*** empty log message ***
author | kono |
---|---|
date | Thu, 28 Jun 2001 14:33:44 +0900 |
parents | ca0bce3b4810 |
children | df7fa8cee67b |
files | test/fact0.c test/test1.c test/tmp8.c |
diffstat | 3 files changed, 120 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/test/fact0.c Mon Jan 17 16:08:16 2000 +0900 +++ b/test/fact0.c Thu Jun 28 14:33:44 2001 +0900 @@ -13,5 +13,5 @@ { if (i==n) return j; - fact(i+1,j*i,n); + /* return */ fact(i+1,j*i,n); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/test1.c Thu Jun 28 14:33:44 2001 +0900 @@ -0,0 +1,112 @@ +#include "stdio.h" + + typedef void *stack; + + struct cont_save { /* General Return Continuation */ + code (*ret)(); + }; + +/* + code g(int,void *); + code f_g0(int ,int ,void *); + code f_g1(int,void *); + */ + + struct f_g0_save { /* Specialized Return Continuation */ + code (*ret)(); + int ii,kk,jj; + }; + + code g(int i,void *sp) { + goto (* ((struct cont_save *)sp)->ret)(i+4,sp); + } + + code f_g1(int j,void *sp) { /* Continuation */ + int k; + struct f_g0_save *c; + + c = sp; + k = c->kk; + sp += sizeof(struct f_g0_save); + goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp); + } + + code f(int i,void *sp) { + int k,j; + struct f_g0_save *c; + printf("f 0 sp: %x\n",sp); + + k = 3+i; + + printf("f 1 sp: %x\n",sp); + sp -= sizeof(struct f_g0_save); + printf("f 2 sp: %x\n",sp); + c = sp; + c->kk = k; + c->ii = i; + c->jj = j; + c->ret = f_g1; + goto g(i,sp); + } + + +void *stack0; + + +struct f0_save { /* Specialized Return Continuation */ + code (*ret)(); + code (*exit1)(); + void *exit1env; + int jj; +}; + +code f0(int i,int j,code(*exit2)(), void *exit2env,void *sp) +{ + struct f0_save *c; + printf("f0 1 sp: %x\n",sp); + sp -= sizeof(struct f0_save); + printf("f0 2 sp: %x\n",sp); + c = sp; + c->jj = j; + c->exit1 = exit2; + c->exit1env = exit2env; + c->ret = f1; + printf("f0 3 sp: %x\n",sp); + goto f(i,sp); +} + +code f1(int i,void *sp) { + int j; + int *exit2env; + code (*exit2)(); + struct f0_save *c; + + c = sp; + j = c->jj; + exit2 = c->exit1; + exit2env = c->exit1env; + + sp += sizeof(struct f0_save); + goto print(i,j,exit2,exit2env); +} + +int main( int ac, char *av[]) +{ + int i,j; + int *sp; + + i = atoi(av[1]); + stack0 = ((char *)malloc(1024)+1024); + sp = stack0; + j = i; + + printf("sp: %x\n",sp); + goto f0(i,j,return,environment,sp); +} + +code print(int i,int j,(*exit1)(),void*exit1env) +{ + printf("%d %d\n",i,j); + goto (*exit1)(1),exit1env; +} +