Mercurial > repos > rhope
view runtime/func.h @ 71:c40c3d399133
Add Int32@String and Get Char. Fix stack bug
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 18 Jun 2010 15:07:09 -0400 |
parents | d4b44ae2e34a |
children | a844c623c7df |
line wrap: on
line source
#ifndef _FUNC_H_ #define _FUNC_H_ typedef struct object object; typedef struct calldata calldata; typedef enum { NORMAL_RETURN=0, EXCEPTION_RETURN, TAIL_RETURN, NO_CONVERSION, STACK_UNWIND } returntype; typedef returntype (*rhope_func)(calldata *); typedef void (*special_func) (object *); #define MethodName(name,type) f_ ## name ## AT_ ## type #define Func(name,numparams) \ f_ ## name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ sf_ ## 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[idx]); cdata->num_params = numparams;\ sf_ ## name:\ my_cdata = cdata; #define EndFunc(name) \ free_stack(ct, lv_ ## name);\ func = cdata->func; #define EndFuncNoLocals \ func = cdata->func; #define Method(name) \ f_ ## name:\ sf_ ## name:\ switch(get_blueprint(cdata->params[0])->type_id)\ { #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;\ } #define MethodDispatch(type_id,name,type_name) \ case type_id:\ goto m_ ## name ## AT_ ## type_name; #define MethodImpl(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)\ {\ puts("uh oh, need conversion and that's not implemented yet!");\ exit(1);\ }\ m_ ## name ## AT_ ## type_name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ 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)\ {\ puts("uh oh, need conversion and that's not implemented yet!");\ exit(1);\ }\ m_ ## name ## AT_ ## type_name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ 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[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[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; #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); #define SetParam(num,value) cdata->params[num] = value; #define Call(tocall, numparams, resumeto, myname)\ cdata->func = RES_ ## resumeto ## _ ## myname;\ cdata->num_params = numparams;\ cdata->vars = lv_ ## myname;\ goto sf_ ## tocall;\ r ## resumeto ## _ ## myname:\ my_cdata = cdata->lastframe;\ lv_ ## myname = cdata->vars; #define FreeCall\ temp_cdata = cdata->lastframe;\ free_stack(ct, cdata);\ cdata = temp_cdata; #define FreeCallMethod(myname,mytype)\ temp_cdata = cdata->lastframe;\ free_stack(ct, cdata);\ cdata = temp_cdata;\ lv_ ## myname ## AT_ ## type_name = (lt_ ## myname ## AT_ ## type_name *)(cdata+1); #define TPrepCall(callspace) \ func = cdata->lastframe->func;\ temp_cdata = cdata->lastframe->lastframe;\ free_stack(ct, cdata->lastframe);\ cdata = alloc_cdata(ct, temp_cdata, callspace);\ cdata->func = func; #define TCall(tocall, numparams)\ cdata->num_params = numparams;\ goto sf_ ## tocall; #endif //_FUNC_H_