diff cbackend.rhope @ 186:ba35ab624ec2

Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:10:02 -0700
parents c6ba9fe45910
children
line wrap: on
line diff
--- a/cbackend.rhope	Wed Jul 27 21:32:40 2011 -0700
+++ b/cbackend.rhope	Fri Oct 07 00:10:02 2011 -0700
@@ -600,6 +600,7 @@
 
 
 
+
 Do AddRef@C Function[func,psource,pdest:out]
 {
     source <- [psource]Make Op[func] 
@@ -698,13 +699,13 @@
 {
 	
 	estore <- Escape Rhope Name[store,[func]Escape Pattern >>]
-	out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append["->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]]
+	out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv("]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]]
 }
 
 Set Global@C Function[func,store,var,src:out]
 {
 	estore <- Escape Rhope Name[store,[func]Escape Pattern >>]
-	cell pointer <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]
+	cell pointer <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")"]
 	out <- [[[[func]Add Statement[[["tmp = copy_object("]Append[[cell pointer]Append["->local_data"]]]Append[")"]]
 		]Add Statement[ [[[["((mutt_"]Append[estore]]Append[" *)tmp)->gs_"]]Append[Escape Rhope Name[var, [func]Escape Pattern >>]]]Append[[" = "]Append[[src]Make Op[func]]] ]
 		]Add Statement[[cell pointer]Append["->local_data = tmp"]]
@@ -951,9 +952,9 @@
 	{
 		[[func]Inputs >>]Find[=[op,?]]
 		{
-			out <- [["my_cdata->params["]Append[String[~]]]Append["	]"]
+			out <- [["my_params("]Append[String[~]]]Append[")"]
 		}{
-			out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]]
+			out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]]]Append[")"]
 		}
 	}{
 		out <- Escape Rhope Name[op,[func]Escape Pattern >>]
@@ -964,7 +965,7 @@
 {
 	If[[[func]Convention >>] = ["rhope"]]
 	{
-		out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]]
+		out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]]]Append[")"]
 	}{
 		out <- Escape Rhope Name[name,[func]Escape Pattern >>]
 	} 
@@ -1002,21 +1003,21 @@
 Discard Outputs@C Function[func,first to discard:out]
 {
 	out <- [[[[[func
-		]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < cdata->num_params; ++idx)"]]
+		]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < numresults; ++idx)"]]
 		]Add Raw Line["{"]
-		]Add Raw Line["	if (cdata->params[idx])"]
-		]Add Raw Line["		release_ref(cdata->params[idx]);"]
+		]Add Raw Line["	if (result(idx))"]
+		]Add Raw Line["		release_ref(result(idx));"]
 		]Add Raw Line["}"]
 }
 
 Result Reference@C Function[func,output:out]
 {
-	out <- [["cdata->params["]Append[String[output]]]Append["]"]
+	out <- [["result("]Append[String[output]]]Append[")"]
 }
 
 Checked Result Reference@C Function[func,output:out]
 {
-	out <- [[[["("]Append[String[output]]]Append[" < cdata->num_params ? cdata->params["]]Append[String[output]]]Append["] : NULL)"]
+	out <- [[[["("]Append[String[output]]]Append[" < numresults ? result("]]Append[String[output]]]Append[") : NULL)"]
 }
 
 
@@ -1036,7 +1037,7 @@
 
 _Set Outputs C[string,inputname,inputnum,func:out]
 {
-	out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append[")\n"]]
+	out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append["))\n"]]
 }
 
 Set Outputs@C Function[func:out]
@@ -1055,15 +1056,15 @@
 }
 _Output Defs C[string,varname,index,func:out]
 {
-	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[" "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[";\n"]
+	out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[", "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[")"]
 }
 _Var Defs C[string,type,varname,p:out]
 {
-	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[type,p]] ]]Append[[" "]Append[Escape Rhope Name[varname,p]]]]Append[";\n"]
+	out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[type,p]] ]]Append[[", "]Append[Escape Rhope Name[varname,p]]]]Append[")"]
 }
 _Global Cell Defs C[func,p,string,store:out]
 {
-	out <- [string]Append[ [["\ttrans_cell *gs_"]Append[Escape Rhope Name[store,p]]]Append[";\n"] ]
+	out <- [string]Append[ [[" lvar(trans_cell *, gs_"]Append[Escape Rhope Name[store,p]]]Append[")"] ]
 }
 
 
