Mercurial > repos > rhope
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_ +