view CbC-examples/stack1.c @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 420680fc7707
children 26042f4007d5
line wrap: on
line source

/*
    test for CbC converted __code from C
 */

#include <stdio.h>
#define NULL 0
extern int printf(const char*, ...);

extern void *malloc(size_t);

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 *);
	__code print(int i,int j,__code (*exit1)(),void*exit1env);

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 __attribute__ ((fastcall)) 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 f1(int i,void *sp) ;
__code f0(int i,int j,__code(*exit2)(), void *exit2env,void *sp)
{
	struct f0_save *c;
    printf("#0070:f0 1 sp: %x\n",sp-stack0);
	sp -= sizeof(struct f0_save);
    printf("#0072:f0 2 sp: %x\n",sp-stack0);
	c = sp;
	c->jj = j;
        c->exit1 = exit2;
        c->exit1env = exit2env;
	c->ret = f1;
    printf("#0078: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[]){
	main0(ac,av);
}

int main0( 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("#0108:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0));
    //goto f0(i,j,_CbC_return,_CbC_environment,sp);
    goto f0(i,j,NULL,NULL,sp);
}

__code print(int i,int j,__code (*exit1)(),void*exit1env)
{
    printf("#0114:%d %d\n",i,j);
    //goto (*exit1)(0),exit1env;
	exit(0);
}