diff runtime/func.h @ 66:d4b44ae2e34a

New variant of C backend works now
author Mike Pavone <pavone@retrodev.com>
date Sun, 06 Jun 2010 20:29:10 -0400
parents 1db811fa4744
children c40c3d399133
line wrap: on
line diff
--- a/runtime/func.h	Tue Jun 01 01:13:54 2010 -0400
+++ b/runtime/func.h	Sun Jun 06 20:29:10 2010 -0400
@@ -1,9 +1,9 @@
 #ifndef _FUNC_H_
 #define _FUNC_H_
 
-typedef struct object object;
-typedef struct calldata calldata;
-
+typedef struct object object;
+typedef struct calldata calldata;
+
 typedef enum {
 	NORMAL_RETURN=0,
 	EXCEPTION_RETURN,
@@ -22,16 +22,18 @@
 #define Func(name,numparams) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
+			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 sf_ ## name:\
-		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));
+		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
+		my_cdata = cdata;
 
 
 #define FuncNoLocals(name,numparams) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
-sf_ ## name:		
+			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
+sf_ ## name:\
+		my_cdata = cdata;		
 
 #define EndFunc(name)	\
 		free_stack(ct, lv_ ## name);\
@@ -46,8 +48,11 @@
 		switch(get_blueprint(cdata->params[0])->type_id)\
 		{
 			
-#define EndMethod \
+#define EndMethod(name) \
 		default:\
+			printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
+			cdata = alloc_cdata(ct, cdata, 0);\
+			cdata->func = FUNC_ ## name;\
 			goto _exception;\
 		}
 			
@@ -60,7 +65,11 @@
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
 		if (cdata->num_params < 1)\
+		{\
+			cdata = alloc_cdata(ct, cdata, 0);\
+			cdata->func = FUNC_ ## name ## AT_ ## type_name;\
 			goto _exception;\
+		}\
 		if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
 		{\
 			puts("uh oh, need conversion and that's not implemented yet!");\
@@ -68,14 +77,17 @@
 		}\
 m_ ## name ## AT_ ## type_name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\
-		lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));
+			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
+		lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
+		my_cdata = cdata;
 			
 				
 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
 		if (cdata->num_params < 1)\
+			cdata = alloc_cdata(ct, cdata, 0);\
+			cdata->func = FUNC_ ## name ## AT_ ## type_name;\
 			goto _exception;\
 		if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
 		{\
@@ -84,20 +96,22 @@
 		}\
 m_ ## name ## AT_ ## type_name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[0-idx]); cdata->num_params = numparams;
+			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
+		my_cdata = cdata;
 			
 #define NumParams
 #define CallSpace
 
 #define Param(num,convtypeid) \
-	if(get_blueprint(cdata->params[0-num])->type_id != convtypeid)\
+	if(get_blueprint(cdata->params[num])->type_id != convtypeid)\
 	{\
 		puts("uh oh, need conversion and that's not implemented yet!");\
 		exit(1);\
 	}
 
 #define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
-#define Ret(num,val) cdata->params[0-num] = (object *)(val);
+#define Ret(num,val) cdata->params[num] = (object *)(val);
+#define NumRet(num) cdata->num_params = num;
 #define Exception
 #define FuncDef(name) lt_ ## name * lv_ ## name;
 #define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;
@@ -105,14 +119,16 @@
 
 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
 
-#define SetParam(num,value) cdata->params[0-num] = value;
+#define SetParam(num,value) cdata->params[num] = value;
 
 #define Call(tocall, numparams, resumeto, myname)\
-			cdata->func = FUNC_ ## myname ## _ ## resumeto;\
+			cdata->func = RES_  ## resumeto ## _ ## myname;\
 			cdata->num_params = numparams;\
 			goto sf_ ## tocall;\
 r ## resumeto ## _ ## myname:\
-			lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1);
+			my_cdata = cdata->lastframe;\
+			lv_ ## myname = (lt_ ## myname *)(my_cdata->params+my_cdata->callspace);
+			
 	
 #define FreeCall\
 			temp_cdata = cdata->lastframe;\
@@ -137,4 +153,4 @@
 			goto sf_ ## tocall;
 	
 	
-#endif //_FUNC_H_
+#endif //_FUNC_H_