Mercurial > hg > CbC > old > device
view test/test1.c @ 560:d6ff45d719a5 string-shared
string sharing
author | kono |
---|---|
date | Sat, 07 Jan 2006 18:11:53 +0900 |
parents | a379da780856 |
children | 388baa7d4bee |
line wrap: on
line source
/* test for CbC converted code from C */ #include "stdio.h" typedef void *stack; void *stack0; /* size of void* == 1 */ 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("#0042:f 0 sp: %x\n",sp-stack0); k = 3+i; printf("#0046:f 1 sp: %x\n",sp-stack0); sp -= sizeof(struct f_g0_save); printf("#0048:f 2 sp: %x\n",sp-stack0); c = sp; c->kk = k; c->ii = i; c->jj = j; c->ret = f_g1; goto g(i,sp); } 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("#0069:f0 1 sp: %x\n",sp-stack0); sp -= sizeof(struct f0_save); printf("#0071:f0 2 sp: %x\n",sp-stack0); c = sp; c->jj = j; c->exit1 = exit2; c->exit1env = exit2env; c->ret = f1; printf("#0077:f0 3 sp: %x\n",sp-stack0); 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]); i = 1; stack0 = ((char *)malloc(1024)+1024); sp = stack0; j = i; printf("#0107:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0)); goto f0(i,j,return,environment,sp); } code print(int i,int j,(*exit1)(),void*exit1env) { printf("#0113:%d %d\n",i,j); goto (*exit1)(0),exit1env; }