changeset 57:2174878a6e4b

Avoid unnecessary nested switch
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Oct 2009 02:12:25 -0400
parents d2f9b0a9403d
children 4c22fe798779
files runtime/fib.c runtime/func.h
diffstat 2 files changed, 49 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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);\