Mercurial > hg > CbC > CbC_gcc
diff 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 |
line wrap: on
line diff
--- a/CbC-examples/quicksort/quicksort_cbc.cbc Tue Jan 05 17:33:06 2010 +0900 +++ b/CbC-examples/quicksort/quicksort_cbc.cbc Mon Jan 25 16:14:42 2010 +0900 @@ -6,7 +6,7 @@ typedef struct { int size; void *interface; - __code (*code)(void*, stack) ; + __code (*ret)(void*, stack) ; } frame, *framep; /* quickstart main routine. */ @@ -26,7 +26,7 @@ { framep fp = (framep)sp; sp += fp->size; - goto fp->code(fp->interface, sp); + goto fp->ret(fp->interface, sp); } __code quicksort_start(void *arg, stack sp) @@ -88,11 +88,10 @@ tmp = recvif->v[s]; recvif->v[s] = recvif->v[e]; recvif->v[e] = tmp; - s++; - e--; - goto quicksort_divider(recvif, s, e, p, sp); + //s++; + //e--; + goto quicksort_divider(recvif, s+1, e-1, p, sp); } else { - assert(e+1==s || s==e); goto quicksort_treecall(recvif, s, e, sp); } } @@ -111,7 +110,7 @@ outif->s = recvif->s; outif->e = e; fp = (sp-=sizeof(frame)); - fp->code = quicksort_start; + fp->ret = quicksort_start; fp->interface = recvif; fp->size = sizeof(frame)+sizeof(QS_IF); @@ -151,7 +150,7 @@ outif->e = e; /* frame for quicksort_finish. */ fp = (sp -= sizeof(frame)); - fp->code = quicksort_finish; + fp->ret = quicksort_finish; fp->interface = finish_if; fp->size = sizeof(frame)+sizeof(QS_IF); @@ -160,8 +159,9 @@ __code quicksort_finish(void *arg, stack sp) { - QS_FINISH interface = *(QS_FINISH*)arg; - //assert(interface.sp==mustbefreed); + QS_FINISH interface; + interface = *(QS_FINISH*)arg; + //assert((void*)interface.sp==(void*)mustbefreed); free(interface.sp); goto interface.ret(interface.ret_arg); } @@ -202,18 +202,18 @@ * + ↑ - * sp */ -/* code segmentへgotoしたときのstack spの状態 +/* ret segmentへgotoしたときのstack spの状態 * * sp が直接さすのは frame 構造体 * frame.size: - * frame.code: そのcode segmentが終了した時にgotoすべきcode segment. - * frame.interface: frame.codeへgotoするときのinterface. + * frame.ret: そのret segmentが終了した時にgotoすべきret segment. + * frame.interface: frame.retへgotoするときのinterface. * このポインタが指すメモリ領域は stack * 中にあっても良いしなくても良い。 - * ただしframe.codeを登録した側で解放すべき。 - * sp+sizeof(frame)が指すのは実行中のcode segmentのinterface(引数) - * これは実行中のcode segmentがメモリ管理する - * 通常はこのcode segmentが終了する際に sp+=frame.size とすればよい + * ただしframe.retを登録した側で解放すべき。 + * sp+sizeof(frame)が指すのは実行中のret segmentのinterface(引数) + * これは実行中のret segmentがメモリ管理する + * 通常はこのret segmentが終了する際に sp+=frame.size とすればよい */ __code caller0(void *arg, stack sp) { @@ -223,7 +223,7 @@ /* arg for quicksort_start. */ outif = (sp -= sizeof(*outif)); framep fp = (sp -= sizeof(frame)); - fp->code = caller_finish; + fp->ret = caller_finish; fp->interface = NULL; fp->size = sizeof(*outif)+sizeof(frame); @@ -237,7 +237,7 @@ { framep fp = sp; sp += fp->size; - goto fp->code(fp->interface, sp); + goto fp->ret(fp->interface, sp); } #endif