comparison CbC-examples/stack1.c @ 16:4c6926a2b9bc

examples.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Thu, 24 Sep 2009 12:51:25 +0900
parents
children 5d30d517ebed
comparison
equal deleted inserted replaced
15:11a6cbe2d14c 16:4c6926a2b9bc
1 /*
2 test for CbC converted __code from C
3 */
4
5 //#include <stdio.h>
6 #define NULL 0
7
8 extern void *malloc(int);
9
10 typedef void *stack;
11
12 void *stack0; /* size of void* == 1 */
13
14 struct cont_save { /* General Return Continuation */
15 __code (*ret)();
16 };
17
18 __code g(int,void *);
19 __code f_g0(int ,int ,void *);
20 __code f_g1(int,void *);
21 __code print(int i,int j,__code (*exit1)(),void*exit1env);
22
23 struct f_g0_save { /* Specialized Return Continuation */
24 __code (*ret)();
25 int ii,kk,jj;
26 };
27
28 __code g(int i,void *sp) {
29 goto (* ((struct cont_save *)sp)->ret)(i+4,sp);
30 }
31
32 __code __attribute__ ((fastcall)) f_g1(int j,void *sp) { /* Continuation */
33 int k;
34 struct f_g0_save *c;
35
36 c = sp;
37 k = c->kk;
38 sp += sizeof(struct f_g0_save);
39 goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp);
40 }
41
42 __code f(int i,void *sp) {
43 int k,j;
44 struct f_g0_save *c;
45 printf("#0042:f 0 sp: %x\n",sp-stack0);
46
47 k = 3+i;
48
49 printf("#0046:f 1 sp: %x\n",sp-stack0);
50 sp -= sizeof(struct f_g0_save);
51 printf("#0048:f 2 sp: %x\n",sp-stack0);
52 c = sp;
53 c->kk = k;
54 c->ii = i;
55 c->jj = j;
56 c->ret = f_g1;
57 goto g(i,sp);
58 }
59
60
61
62 struct f0_save { /* Specialized Return Continuation */
63 __code (*ret)();
64 __code (*exit1)();
65 void *exit1env;
66 int jj;
67 };
68
69 __code f1(int i,void *sp) ;
70 __code f0(int i,int j,__code(*exit2)(), void *exit2env,void *sp)
71 {
72 struct f0_save *c;
73 printf("#0070:f0 1 sp: %x\n",sp-stack0);
74 sp -= sizeof(struct f0_save);
75 printf("#0072:f0 2 sp: %x\n",sp-stack0);
76 c = sp;
77 c->jj = j;
78 c->exit1 = exit2;
79 c->exit1env = exit2env;
80 c->ret = f1;
81 printf("#0078:f0 3 sp: %x\n",sp-stack0);
82 goto f(i,sp);
83 }
84
85 __code f1(int i,void *sp) {
86 int j;
87 int *exit2env;
88 __code (*exit2)();
89 struct f0_save *c;
90
91 c = sp;
92 j = c->jj;
93 exit2 = c->exit1;
94 exit2env = c->exit1env;
95
96 sp += sizeof(struct f0_save);
97 goto print(i,j,exit2,exit2env);
98 }
99
100 int main(int ac, char*av[]){
101 main0(ac,av);
102 }
103
104 int main0( int ac, char *av[])
105 {
106 int i,j;
107 int *sp;
108
109 // i = atoi(av[1]);
110 i = 1;
111 stack0 = ((char *)malloc(1024)+1024);
112 sp = stack0;
113 j = i;
114
115 printf("#0108:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0));
116 //goto f0(i,j,_CbC_return,_CbC_environment,sp);
117 goto f0(i,j,NULL,NULL,sp);
118 }
119
120 __code print(int i,int j,__code (*exit1)(),void*exit1env)
121 {
122 printf("#0114:%d %d\n",i,j);
123 //goto (*exit1)(0),exit1env;
124 exit(0);
125 }
126