changeset 85:6d10b5b9ebc3

Make dispatch type selectable between replicated switch and computed goto
author Mike Pavone <pavone@retrodev.com>
date Fri, 30 Jul 2010 23:49:19 +0000
parents 6d41b71f1b77
children a163250b8885
files cbackend.rhope runtime/func.h
diffstat 2 files changed, 31 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.rhope	Fri Jul 30 23:48:31 2010 +0000
+++ b/cbackend.rhope	Fri Jul 30 23:49:19 2010 +0000
@@ -1224,7 +1224,7 @@
 									]Append[", "]
 									]Append[size]
 									]Append[", "]
-									]Append[[[value]Args >>]Length]
+									]Append[Fold[["+"]Set Input[0, 1], 0, [value]Args >>]]
 									]Append[")"]
 						}{
 							out <- "UnhandledLiteralType"
@@ -1282,16 +1282,12 @@
 
 _Dispatch Switch Sub[text, num, name:out]
 {
-	out <- [[[[[[[[[text
-		]Append["\tcase RES_"]
+	out <- [[[[[text
+		]Append["\tResumeEntry("]
 		]Append[num]
-		]Append["_"]
+		]Append[","]
 		]Append[name]
-		]Append[": goto r"]
-		]Append[num]
-		]Append["_"]
-		]Append[name]
-		]Append[";\\\n"]
+		]Append[")\\\n"]
 }
 
 _Dispatch Switch[text,func,raw name:out]
@@ -1299,7 +1295,7 @@
 	If[[[func]Convention >>] = ["rhope"]]
 	{
 		name <- Escape Rhope Name[raw name]
-		out <- [[text]Append[ [[[["\tcase FUNC_"]Append[name]]Append[": goto f_"]]Append[name]]Append[";\\\n"] ]
+		out <- [[text]Append[ [["\tDispatchEntry("]Append[name]]Append[")\\\n"] ]
 			]Append[Fold[["_Dispatch Switch Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]]
 	}{
 		out <- text
@@ -1309,7 +1305,7 @@
 _Dispatch Switch Methods[text,id,raw name:out]
 {
 	name <- Escape Rhope Name[raw name]
-	out <- [text]Append[ [[[["\tcase FUNC_"]Append[name]]Append[": goto f_"]]Append[name]]Append[";\\\n"] ]
+	out <- [text]Append[ [["\tDispatchEntry("]Append[name]]Append[")\\\n"] ]
 }
 
 _Dispatch Enum Sub[text, num, name:out]
@@ -1346,11 +1342,11 @@
 			[Fold["_Dispatch Enum Methods", "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n"], 
 			[program]Functions >>]]
 		]Append["\tEND\n} funcids;\n\n"]
-		]Append["#define DISPATCH switch(func) { \\\n"]
+		]Append["#define DispatchEntries \\\n"] 
 		]Append[Fold["_Dispatch Switch", 
-			[Fold["_Dispatch Switch Methods", "", all methods]]Append["\tcase FUNC_Build: goto f_Build;\\\n\tcase FUNC_BlueprintSP_Of: goto f_BlueprintSP_Of;\\\n\tcase FUNC_ID: goto f_ID;\\\n"], 
+			[Fold["_Dispatch Switch Methods", "", all methods]]Append["\tDispatchEntry(Build)\\\n\tDispatchEntry(BlueprintSP_Of)\\\n\tDispatchEntry(ID)\\\n"], 
 			[program]Functions >>]]
-		]Append["\tcase END: goto DO_END;\\\n}\n\n"]
+		]Append["\tEndEntry\n\n"]
 }
 
 Not Native[func:out]
@@ -1442,7 +1438,11 @@
 {
 	uint16_t resume,idx, vcparam_offset, last_vcparam;
 	context * ct;
-	calldata * cdata, *temp_cdata, *my_cdata;\n\nFuncDef(Build)\nFuncDef(BlueprintSP_Of)\nFuncDef(ID)\n"]
+	calldata * cdata, *temp_cdata, *my_cdata;
+	DispatchVar
+	FuncDef(Build)
+	FuncDef(BlueprintSP_Of)
+	FuncDef(ID)\n"]
 		]Append[Fold["Local Pointers", "", [program]Functions >>]]
 		]Append["
 	ct = new_context();
--- a/runtime/func.h	Fri Jul 30 23:48:31 2010 +0000
+++ b/runtime/func.h	Fri Jul 30 23:49:19 2010 +0000
@@ -14,7 +14,22 @@
 
 
 typedef returntype (*rhope_func)(calldata *);
-typedef void (*special_func) (object *);
+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