changeset 61:fa24ef3b026f

Added macro for tail calls with new C strategy
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Oct 2009 23:16:26 -0400
parents b2a95ab818d3
children b218af069da7
files runtime/fib.c runtime/func.h
diffstat 2 files changed, 37 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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