@@ -1073,7 +1074,22 @@
 	{
 	If[ [[[func]Convention >>] = ["rhope"]] And [[ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]] ]
 	{
-		localtype <- [[[Fold[_Global Cell Defs C[func,[func]Escape Pattern >>,?], Fold[_Output Defs C[?, ?, ?, func], Fold[_Var Defs C[?,?,?,[func]Escape Pattern >>],"typedef struct {\n", [func]Variables >>], [func]Outputs >>], [func]Uses >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[";\n"]
+		ename <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]
+		localtype <- [
+			[
+				[
+					Fold[
+						_Global Cell Defs C[func,[func]Escape Pattern >>,?], 
+						Fold[
+							_Output Defs C[?, ?, ?, func], 
+							Fold[
+								_Var Defs C[?,?,?,[func]Escape Pattern >>],
+								["#define ldec_"]Append[ename],
+								[func]Variables >>], 
+							[func]Outputs >>], 
+						[func]Uses >>]
+				]Append["\nLocalsType(ldec_"]]Append[ename]
+		]Append[ [[", "]Append[ename]]Append[")\n"] ]
 	}{
 		localtype <- ""
 	}
@@ -1147,7 +1163,7 @@
 Find Trans Cell@C Function[func,text,store:out]
 {
 	estore <- Escape Rhope Name[store,[func]Escape Pattern >>]
-	out <- [text]Append[  [[[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append[[[" = find_obj_cell(ct->transaction, gs_"]Append[estore]]Append[");\n"]] ]
+	out <- [text]Append[  [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[[[") = find_obj_cell(cur_transaction, gs_"]Append[estore]]Append[");\n"]] ]
 }
 
 Text@C Function[func:out]
@@ -1177,10 +1193,12 @@
 		}
 		If[ [ [[[[func]Variables >>]Length]+[[[func]Outputs >>]Length]]+[[[func]Uses >>]Length] ] = [0] ]
 		{
-			out <- [[[[[[[[[ [type]Append["NoLocals("]
+			out <- [[[[[[[[[[[ [type]Append["NoLocals("]
 				]Append[cname]
 				]Append[",\n\tNumParams "]
 				]Append[ String[[[func]Inputs >>]Length] ]
+				]Append[",\n\tNumOutputs "]
+				]Append[ String[[[func]Outputs >>]Length] ]
 				]Append[")\n\n"]
 				]Append[param check]
 				]Append[ [[func]Statements >>]Join[""] ]
@@ -1193,18 +1211,20 @@
 				begin trans <- [[[["\tbegin_transaction(ct, "]Append[ String[[[func]Uses >>]Length] ]]Append[", "]]Append[ [Map[Map[[func]Uses >>, Escape Rhope Name[?, [func]Escape Pattern >>]], ["gs_"]Append[?]]]Join[", "] ]]Append[");\n"]
 				init trans <- [[Fold[Find Trans Cell[func,?], begin trans, [func]Uses >>]
 					]Append[[["transretry_"]Append[fname]]Append[":\n"]]
-					]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { add_ref(cdata->params[idx]); }\n"]
+					]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { add_ref(my_params(idx)); }\n"] ]
 				//TODO: Figure out whether this is a readonly or write transaction
 				commit trans <- [[["\tif(!commit_transaction(ct, 0)) { prep_retry(ct); goto transretry_"]Append[fname]]Append["; }\n"]
-					]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { release_ref(cdata->params[idx]); }\n"]
+					]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { release_ref(my_params(idx)); }\n"] ]
 			}{
 				init trans <- ""
 				commit trans <- ""
 			}
-			out <- [[[[[[[[[[[[ [type]Append["("]
+			out <- [[[[[[[[[[[[[[ [type]Append["("]
 				]Append[cname]
 				]Append[",\n\tNumParams "]
 				]Append[ String[[[func]Inputs >>]Length] ]
+				]Append[",\n\tNumOutputs "]
+				]Append[ String[[[func]Outputs >>]Length] ]
 				]Append[")\n\n"]
 				]Append[param check]
 				]Append[init trans]
@@ -1519,11 +1539,11 @@
 _Dispatch Enum Sub[text, num, name:out]
 {
 	out <- [[[[[text
-		]Append["\tRES_"]
+		]Append["\tResEnum("]
 		]Append[String[num]]
-		]Append["_"]
+		]Append[", "]
 		]Append[name]
-		]Append[",\n"]
+		]Append[")\n"]
 }
 
 _Dispatch Enum[text,func,raw name:out]
@@ -1547,7 +1567,7 @@
 {
 	out <- [[[[["typedef enum {\n"
 		]Append[Fold[_Dispatch Enum[?], 
-			[Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tRES_1_Pause,\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tRES_1_RunSP_Bytecode,\n"], 
+			[Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tResEnum(1, Pause)\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tResEnum(1, RunSP_Bytecode)\n"], 
 			[program]Functions >>]]
 		]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"]
 		]Append["#define DispatchEntries \\\n"] 
@@ -1575,7 +1595,13 @@
 	{
 		out <- text
 	}{
-		out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]]
+		If[[[func]Name >>]Contains["@"]]
+		{
+			deftype <- "\tMethodDef("
+		}{
+			deftype <- "\tFuncDef("
+		}
+		out <- [text]Append[[[deftype]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]]
 	}
 }
 
@@ -1673,14 +1699,7 @@
 #include \"array.c\"
 #include \"worker.c\"
 
-int main(int argc, char **argv)
-{
-	blueprint * bp;
-	int numret;
-	int idx;
-	object * inout[3];
-	register_builtin_types();
-	register_type_byid(TYPE_MUTABLEGLOBAL, sizeof(mutable_object)-sizeof(object), NULL, NULL, NULL);\n\n"]
+#include \"main_start.c\" \n\n"]
 		]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ]
 		]Append[Fold[_Global Type Inits C[?, ?, p], "", [program]Global Stores >>]]
 		]Append[Fold[_Set Consts C Program[?, ?, ?, [program]Type Registry >>], "", constants]]
@@ -1688,40 +1707,16 @@
 		]Append[Fold[_Global Store Inits C[?, ?, [program]Type Registry >>], "", [program]Global Stores >>]]
 		]Append[Fold[Init Type Names[?, ?, ?, [program]Type Registry >>], "", [[program]Type Registry >>]Lookup >>]]
 		]Append["
-	rhope(FUNC_List, inout, 0, 1);
-	for (idx = 0; idx < argc; ++idx)
-	{
-		inout[1] = make_String(argv[idx]);
-		rhope(FUNC_Append, inout, 2, 2);
-	}
-	numret = rhope(FUNC_Main, inout, 1, 1);
-#ifdef ENABLE_LEAK_DETECTION\n"]
+#include \"main_mid.c\"
+
+#ifdef ENABLE_LEAK_DETECTION\n\n"]
 		]Append[Fold[_Consts C Release[?, ?, ?, p], "", constants]]
 		]Append[
 	"
 	print_mem_info(manager);
 	print_live_object_types(manager);
 #endif //ENABLE_LEAK_DETECTION
-	
-#ifdef ENABLE_PROFILING
-	for (idx = 0; idx < END; ++idx)
-	{
-		if(profile_counts[idx])
-			printf(\"Func: %d\tCount: %llu\tTime: %llu\tAvg: %f\tSelf: %llu\tAvg: %f\tNested Count: %llu\\n\", idx, profile_counts[idx], profile_totals[idx], ((double)profile_totals[idx])/((double)profile_counts[idx]), profile_selftotals[idx], ((double)profile_selftotals[idx])/((double)profile_counts[idx]), profile_nestedcounts[idx]);
-	}
-#endif
-	if (!numret)
-		return 0;
-	if (numret < 0)
-		return numret;
-	if (get_blueprint(inout[0])->type_id == TYPE_INT32)
-		return ((t_Int32 *)inout[0])->Num;
-
-	rhope(FUNC_If, inout, 1, 2);
-	if (inout[0])
-		return 0;
-	return 1;
-}\n\n"]
+#include \"main_end.c\"\n\n"]
 
 }