Mercurial > hg > CbC > CbC_gcc
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 |