view stack1.c @ 18:bec7f99b60b5

remove goto exit
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Sun, 24 Jan 2016 06:03:01 +0900
parents 90e6146d24cd
children 586096c45873
line wrap: on
line source

/*
  test for CbC converted __code from C
*/

#include <stdio.h>
#include <stdlib.h>
#define NULL 0


typedef void *stack;

void *stack0;      /* size of void* == 1 */

struct cont_save { /* General Return Continuation */
  __code (*ret)(int, void*);
};

__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);
int main0( int ac, char *av[]);

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: %lx\n",sp-stack0);

  k = 3+i;

  printf("#0046:f 1 sp: %lx\n",sp-stack0);
  sp -= sizeof(struct f_g0_save);
  printf("#0048:f 2 sp: %lx\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)(int, void*);
  __code (*exit1)(int, void*);
  void *exit1env;
  int jj;
};

__code f1(int i,void *sp) ;
__code f0(int i,int j,__code(*exit2)(int, void*), void *exit2env,void *sp)
{
  struct f0_save *c;
  printf("#0070:f0 1 sp: %lx\n",sp-stack0);
  sp -= sizeof(struct f0_save);
  printf("#0072:f0 2 sp: %lx\n",sp-stack0);
  c = sp;
  c->jj = j;
  c->exit1 = exit2;
  c->exit1env = exit2env;
  c->ret = f1;
  printf("#0078:f0 3 sp: %lx\n",sp-stack0);
  goto f(i,sp);
}

__code f1(int i,void *sp) {
  int j;
  int *exit2env;
  __code (*exit2)(int, void*);
  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 = 1;
  stack0 = ((char *)malloc(1024)+1024);
  sp = stack0;
  j = i;
    
  printf("#0108:sp: %lx %lx\n",sp-(int*)stack0,sizeof(*stack0));
  goto f0(i,j,NULL,NULL,sp);
  return 0;
}

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