Mercurial > repos > rhope
diff runtime/func.h @ 12:31f8182f3433
Finished fib test and did some small work on the c backend
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 25 May 2009 23:34:36 -0400 |
parents | 3021dac0d8f5 |
children | 3498713c3dc9 |
line wrap: on
line diff
--- a/runtime/func.h Tue May 19 23:29:55 2009 -0400 +++ b/runtime/func.h Mon May 25 23:34:36 2009 -0400 @@ -13,10 +13,10 @@ typedef returntype (*rhope_func)(struct calldata *); typedef void (*special_func) (struct object *); -#define MethodName(name,type) _f_ ## name ## _AT_ ## type +#define MethodName(name,type) f_ ## name ## _AT_ ## type #define Func(name,numparams,callspace,localtype) \ - returntype _f_ ## name (calldata * cdata)\ + returntype f_ ## name (calldata * cdata)\ {\ localtype *locals;\ calldata *call;\ @@ -24,8 +24,8 @@ int idx;\ if(cdata->resume)\ {\ + call = cdata->call;\ locals = cdata->locals;\ - call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\ }\ switch(cdata->resume)\ {\ @@ -33,10 +33,11 @@ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ cdata->num_params = numparams;\ - cdata->locals = call = alloc_cdata(cdata->ct, callspace); + cdata->call = call = alloc_cdata(cdata->ct, callspace);\ + cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype)); #define FuncNoLocals(name,numparams,callspace) \ - returntype _f_ ## name (calldata * cdata)\ + returntype f_ ## name (calldata * cdata)\ {\ calldata *call;\ returntype ret;\ @@ -52,6 +53,7 @@ cdata->locals = call = alloc_cdata(cdata->ct, callspace); #define EndFunc \ + free_stack(cdata->ct, call);\ return NORMAL_RETURN;\ }\ } @@ -65,8 +67,8 @@ int idx;\ if(cdata->resume)\ {\ + call = cdata->call;\ locals = cdata->locals;\ - call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\ }\ switch(cdata->resume)\ {\ @@ -74,7 +76,8 @@ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ cdata->num_params = numparams;\ - cdata->locals = call = alloc_cdata(cdata->ct, callspace); + cdata->call = call = alloc_cdata(cdata->ct, callspace);\ + cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype)); #define MethodNoLocals(name,type,numparams,callspace) \ returntype MethodName(name,type) (calldata * cdata)\ @@ -95,7 +98,7 @@ #define NumParams #define CallSpace -#define ParamBase(num,var,type,convtypeid) \ +#define Param(num,convtypeid) \ call->params[0] = cdata->params[num];\ call->resume = 0;\ ret = coerce_value(convtypeid, call);\ @@ -104,32 +107,34 @@ if(ret == EXCEPTION_RETURN)\ {\ for(idx = 0; idx < cdata->num_params; ++idx)\ - if(idx != num)\ + if(idx != num && cdata->params[idx])\ release_ref(cdata->params[idx]);\ cdata->params[0] = call->params[0];\ + free_stack(cdata->ct, call);\ return ret;\ }\ cdata->params[num] = call->params[0]; -#define Param(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) var = (_t_##type *)(cdata->params[num]); -#define CopiedParam(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); var = (_t_##type *)(cdata->params[num]); +#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 Return return NORMAL_RETURN; #define Exception -#define FuncDef(name) returntype _f_ ## name (calldata * cdata); +#define FuncDef(name) returntype f_ ## name (calldata * cdata); #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata); #define Call(func, numparams)\ call->num_params = numparams;\ call->resume = 0;\ - ret = _f_ ## func (call);\ + ret = f_ ## func (call);\ while(ret == TAIL_RETURN)\ ret = call->tail_func(call);\ if(ret == EXCEPTION_RETURN)\ {\ for(idx = 0; idx < cdata->num_params; ++idx)\ - release_ref(cdata->params[idx]);\ + if(cdata->params[idx])\ + release_ref(cdata->params[idx]);\ cdata->params[0] = call->params[0];\ + free_stack(cdata->ct, call);\ return ret;\ } @@ -142,9 +147,26 @@ if(ret == EXCEPTION_RETURN)\ {\ for(idx = 0; idx < cdata->num_params; ++idx)\ - release_ref(cdata->params[idx]);\ + if(cdata->params[idx])\ + release_ref(cdata->params[idx]);\ cdata->params[0] = call->params[0];\ + free_stack(cdata->ct, call);\ return ret;\ } +#define TMCall(methodid, numparams)\ + free_stack(cdata->ct, call);\ + cdata->num_params = numparams;\ + cdata->resume = 0;\ + ret = call_method(methodid, cdata);\ + return ret; + +#define TCall(func, numparams)\ + free_stack(cdata->ct, call);\ + cdata->num_params = numparams;\ + cdata->resume = 0;\ + cdata->tail_func = f_ ## func;\ + return TAIL_RETURN; + + #endif //_FUNC_H_ \ No newline at end of file