# HG changeset patch # User Mike Pavone # Date 1280533759 0 # Node ID 6d10b5b9ebc33f50f5ef8ea702ad75fcb1df85d0 # Parent 6d41b71f1b77d8b7dbac53e8cfbedf9d72b7bc8b Make dispatch type selectable between replicated switch and computed goto diff -r 6d41b71f1b77 -r 6d10b5b9ebc3 cbackend.rhope --- 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(); diff -r 6d41b71f1b77 -r 6d10b5b9ebc3 runtime/func.h --- 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