diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CbC-examples/stack1.c	Thu Sep 24 12:51:25 2009 +0900
@@ -0,0 +1,126 @@
+/*
+    test for CbC converted __code from C
+ */
+
+//#include <stdio.h>
+#define NULL 0
+
+extern void *malloc(int);
+
+typedef void *stack;
+
+void *stack0;      /* size of void* == 1 */
+
+struct cont_save { /* General Return Continuation */
+    __code (*ret)();
+};
+
+    __code g(int,void *);
+    __code f_g0(int ,int ,void *);
+    __code f_g1(int,void *);
+	__code print(int i,int j,__code (*exit1)(),void*exit1env);
+
+struct f_g0_save {  /* Specialized Return Continuation */
+    __code (*ret)();
+    int ii,kk,jj;
+};
+
+__code g(int i,void *sp) {
+    goto (* ((struct cont_save *)sp)->ret)(i+4,sp);
+}
+
+__code __attribute__ ((fastcall)) f_g1(int j,void *sp) {  /* Continuation  */
+    int k;
+    struct f_g0_save *c;
+
+    c = sp;
+    k = c->kk;
+    sp += sizeof(struct f_g0_save);
+    goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp);
+}
+
+__code f(int i,void *sp) {
+    int k,j;
+    struct f_g0_save *c;
+printf("#0042:f 0 sp: %x\n",sp-stack0);
+
+    k = 3+i;
+
+printf("#0046:f 1 sp: %x\n",sp-stack0);
+    sp -= sizeof(struct f_g0_save);
+printf("#0048:f 2 sp: %x\n",sp-stack0);
+    c = sp;
+    c->kk = k;
+    c->ii = i;
+    c->jj = j;
+    c->ret = f_g1;
+    goto g(i,sp);
+}
+
+
+
+struct f0_save {  /* Specialized Return Continuation */
+	__code (*ret)();
+	__code (*exit1)();
+	void *exit1env;
+	int jj;
+};
+
+__code f1(int i,void *sp) ;
+__code f0(int i,int j,__code(*exit2)(), void *exit2env,void *sp)
+{
+	struct f0_save *c;
+    printf("#0070:f0 1 sp: %x\n",sp-stack0);
+	sp -= sizeof(struct f0_save);
+    printf("#0072:f0 2 sp: %x\n",sp-stack0);
+	c = sp;
+	c->jj = j;
+        c->exit1 = exit2;
+        c->exit1env = exit2env;
+	c->ret = f1;
+    printf("#0078:f0 3 sp: %x\n",sp-stack0);
+	goto f(i,sp);
+}
+
+__code f1(int i,void *sp) {
+	int j;
+	int *exit2env;
+	__code (*exit2)();
+	struct f0_save *c;
+
+        c = sp;
+        j = c->jj;
+        exit2 = c->exit1;
+        exit2env = c->exit1env;
+
+	sp += sizeof(struct f0_save);
+	goto print(i,j,exit2,exit2env);
+}
+
+int main(int ac, char*av[]){
+	main0(ac,av);
+}
+
+int main0( int ac, char *av[])
+{
+    int i,j;
+    int *sp;
+
+    // i = atoi(av[1]);
+    i = 1;
+    stack0 = ((char *)malloc(1024)+1024);
+    sp = stack0;
+    j = i;
+    
+    printf("#0108:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0));
+    //goto f0(i,j,_CbC_return,_CbC_environment,sp);
+    goto f0(i,j,NULL,NULL,sp);
+}
+
+__code print(int i,int j,__code (*exit1)(),void*exit1env)
+{
+    printf("#0114:%d %d\n",i,j);
+    //goto (*exit1)(0),exit1env;
+	exit(0);
+}
+