Mercurial > repos > rhope
diff cbackend.rhope @ 66:d4b44ae2e34a
New variant of C backend works now
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jun 2010 20:29:10 -0400 |
parents | 1db811fa4744 |
children | d0ce696786cc |
line wrap: on
line diff
--- a/cbackend.rhope Tue Jun 01 01:13:54 2010 -0400 +++ b/cbackend.rhope Sun Jun 06 20:29:10 2010 -0400 @@ -1,6 +1,5 @@ Import extendlib.rhope Import backendutils.rhope -Import number.rhope Blueprint Blueprint Def { @@ -303,7 +302,7 @@ ]Append[", (special_func)"] ]Append[Escape Rhope Name NU[[ctype]Cleanup >>]] ]Append[");"]]] ] - out <- Fold[[["_Type Init C Field"]Set Input[0, [ctype]Name >>]]Set Input[1, field reg], Fold[[["_Type Init C"]Set Input[0, [ctype]Name >>]]Set Input[1, method reg], start, [ctype]Methods >>], [ctype]Fields >>] + out <- Val[start]//Fold[[["_Type Init C Field"]Set Input[0, [ctype]Name >>]]Set Input[1, field reg], Fold[[["_Type Init C"]Set Input[0, [ctype]Name >>]]Set Input[1, method reg], start, [ctype]Methods >>], [ctype]Fields >>] } Blueprint C Type Registry @@ -414,6 +413,7 @@ Input Types Output Types Resume Index + Last NumParams } C Function[name,inputs,outputs,convention:out] @@ -423,7 +423,7 @@ C Function With Registry[name,inputs,outputs,convention,registry,field reg,type reg:out] { - out <- [[[[[[[[[[[[[Build["C Function"] + out <- [[[[[[[[[[[[[[Build["C Function"] ]Name <<[name] ]Inputs <<[inputs] ]Outputs <<[outputs] @@ -437,6 +437,7 @@ ]Input Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), inputs] ] ]Output Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), outputs] ] ]Resume Index <<[1] + ]Last NumParams <<[-1] } Set Input Type@C Function[func,type,input num:out] @@ -565,7 +566,7 @@ { source <- [psource]Make Op[func] Print[["Release: "]Append[source]] - out <- [func]Add Statement[[["release_ref("]Append[source]]Append[")"]] + out <- [func]Add Statement[[["release_ref((object *)"]Append[source]]Append[")"]] } Set Null@C Function[func,pdest:out] @@ -708,7 +709,23 @@ Func Base@C Function[func,tocall,args,type:out] { rargs <- Map[args, ["Make Op"]Set Input[1, func]] - out <- [[Fold["_Function Arg C", [func]Add Raw Line[ [["PrepCall("]Append[[rargs]Length]]Append[")"] ], rargs] + + If[[[rargs]Length] > [[func]Last NumParams >>]] + { + If[[[func]Last NumParams >>] = [-1]] + { + freed <- Val[func] + }{ + freed <- [func]Add Raw Line["FreeCall"] + } + prepped <- [[freed]Add Raw Line[ [["PrepCall("]Append[[rargs]Length]]Append[")"] ] + ]Last NumParams <<[[rargs]Length] + }{ + prepped <- Val[func] + } + + + out <- [[Fold["_Function Arg C", prepped, rargs] ]Add Raw Line[ [[[[[[[[[type]Append["("] ]Append[tocall] @@ -738,21 +755,14 @@ out <- [func]Add Statement[stmt] } -Field Base@C Function[func,field,args,type:out] -{ - rargs <- Map[args, ["Make Op"]Set Input[1, func]] - out <- [Fold["_Function Arg C", func, rargs] - ]Add Raw Line[[[ [type]Append["("] ]Append[ [[func]Field Registry >>]Field ID[field] ]]Append[")"]] -} - Get Field Call@C Function[func,field,source:out] { - out <- [func]Field Base[field, [()]Append[source], "GFieldCall"] + out <- [func]Func Base[Escape Rhope Name[[field]Append[" >>"]], [()]Append[source], "Call"] } Set Field Call@C Function[func,field,object,value:out] { - out <- [func]Field Base[field, [[()]Append[object]]Append[value], "SFieldCall"] + out <- [func]Func Base[Escape Rhope Name[[field]Append[" <<"]], [[()]Append[object]]Append[value], "Call"] } Tail Method Call@C Function[func,method,args:out] @@ -771,9 +781,9 @@ { [[func]Inputs >>]Find[op] { - out <- [["cdata->params["]Append[~]]Append["]"] + out <- [["my_cdata->params["]Append[~]]Append[" ]"] }{ - out <- ["locals->"]Append[Escape Rhope Name[op]] + out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]Append[Escape Rhope Name[op]] } }{ out <- Escape Rhope Name[op] @@ -784,7 +794,7 @@ { If[[[func]Convention >>] = ["rhope"]] { - out <- ["locals->"]Append[Escape Rhope Name[name]] + out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]Append[Escape Rhope Name[name]] }{ out <- Escape Rhope Name[name] } @@ -803,16 +813,17 @@ Do If@C Function[func,condition,stream:out] { cond <- [condition]Make Op[func] - out <- [Fold["_If C", [[func + out <- [[Fold["_If C", [[func ]Add Raw Line[ [["if("]Append[cond]]Append[")"] ] ]Add Raw Line["{"], [stream]Statements >>] ]Add Raw Line["}"] + ]Resume Index <<[[stream]Resume Index >>] } Result Reference@C Function[func,output:out] { - out <- [["call->params["]Append[output]]Append["]"] + out <- [["cdata->params["]Append[output]]Append["]"] } If Null Else@C Function[func,left,right:out] @@ -829,16 +840,16 @@ ]Append[")"] } -_Set Outputs C[string,inputname,inputnum:out] +_Set Outputs C[string,inputname,inputnum,func:out] { - out <- [string]Append[[[ [ ["\tRet("]Append[inputnum] ]Append[", locals->"]]Append[inputname]]Append[")\n"]] + out <- [string]Append[[[ [ ["\tRet("]Append[inputnum] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]]Append[inputname]]Append[")\n"]] } Set Outputs@C Function[func:out] { If[[[func]Convention >>] = ["rhope"]] { - out <- Fold["_Set Outputs C", "", [func]Outputs >>] + out <- [[[Fold[["_Set Outputs C"]Set Input[3, func], "", [func]Outputs >>]]Append["\tNumRet("]]Append[[[func]Outputs >>]Length]]Append[")\n"] }{ [[func]Outputs >>]Index[0] { @@ -864,7 +875,7 @@ { If[ [[[func]Convention >>] = ["rhope"]] And [[ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]] ] { - localtype <- [[[Fold[["_Output Defs C"]Set Input[3, func], Fold["_Var Defs C","typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} l_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"] + localtype <- [[[Fold[["_Output Defs C"]Set Input[3, func], Fold["_Var Defs C","typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"] }{ localtype <- "" } @@ -881,7 +892,7 @@ ]Append[")\n"] }{ proto <- [["FuncDef("]Append[Escape Rhope Name[[func]Name >>]]]Append[")\n"] - } */ + } */ out <- Val[localtype] }{ out <- [[func]Naked Proto]Append[";\n"] @@ -941,41 +952,50 @@ { Print[["Text@C Function: "]Append[[func]Name >>]] If[ [[func]Convention >>] = ["rhope"] ] - { - ,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] - } + { + ,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 <- [[[[[[[ [type]Append["NoLocals("] + out <- [[[[[[[[ [type]Append["NoLocals("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ [[func]Inputs >>]Length ] ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] - ]Append["EndFuncNoLocals"] + ]Append["EndFuncNoLocals\n"] + ]Append["DISPATCH"] }{ - out <- [[[[[[[[ [type]Append["("] + If[[[func]Last NumParams >>] = [-1]] + { + freecall <- "" + }{ + freecall <- "\n\tFreeCall\n" + } + out <- [[[[[[[[[[ [type]Append["("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ [[func]Inputs >>]Length ] ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] + ]Append[freecall] ]Append[[func]Set Outputs] - ]Append[[["EndFunc("]Append[fname]]Append[")"]] + ]Append[[["EndFunc("]Append[fname]]Append[")\n"]] + ]Append["DISPATCH"] } }{ @@ -1138,17 +1158,23 @@ } _Dispatch Switch[text,func,raw name:out] -{ - If[[[func]Convention >>] = ["rhope"]] +{ + 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 + ]Append[Fold[["_Dispatch Switch Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] + }{ + out <- text } } +_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"] ] +} + _Dispatch Enum Sub[text, num, name:out] { out <- [[[[[text @@ -1160,44 +1186,105 @@ } _Dispatch Enum[text,func,raw name:out] -{ - If[[[func]Convention >>] = ["rhope"]] +{ + 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 + ]Append[Fold[["_Dispatch Enum Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] + }{ + out <- text } } -Dispatch@C Program[program:out] +_Dispatch Enum Methods[text,types,name:out] +{ + out <- [text]Append[ [["\tFUNC_"]Append[Escape Rhope Name[name]]]Append[",\n"] ] +} + +Dispatch@C Program[program,all methods:out] { out <- [[[[["typedef enum {\n" - ]Append[Fold["_Dispatch Enum", "", [program]Functions >>]] + ]Append[Fold["_Dispatch Enum", + [Fold["_Dispatch Enum Methods", "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n"], + [program]Functions >>]] ]Append["\tEND\n} funcids;\n\n"] ]Append["#define DISPATCH switch(func) { \\\n"] - ]Append[Fold["_Dispatch Switch", "", [program]Functions >>]] + ]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"], + [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"] +} + +Not Native[func:out] +{ + If[[[func]Convention >>] = ["rhope"]] + { out <- No } + { out <- Yes } +} + +Native[func:out] +{ + out <- [[func]Convention >>] = ["rhope"] +} + +Local Pointers[text,func:out] +{ + If[ [ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] = [0] ] + { + out <- text + }{ + out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>]]]Append[")\n"]] + } +} + +_Method to Types[dict,name,type:out] +{ + typelist <- [dict]Index[name] {} + { typelist <- () } + + out <- [dict]Set[name, [typelist]Append[[type]Name >>]] + +} + +_Field to Types[dict,field,type:out] +{ + name <- [field]Index[0] + out <- _Method to Types[_Method to Types[dict, [name]Append[" >>"], type], [name]Append[" <<"], type] + +} + +Method to Types[dict,type:out] +{ + out <- Fold[["_Method to Types"]Set Input[2, type], dict, [type]Methods >>] +} + +Field to Types[dict,type:out] +{ + out <- Fold[["_Field to Types"]Set Input[2, type], dict, [type]Fields >>] +} + +_Method Dispatch[text, type, method, reg: out] +{ + out <- [[[[[[[text]Append["\tMethodDispatch("]]Append[ [reg]Type ID[type] ]]Append[","]]Append[Escape Rhope Name[method]]]Append[","]]Append[Escape Rhope Name[type]]]Append[")\n"] +} + +Method Dispatch[text, types, method, reg: out] +{ + out <- [[[Fold[[["_Method Dispatch"]Set Input[2, method]]Set Input[3, reg], [[[text]Append["Method("]]Append[ Escape Rhope Name[method] ]]Append[")\n"], types] + ]Append["EndMethod("] + ]Append[Escape Rhope Name[method]] + ]Append[")\n\n"] } Text@C Program[program:out] { Print["Text@C Program"] + type defs <- [[program]Type Registry >>]Definitions >> constants <- Fold["Combine Consts", Dictionary[], [program]Functions >>] + all methods <- Fold["Field to Types", Fold["Method to Types", Dictionary[], type defs], type defs] headers <- "#include <stdio.h> +#include <stdlib.h> #include \"builtin.h\" #include \"object.h\" #include \"context.h\" @@ -1206,28 +1293,82 @@ #include \"blueprint.h\" #include \"array.h\" #include \"bool.h\"\n\n" - out <- [[[[[[[[[[[headers - ]Append[[program]Dispatch] - ]Append[[[program]Type Registry >>]Type Defs] + out <- [[[[[[[[[[[[[[[headers + ]Append[[program]Dispatch[all methods]] + ]Append[[[program]Type Registry >>]Type Defs] ]Append[Fold["_Consts C Program", Fold["_Defs C Program", "", [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 >>, "Not Native"]]] + ]Append["\n +uint16_t rhope(uint32_t func, object ** params, uint16_t numparams, uint16_t callspace) +{ + uint16_t resume,idx; + context * ct; + calldata * cdata, *temp_cdata, *my_cdata;\n\nFuncDef(Build)\nFuncDef(BlueprintSP_Of)\n"] + ]Append[Fold["Local Pointers", "", [program]Functions >>]] + ]Append[" + ct = new_context(); + cdata = alloc_cdata(ct, NULL, callspace); + cdata->num_params = numparams; + for(idx = 0; idx < numparams; ++idx) + cdata->params[0-idx] = params[idx]; + cdata->func = END; +DISPATCH\n"] + ]Append[Fold[["Method Dispatch"]Set Input[3, [program]Type Registry >>], "", all methods]] + ]Append[" +Func(Build, + NumParams 1) + + Param(0, TYPE_BLUEPRINT) + + lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; + release_ref(cdata->params[0]); + + Ret(0, new_object_bp(lv_Build->bp)) +EndFunc(Build) +DISPATCH + +Func(BlueprintSP_Of, + NumParams 1) + + lv_BlueprintSP_Of->bp = get_blueprint(cdata->params[0]); + release_ref(cdata->params[0]); + + Ret(0, new_object(TYPE_BLUEPRINT)) + ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; +EndFunc(BlueprintSP_Of) +DISPATCH\n"] ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], "", Filter[[program]Functions >>, "Native"]]] - ]Append["\n\nint main(int argc, char **argv) + ]Append[" +DO_END: + for(idx = 0; idx < cdata->num_params; ++idx) + params[idx] = cdata->params[0-idx]; + free_context(ct); + return cdata->num_params; + +_exception: + puts(\"Exception! Trace follows:\"); + while(cdata && cdata->func != END) + { + printf(\"%d\\n\", cdata->func); + cdata = cdata->lastframe; + } + return 0; +} + +#include \"builtin.c\" +#include \"array.c\" + +int main(int argc, char **argv) { + blueprint * bp; register_builtin_types();\n\n"] ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] ]Append[Fold[["_Set Consts C Program"]Set Input[3, [program]Type Registry >>], "", constants]] ]Append[Fold[["_Set Late Consts C"]Set Input[3, [program]Type Registry >>], "", constants]] ]Append[" - rhope(FUNC_Main); + rhope(FUNC_Main, NULL, 0, 0); return 0; }\n\n"]