Mercurial > repos > rhope
diff runtime/func.h @ 100:f51c4c17457c
Broken port of parser to compiler
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 09 Aug 2010 02:03:57 -0400 |
parents | 6d10b5b9ebc3 |
children | f4fc0a98088a |
line wrap: on
line diff
--- a/runtime/func.h Fri Aug 06 01:42:37 2010 -0400 +++ b/runtime/func.h Mon Aug 09 02:03:57 2010 -0400 @@ -14,21 +14,21 @@ typedef returntype (*rhope_func)(calldata *); -typedef void (*special_func) (object *); - -#ifdef MULTI_SWITCH -#define DispatchEntry(name) case FUNC_##name: goto f_##name; -#define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name; -#define DispatchVar -#define DISPATCH switch(func) { DispatchEntries } -#define EndEntry case END: goto DO_END; -#else -#define DispatchEntry(name) &&f_##name, -#define ResumeEntry(num,name) &&r##num##_##name, -#define DispatchVar void * funcs[] = { DispatchEntries }; -#define DISPATCH goto *funcs[func]; -#define EndEntry &&DO_END -#endif +typedef void (*special_func) (object *); + +#ifdef MULTI_SWITCH +#define DispatchEntry(name) case FUNC_##name: goto f_##name; +#define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name; +#define DispatchVar +#define DISPATCH switch(func) { DispatchEntries } +#define EndEntry case END: goto DO_END; +#else +#define DispatchEntry(name) &&f_##name, +#define ResumeEntry(num,name) &&r##num##_##name, +#define DispatchVar void * funcs[] = { DispatchEntries }; +#define DISPATCH goto *funcs[func]; +#define EndEntry &&DO_END +#endif #define MethodName(name,type) f_ ## name ## AT_ ## type @@ -134,38 +134,48 @@ #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); -#define SetParam(num,value) cdata->params[num] = value; - -#define VCPrepCall(func,numparams) \ - cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\ - vcparam_offset = 0; - -#define VCSetParam(func,num,value) \ - while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\ - {\ - cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\ - ++vcparam_offset;\ - }\ - cdata->params[num+vcparam_offset] = value;\ - last_vcparam = num+vcparam_offset; - -#define ValCall(tocall,numparams,resumeto,myname)\ - last_vcparam++;\ - while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ - {\ - if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ - cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ - ++last_vcparam;\ - }\ +#define SetParam(num,value) cdata->params[num] = value; + + +#define VCRePrepCall(func,numparams,lastnumparams) \ + if(numparams + ((t_Worker *)func)->payload.Count > lastnumparams)\ + {\ + temp_cdata = cdata->lastframe;\ + free_stack(ct, cdata);\ + cdata = alloc_cdata(ct, temp_cdata, numparams + ((t_Worker *)func)->payload.Count);\ + }\ + vcparam_offset = 0; + +#define VCPrepCall(func,numparams) \ + cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\ + vcparam_offset = 0; + +#define VCSetParam(func,num,value) \ + while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\ + {\ + cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\ + ++vcparam_offset;\ + }\ + cdata->params[num+vcparam_offset] = value;\ + last_vcparam = num+vcparam_offset; + +#define ValCall(tocall,numparams,resumeto,myname)\ + last_vcparam++;\ + while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ + {\ + if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ + cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ + ++last_vcparam;\ + }\ cdata->func = RES_ ## resumeto ## _ ## myname;\ - cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ - cdata->vars = lv_ ## myname;\ - func = ((t_Worker *)tocall)->payload.Index; - -#define ValCallPostlude(resumeto,myname)\ -r ## resumeto ## _ ## myname:\ + cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ + cdata->vars = lv_ ## myname;\ + func = ((t_Worker *)tocall)->payload.Index; + +#define ValCallPostlude(resumeto,myname)\ +r ## resumeto ## _ ## myname:\ my_cdata = cdata->lastframe;\ - lv_ ## myname = cdata->vars; + lv_ ## myname = cdata->vars; #define Call(tocall, numparams, resumeto, myname)\