# HG changeset patch # User Mike Pavone # Date 1275369234 14400 # Node ID 1db811fa47446f55d4e503417645161ec7901578 # Parent e1fd6d244f146fd47ca1f41d396e86a250325735 Handle native Rhope functions and plain C functions separately as part of move to new C strategy diff -r e1fd6d244f14 -r 1db811fa4744 cbackend.rhope --- a/cbackend.rhope Sun May 30 17:34:36 2010 -0400 +++ b/cbackend.rhope Tue Jun 01 01:13:54 2010 -0400 @@ -871,7 +871,7 @@ If[ [[func]Convention >>] = ["rhope"] ] { - parts <- [[func]Name >>]Split["@"] + /* parts <- [[func]Name >>]Split["@"] [parts]Index[1] { proto <- [[[["MethodDef(" @@ -881,11 +881,11 @@ ]Append[")\n"] }{ proto <- [["FuncDef("]Append[Escape Rhope Name[[func]Name >>]]]Append[")\n"] - } + } */ + out <- Val[localtype] }{ - proto <- [[func]Naked Proto]Append[";\n"] + out <- [[func]Naked Proto]Append[";\n"] } - out <- [localtype]Append[proto] } } @@ -941,31 +941,41 @@ { Print[["Text@C Function: "]Append[[func]Name >>]] If[ [[func]Convention >>] = ["rhope"] ] - { - cname <- Escape Rhope Name[[func]Name >>] + { + ,before <- [[func]Name >>]Get DString["@"] + { + type <- "MethodImpl" + cname <- [[[[Escape Rhope Name[before] + ]Append[", "] + ]Append[Escape Rhope Name[~]] + ]Append[", "] + ]Append[ [[func]Type Registry >>]Type ID[~] ] + }{}{}{ + type <- "Func" + cname <- Val[fname] + } + fname <- Escape Rhope Name[[func]Name >>] param check <- Fold[["Check Param Type C"]Set Input[3, func], "", [func]Input Types >>] If[ [ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] = [0] ] { - out <- [[[[[[["FuncNoLocals(" + out <- [[[[[[[ [type]Append["NoLocals("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ [[func]Inputs >>]Length ] - ]Append[",\n\tCallSpace 32)\n\n"]//TODO: Fill in with calculated callspace value + ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] - ]Append["EndFunc"] + ]Append["EndFuncNoLocals"] }{ - out <- [[[[[[[[[["Func(" + out <- [[[[[[[[ [type]Append["("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ [[func]Inputs >>]Length ] - ]Append[",\n\tCallSpace 32,\n\t"]//TODO: Fill in with calculated callspace value - ]Append[["l_"]Append[cname]] ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] ]Append[[func]Set Outputs] - ]Append["EndFunc"] + ]Append[[["EndFunc("]Append[fname]]Append[")"]] } }{ @@ -1128,10 +1138,15 @@ } _Dispatch Switch[text,func,raw name:out] -{ - name <- Escape Rhope Name[raw name] - out <- [[text]Append[ [[[["\tcase FUNC_"]Append[name]]Append[": goto f_"]]Append[name]]Append[";\\\n"] ] - ]Append[Fold[["_Dispatch Switch Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] +{ + If[[[func]Convention >>] = ["rhope"]] + { + name <- Escape Rhope Name[raw name] + out <- [[text]Append[ [[[["\tcase FUNC_"]Append[name]]Append[": goto f_"]]Append[name]]Append[";\\\n"] ] + ]Append[Fold[["_Dispatch Switch Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] + }{ + out <- text + } } _Dispatch Enum Sub[text, num, name:out] @@ -1145,10 +1160,15 @@ } _Dispatch Enum[text,func,raw name:out] -{ - name <- Escape Rhope Name[raw name] - out <- [[text]Append[ [["\tFUNC_"]Append[name]]Append[",\n"] ] - ]Append[Fold[["_Dispatch Enum Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] +{ + If[[[func]Convention >>] = ["rhope"]] + { + name <- Escape Rhope Name[raw name] + out <- [[text]Append[ [["\tFUNC_"]Append[name]]Append[",\n"] ] + ]Append[Fold[["_Dispatch Enum Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] + }{ + out <- text + } } Dispatch@C Program[program:out] @@ -1159,6 +1179,18 @@ ]Append["#define DISPATCH switch(func) { \\\n"] ]Append[Fold["_Dispatch Switch", "", [program]Functions >>]] ]Append["\tcase END: goto DO_END;\\\n}\n\n"] +} + +Not Native[func:out] +{ + If[[[func]Convention >>] = ["rhope"]] + { out <- No } + { out <- Yes } +} + +Native[func:out] +{ + out <- [[func]Convention >>] = ["rhope"] } Text@C Program[program:out] @@ -1174,14 +1206,20 @@ #include \"blueprint.h\" #include \"array.h\" #include \"bool.h\"\n\n" - out <- [[[[[[[[headers + out <- [[[[[[[[[[[headers ]Append[[program]Dispatch] - ]Append[[[program]Type Registry >>]Type Defs] - ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], - Fold["_Consts C Program", + ]Append[[[program]Type Registry >>]Type Defs] + ]Append[Fold["_Consts C Program", Fold["_Defs C Program", "", [program]Functions >>], - constants - ], [program]Functions >>]] + constants]] + ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], "", Filter[[program]Functions >>, "Not Native"]]] + ]Append["\n +void rhope(uint32_t func) +{ + uint16_t resume,idx; + context * ct; + calldata * cdata, *temp_cdata;"] + ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], "", Filter[[program]Functions >>, "Native"]]] ]Append["\n\nint main(int argc, char **argv) { register_builtin_types();\n\n"] diff -r e1fd6d244f14 -r 1db811fa4744 runtime/func.h --- a/runtime/func.h Sun May 30 17:34:36 2010 -0400 +++ b/runtime/func.h Tue Jun 01 01:13:54 2010 -0400 @@ -54,11 +54,11 @@ #define MethodDispatch(type_id,name,type_name) \ case type_id:\ - goto m_ ## name ## _AT_ ## type_name; + goto m_ ## name ## AT_ ## type_name; #define MethodImpl(name,type_name,mytype_id,numparams) \ -f_ ## name ## _AT_ ## type_name:\ -sf_ ## name ## _AT_ ## type_name:\ +f_ ## name ## AT_ ## type_name:\ +sf_ ## name ## AT_ ## type_name:\ if (cdata->num_params < 1)\ goto _exception;\ if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ @@ -66,15 +66,15 @@ puts("uh oh, need conversion and that's not implemented yet!");\ exit(1);\ }\ -m_ ## name ## _AT_ ## type_name:\ +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)); + lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name)); #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \ -f_ ## name ## _AT_ ## type_name:\ -sf_ ## name ## _AT_ ## type_name:\ +f_ ## name ## AT_ ## type_name:\ +sf_ ## name ## AT_ ## type_name:\ if (cdata->num_params < 1)\ goto _exception;\ if(get_blueprint(cdata->params[0])->type_id != mytype_id)\ @@ -82,7 +82,7 @@ puts("uh oh, need conversion and that's not implemented yet!");\ exit(1);\ }\ -m_ ## name ## _AT_ ## type_name:\ +m_ ## name ## AT_ ## type_name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[0-idx]); cdata->num_params = numparams; @@ -100,7 +100,7 @@ #define Ret(num,val) cdata->params[0-num] = (object *)(val); #define Exception #define FuncDef(name) lt_ ## name * lv_ ## name; -#define MethodDef(name) lt_ ## name ## _AT_ ## type_name * lv_ ## name ## _AT_ ## type_name; +#define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); @@ -123,7 +123,7 @@ temp_cdata = cdata->lastframe;\ free_stack(ct, cdata);\ cdata = temp_cdata;\ - lv_ ## myname ## _AT_ ## type_name = (lt_ ## myname ## _AT_ ## type_name *)(cdata+1); + lv_ ## myname ## AT_ ## type_name = (lt_ ## myname ## AT_ ## type_name *)(cdata+1); #define TPrepCall(callspace) \ func = cdata->lastframe->func;\