# HG changeset patch # User Mike Pavone # Date 1254982345 14400 # Node ID 2174878a6e4b7b56dee7d1334de1332d80b0bc9f # Parent d2f9b0a9403ddf59203fa88479b82c1d1e5d8106 Avoid unnecessary nested switch diff -r d2f9b0a9403d -r 2174878a6e4b runtime/fib.c --- a/runtime/fib.c Thu Oct 08 01:52:38 2009 -0400 +++ b/runtime/fib.c Thu Oct 08 02:12:25 2009 -0400 @@ -14,9 +14,18 @@ FUNC__PL_, FUNC__PL__AT_Int32, FUNC_Fib, + FUNC_Fib_1, + FUNC_Fib_2, + FUNC_Fib_3, + FUNC_Fib_4, + FUNC_Fib_5, + FUNC_Fib_6, + FUNC_Fib_7, FUNC_If, FUNC_If_AT_Yes_SP_No, FUNC_Main, + FUNC_Main_1, + FUNC_Main_2, FUNC_Print, END } funcids; diff -r d2f9b0a9403d -r 2174878a6e4b runtime/func.h --- a/runtime/func.h Thu Oct 08 01:52:38 2009 -0400 +++ b/runtime/func.h Thu Oct 08 02:12:25 2009 -0400 @@ -19,35 +19,26 @@ #define Func(name,numparams) \ case FUNC_ ## name:\ f_ ## name:\ - switch(resume)\ - {\ - case 0:\ - for(idx = numparams; idx < cdata->num_params; ++idx)\ - release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ - lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); + for(idx = numparams; idx < cdata->num_params; ++idx)\ + release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ + lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name)); #define FuncNoLocals(name,numparams) \ case FUNC_ ## name:\ f_ ## name:\ - switch(resume)\ - {\ - case 0:\ - for(idx = numparams; idx < cdata->num_params; ++idx)\ - release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ + for(idx = numparams; idx < cdata->num_params; ++idx)\ + release_ref(cdata->params[0-idx]); cdata->num_params = numparams;\ #define EndFunc(name) \ - free_stack(ct, lv_ ## name);\ - func = cdata->func;\ - resume = cdata->resume;\ - goto _dispatch;\ - } + free_stack(ct, lv_ ## name);\ + func = cdata->func;\ + goto _dispatch;\ #define EndFuncNoLocals \ - func = cdata->func;\ - resume = cdata->resume;\ - goto _dispatch;\ - } + func = cdata->func;\ + resume = cdata->resume;\ + goto _dispatch;\ #define Method(name) \ case FUNC_ ## name:\ @@ -70,38 +61,32 @@ #define MethodImpl(name,type_name,mytype_id,numparams) \ case FUNC_ ## name ## _AT_ ## type_name:\ f_ ## name ## _AT_ ## type_name:\ - switch(resume)\ + if (cdata->num_params < 1)\ + goto _exception;\ + if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ {\ - case 0:\ - if (cdata->num_params < 1)\ - 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);\ - }\ + 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[0-idx]); cdata->num_params = numparams;\ - lv_ ## name ## _AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## 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)); #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ case FUNC_ ## name ## _AT_ ## type_name:\ f_ ## name ## _AT_ ## type_name:\ - switch(resume)\ + if (cdata->num_params < 1)\ + goto _exception;\ + if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ {\ - case 0:\ - if (cdata->num_params < 1)\ - 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);\ - }\ + 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[0-idx]); cdata->num_params = numparams; + for(idx = numparams; idx < cdata->num_params; ++idx)\ + release_ref(cdata->params[0-idx]); cdata->num_params = numparams; #define NumParams #define CallSpace @@ -125,24 +110,22 @@ #define SetParam(num,value) cdata->params[0-num] = value; #define Call(tocall, numparams, resumeto, myname)\ - cdata->func = FUNC_ ## myname;\ - cdata->resume = resumeto;\ - cdata->num_params = numparams;\ - resume = 0;\ - goto f_ ## tocall;\ - case resumeto:\ - lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); + cdata->func = FUNC_ ## myname ## _ ## resumeto;\ + cdata->num_params = numparams;\ + goto f_ ## tocall;\ + case FUNC_ ## myname ## _ ## resumeto:\ + lv_ ## myname = (lt_ ## myname *)(cdata->lastframe+1); #define FreeCall\ - temp_cdata = cdata->lastframe;\ - free_stack(ct, cdata);\ - cdata = temp_cdata; + 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); + temp_cdata = cdata->lastframe;\ + free_stack(ct, cdata);\ + cdata = temp_cdata;\ + lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1); #define TCall(func, numparams)\ free_stack(cdata->ct, call);\