changeset 65:1db811fa4744

Handle native Rhope functions and plain C functions separately as part of move to new C strategy
author Mike Pavone <pavone@retrodev.com>
date Tue, 01 Jun 2010 01:13:54 -0400
parents e1fd6d244f14
children d4b44ae2e34a
files cbackend.rhope runtime/func.h
diffstat 2 files changed, 75 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- 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"]
--- 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;\