view test/test1.c @ 109:e09f9de6f5d3

*** empty log message ***
author kono
date Wed, 19 Mar 2003 02:22:33 +0900
parents fdbf2fbc8140
children 096559f07a70
line wrap: on
line source

#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;
}