diff runtime/func.h @ 186:ba35ab624ec2

Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:10:02 -0700
parents d2b941f82d74
children
line wrap: on
line diff
--- a/runtime/func.h	Wed Jul 27 21:32:40 2011 -0700
+++ b/runtime/func.h	Fri Oct 07 00:10:02 2011 -0700
@@ -1,8 +1,18 @@
 #ifndef _FUNC_H_
 #define _FUNC_H_
 
+#define MethodName(name,type) f_ ## name ## AT_ ## type
+#define NumParams
+#define NumOutputs
+#define CallSpace
+
 typedef struct object object;
-typedef struct calldata calldata;
+typedef void (*special_func) (object *);
+
+
+#ifdef RAW_FUNC
+#include "func_raw.h"
+#else
 
 typedef enum {
 	NORMAL_RETURN=0,
@@ -12,9 +22,22 @@
 	STACK_UNWIND
 } returntype;
 
+typedef struct calldata calldata;
 
 typedef returntype (*rhope_func)(calldata *);
-typedef void (*special_func) (object *);
+
+#define lv(func,var) lv_ ## func->var
+#define lvar(type, name) type name;
+#define my_params(num) my_cdata->params[num]
+#define child_params(num) cdata->params[num]
+#define my_outputs(num) my_cdata->params[num]
+
+#define result(num) cdata->params[num]
+#define numresults cdata->num_params
+
+#define LocalsType(def,func) typedef struct { def } lt_ ## func;
+
+#define ResEnum(num,name) RES_ ## num ## _ ## name,
 
 #ifdef MULTI_SWITCH
 #define DispatchEntry(name) case FUNC_##name: goto f_##name;
@@ -32,9 +55,6 @@
 #define EndThreadEntry &&DO_END_THREAD
 #endif
 
-
-#define MethodName(name,type) f_ ## name ## AT_ ## type
-
 #ifdef ENABLE_PROFILING
 
 #define START_PROFILE \
@@ -72,7 +92,7 @@
 		}\
 		profile_selftotals[FUNC_ ## name] +=  ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - cdata->self_start + cdata->self_accum;
 		
-#define Func(name,numparams) \
+#define Func(name,numparams,numret) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
@@ -83,7 +103,7 @@
 		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
 		my_cdata = cdata;
 
-#define MethodImpl(name,type_name,mytype_id,numparams) \
+#define MethodImpl(name,type_name,mytype_id,numparams,numret) \
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
 		if (cdata->num_params < 1)\
@@ -118,7 +138,7 @@
 		free_stack(ct, lv_ ## name);\
 		func = cdata->func;
 		
-#define Func(name,numparams) \
+#define Func(name,numparams,numret) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
@@ -126,7 +146,7 @@
 		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
 		my_cdata = cdata;
 
-#define MethodImpl(name,type_name,mytype_id,numparams) \
+#define MethodImpl(name,type_name,mytype_id,numparams,numret) \
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
 		if (cdata->num_params < 1)\
@@ -152,7 +172,7 @@
 		func = cdata->func;
 
 
-#define FuncNoLocals(name,numparams) \
+#define FuncNoLocals(name,numparams,numret) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
@@ -199,9 +219,6 @@
 		case type_id:\
 			goto m_ ## name ## AT_ ## type_name;
 			
-#define NumParams
-#define CallSpace
-
 #define Param(num,convtypeid) \
 	if(get_blueprint(cdata->params[num])->type_id != convtypeid)\
 	{\
@@ -219,7 +236,7 @@
 	}
 #define Exception
 #define FuncDef(name) lt_ ## name * lv_ ## name;
-#define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name;
+#define MethodDef(name) lt_ ## name * lv_ ## name;
 
 
 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
@@ -352,5 +369,6 @@
 			cdata->num_params = numparams;\
 			goto sf_ ## tocall;
 	
-	
+#endif //RAW_FUNC
 #endif //_FUNC_H_
+