# HG changeset patch # User Mike Pavone # Date 1255058186 14400 # Node ID fa24ef3b026fbfcd28f3f27d7fb6dfad593f1213 # Parent b2a95ab818d307f39c5eba8c9cee9479688fdbc3 Added macro for tail calls with new C strategy diff -r b2a95ab818d3 -r fa24ef3b026f runtime/fib.c --- a/runtime/fib.c Thu Oct 08 22:54:39 2009 -0400 +++ b/runtime/fib.c Thu Oct 08 23:16:26 2009 -0400 @@ -20,7 +20,6 @@ FUNC_Fib_4, FUNC_Fib_5, FUNC_Fib_6, - FUNC_Fib_7, FUNC_If, FUNC_If_AT_Yes_SP_No, FUNC_Main, @@ -44,7 +43,6 @@ case FUNC_Fib_4: goto r4_Fib;\ case FUNC_Fib_5: goto r5_Fib;\ case FUNC_Fib_6: goto r6_Fib;\ - case FUNC_Fib_7: goto r7_Fib;\ case FUNC_If: goto f_If;\ case FUNC_If_AT_Yes_SP_No: goto f_If_AT_Yes_SP_No;\ case FUNC_Main: goto f_Main;\ @@ -207,11 +205,32 @@ } if(lv_Fib->____result__0__1) { - SetParam(0, add_ref(lv_Fib->____result__6__0)) - SetParam(1, add_ref(lv_Fib->____result__10__0)) - Call(_PL_, - NumParams 2, 7, Fib) - lv_Fib->____result__5__0 = cdata->params[0]; + if(lv_Fib->____result__0__0) + { + release_ref(lv_Fib->____result__0__0); + } + if(lv_Fib->____result__0__1) + { + release_ref(lv_Fib->____result__0__1); + } + if(lv_Fib->____result__1__0) + { + release_ref(lv_Fib->____result__1__0); + } + if(lv_Fib->____result__7__0) + { + release_ref(lv_Fib->____result__7__0); + } + if(lv_Fib->____result__11__0) + { + release_ref(lv_Fib->____result__11__0); + } + TPrepCall(2) + SetParam(0, lv_Fib->____result__6__0) + SetParam(1, lv_Fib->____result__10__0) + TCall(_PL_, + NumParams 2) + //lv_Fib->____result__5__0 = cdata->params[0]; } FreeCall if(lv_Fib->____result__0__1) diff -r b2a95ab818d3 -r fa24ef3b026f runtime/func.h --- a/runtime/func.h Thu Oct 08 22:54:39 2009 -0400 +++ b/runtime/func.h Thu Oct 08 23:16:26 2009 -0400 @@ -121,13 +121,17 @@ 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);\ - cdata->num_params = numparams;\ - cdata->resume = 0;\ - cdata->tail_func = f_ ## func;\ - return TAIL_RETURN; + +#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_ \ No newline at end of file