comparison CbC-examples/quicksort/quicksort_cbc.cbc @ 39:9117c3b65bc3

modify quicksort examples.
author kent@zeus.cr.ie.u-ryukyu.ac.jp
date Mon, 25 Jan 2010 16:14:42 +0900
parents 2476ed92181e
children 3367c5a7ec79
comparison
equal deleted inserted replaced
38:27e6f95b2c21 39:9117c3b65bc3
4 4
5 typedef void *stack; 5 typedef void *stack;
6 typedef struct { 6 typedef struct {
7 int size; 7 int size;
8 void *interface; 8 void *interface;
9 __code (*code)(void*, stack) ; 9 __code (*ret)(void*, stack) ;
10 } frame, *framep; 10 } frame, *framep;
11 11
12 /* quickstart main routine. */ 12 /* quickstart main routine. */
13 typedef struct { 13 typedef struct {
14 int *v; 14 int *v;
24 24
25 __code returner(stack sp) 25 __code returner(stack sp)
26 { 26 {
27 framep fp = (framep)sp; 27 framep fp = (framep)sp;
28 sp += fp->size; 28 sp += fp->size;
29 goto fp->code(fp->interface, sp); 29 goto fp->ret(fp->interface, sp);
30 } 30 }
31 31
32 __code quicksort_start(void *arg, stack sp) 32 __code quicksort_start(void *arg, stack sp)
33 { 33 {
34 QS_IF *recvif = arg; 34 QS_IF *recvif = arg;
86 if (s<e) { 86 if (s<e) {
87 int tmp; 87 int tmp;
88 tmp = recvif->v[s]; 88 tmp = recvif->v[s];
89 recvif->v[s] = recvif->v[e]; 89 recvif->v[s] = recvif->v[e];
90 recvif->v[e] = tmp; 90 recvif->v[e] = tmp;
91 s++; 91 //s++;
92 e--; 92 //e--;
93 goto quicksort_divider(recvif, s, e, p, sp); 93 goto quicksort_divider(recvif, s+1, e-1, p, sp);
94 } else { 94 } else {
95 assert(e+1==s || s==e);
96 goto quicksort_treecall(recvif, s, e, sp); 95 goto quicksort_treecall(recvif, s, e, sp);
97 } 96 }
98 } 97 }
99 /* divide routin end. */ 98 /* divide routin end. */
100 99
109 outif = (sp-=sizeof(QS_IF)); 108 outif = (sp-=sizeof(QS_IF));
110 outif->v = recvif->v; 109 outif->v = recvif->v;
111 outif->s = recvif->s; 110 outif->s = recvif->s;
112 outif->e = e; 111 outif->e = e;
113 fp = (sp-=sizeof(frame)); 112 fp = (sp-=sizeof(frame));
114 fp->code = quicksort_start; 113 fp->ret = quicksort_start;
115 fp->interface = recvif; 114 fp->interface = recvif;
116 fp->size = sizeof(frame)+sizeof(QS_IF); 115 fp->size = sizeof(frame)+sizeof(QS_IF);
117 116
118 /* recvif is used by second quicksort_start. */ 117 /* recvif is used by second quicksort_start. */
119 recvif->s = e+1; 118 recvif->s = e+1;
149 outif->v = v; 148 outif->v = v;
150 outif->s = s; 149 outif->s = s;
151 outif->e = e; 150 outif->e = e;
152 /* frame for quicksort_finish. */ 151 /* frame for quicksort_finish. */
153 fp = (sp -= sizeof(frame)); 152 fp = (sp -= sizeof(frame));
154 fp->code = quicksort_finish; 153 fp->ret = quicksort_finish;
155 fp->interface = finish_if; 154 fp->interface = finish_if;
156 fp->size = sizeof(frame)+sizeof(QS_IF); 155 fp->size = sizeof(frame)+sizeof(QS_IF);
157 156
158 goto quicksort_start(outif, sp); 157 goto quicksort_start(outif, sp);
159 } 158 }
160 __code 159 __code
161 quicksort_finish(void *arg, stack sp) 160 quicksort_finish(void *arg, stack sp)
162 { 161 {
163 QS_FINISH interface = *(QS_FINISH*)arg; 162 QS_FINISH interface;
164 //assert(interface.sp==mustbefreed); 163 interface = *(QS_FINISH*)arg;
164 //assert((void*)interface.sp==(void*)mustbefreed);
165 free(interface.sp); 165 free(interface.sp);
166 goto interface.ret(interface.ret_arg); 166 goto interface.ret(interface.ret_arg);
167 } 167 }
168 168
169 169
200 * | args |fp| 200 * | args |fp|
201 * -------------------- 201 * --------------------
202 * + ↑ - 202 * + ↑ -
203 * sp 203 * sp
204 */ 204 */
205 /* code segmentへgotoしたときのstack spの状態 205 /* ret segmentへgotoしたときのstack spの状態
206 * 206 *
207 * sp が直接さすのは frame 構造体 207 * sp が直接さすのは frame 構造体
208 * frame.size: 208 * frame.size:
209 * frame.code: そのcode segmentが終了した時にgotoすべきcode segment. 209 * frame.ret: そのret segmentが終了した時にgotoすべきret segment.
210 * frame.interface: frame.codeへgotoするときのinterface. 210 * frame.interface: frame.retへgotoするときのinterface.
211 * このポインタが指すメモリ領域は stack 211 * このポインタが指すメモリ領域は stack
212 * 中にあっても良いしなくても良い。 212 * 中にあっても良いしなくても良い。
213 * ただしframe.codeを登録した側で解放すべき。 213 * ただしframe.retを登録した側で解放すべき。
214 * sp+sizeof(frame)が指すのは実行中のcode segmentのinterface(引数) 214 * sp+sizeof(frame)が指すのは実行中のret segmentのinterface(引数)
215 * これは実行中のcode segmentがメモリ管理する 215 * これは実行中のret segmentがメモリ管理する
216 * 通常はこのcode segmentが終了する際に sp+=frame.size とすればよい 216 * 通常はこのret segmentが終了する際に sp+=frame.size とすればよい
217 */ 217 */
218 __code caller0(void *arg, stack sp) 218 __code caller0(void *arg, stack sp)
219 { 219 {
220 /* interface for caller_finish0. */ 220 /* interface for caller_finish0. */
221 double *finish_arg = (sp -= sizeof(double)); 221 double *finish_arg = (sp -= sizeof(double));
222 222
223 /* arg for quicksort_start. */ 223 /* arg for quicksort_start. */
224 outif = (sp -= sizeof(*outif)); 224 outif = (sp -= sizeof(*outif));
225 framep fp = (sp -= sizeof(frame)); 225 framep fp = (sp -= sizeof(frame));
226 fp->code = caller_finish; 226 fp->ret = caller_finish;
227 fp->interface = NULL; 227 fp->interface = NULL;
228 fp->size = sizeof(*outif)+sizeof(frame); 228 fp->size = sizeof(*outif)+sizeof(frame);
229 229
230 goto quicksort_start(outif, sp); 230 goto quicksort_start(outif, sp);
231 } 231 }
235 235
236 __code __returner0(void *arg , stack sp) 236 __code __returner0(void *arg , stack sp)
237 { 237 {
238 framep fp = sp; 238 framep fp = sp;
239 sp += fp->size; 239 sp += fp->size;
240 goto fp->code(fp->interface, sp); 240 goto fp->ret(fp->interface, sp);
241 } 241 }
242 242
243 #endif 243 #endif
244 244
245 245