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