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