diff cbackend.rhope @ 32:9ee9adc696e7

Merged changes
author Mike Pavone <pavone@retrodev.com>
date Mon, 28 Sep 2009 19:49:06 -0400
parents 914ad38f9b59
children 3b47a8538df2
line wrap: on
line diff
--- a/cbackend.rhope	Mon Sep 28 19:48:45 2009 -0400
+++ b/cbackend.rhope	Mon Sep 28 19:49:06 2009 -0400
@@ -66,6 +66,7 @@
 	Variables
 	Statements
 	Method Registry
+	Constants
 }
 
 C Function[name,inputs,outputs,convention:out]
@@ -75,7 +76,7 @@
 
 C Function With Registry[name,inputs,outputs,convention,registry:out]
 {
-	out <- [[[[[[[Build["C Function"]
+	out <- [[[[[[[[Build["C Function"]
 		]Name <<[name]
 		]Inputs <<[inputs]
 		]Outputs <<[outputs]
@@ -83,6 +84,16 @@
 		]Variables <<[New@Dictionary[]]
 		]Statements <<[()]
 		]Method Registry <<[registry]
+		]Constants <<[New@Dictionary[]]
+}
+
+Register Constant@C Function[func,name,constant:out]
+{
+	Print["Register Constant"]
+	Print[name]
+	Print[constant]
+	out <- [func]Constants <<[ [[func]Constants >>]Set[name, constant] ]
+	{ Print["Got register constant output"] }
 }
 
 Allocate Var@C Function[func,name,type:out]
@@ -148,12 +159,17 @@
 	out <- [func]Add Statement[[["release_ref("]Append[source]]Append[")"]]
 }
 
-Null@C Function[func,pdest:out]
+Set Null@C Function[func,pdest:out]
 {
 	dest <- [pdest]Make Op[func]
 	out <- [func]Add Statement[[dest]Append[" = NULL"]]
 }
 
+Lookup Constant@C Function[func,const:out]
+{
+	out <- [["add_ref(_const_"]Append[Escape Rhope Name[const]]]Append[")"]
+}
+
 _Function Arg C[func,val,inputnum:out]
 {
 	out <- [func]Add Statement[
@@ -171,7 +187,7 @@
 
 Call@C Function[func,name,args:out]
 {
-	out <- [func]Func Base[name,args, "Call"]
+	out <- [func]Func Base[Escape Rhope Name[name],args, "Call"]
 }
 
 Func Base@C Function[func,tocall,args,type:out]
@@ -188,7 +204,7 @@
 
 Tail Call@C Function[func,name,args:out]
 {
-	out <- [func]Func Base[name,args, "TCall"]
+	out <- [func]Func Base[Escape Rhope Name[name],args, "TCall"]
 }
 
 Resolve@C Function[func,op:out]
@@ -291,23 +307,38 @@
 
 Definitions@C Function[func:out]
 {
-	out <- [[[Fold["_Output Defs C", Fold["_Var Defs C","typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} l_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"]
+	If[ [ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]]
+	{
+		out <- [[[Fold["_Output Defs C", Fold["_Var Defs C","typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} l_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"]
+	}{
+		out <- ""
+	}
 }
 
 Text@C Function[func:out]
 {
 	cname <- Escape Rhope Name[[func]Name >>]
-	out <- [[[[[[[[["Func("
-		]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[ [[func]Statements >>]Join[""] ]
-		]Append[[func]Set Outputs]
-		]Append["EndFunc"]
-
+	If[ [[[func]Variables >>]Length] = [0] ]
+	{
+		out <- [[[[[["FuncNoLocals("
+			]Append[cname]
+			]Append[",\n\tNumParams "]
+			]Append[ [[func]Inputs >>]Length ]
+			]Append[",\n\tCallSpace 32)\n\n"]//TODO: Fill in with calculated callspace value
+			]Append[ [[func]Statements >>]Join[""] ]
+			]Append["EndFunc"]
+	}{
+		out <- [[[[[[[[["Func("
+			]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[ [[func]Statements >>]Join[""] ]
+			]Append[[func]Set Outputs]
+			]Append["EndFunc"]
+	}
 }
 
 Blueprint C Program
@@ -338,21 +369,72 @@
 
 _Defs C Program[text,func:out]
 {
-	Print["start _Defs"]
-	out <- [text]Append[[func]Definitions]
-	{ Print["_Defs done"] }
+	def <- [func]Definitions
+	If[[def]=[""]]
+	{
+		out <- text
+	}{
+		out <- [text]Append[[def]Append["\n\n"]]
+	}
 }
 
 _Text C Program[text,func:out]
 {
-	Print["start _Text"]
-	out <- [text]Append[[func]Text]
-	{ Print["_Text done"] }
+	out <- [text]Append[[[func]Text]Append["\n\n"]]
+}
+
+Combine Consts[consts,func:out]
+{
+	out <- Combine[[func]Constants >>, consts]
+}
+
+_Consts C Program[text,value,name:out]
+{
+	out <- [text]Append[ [["object * _const_"]Append[Escape Rhope Name[name]]]Append[";\n"] ]
+}
+
+_Set Consts C Program[text,value,name:out]
+{
+	//TODO: Support more constant types
+	out <- [text]Append[[[[["\t_const_"]Append[Escape Rhope Name[name]]]Append[" = make_Int32("]]Append[value]]Append[");\n"]]
 }
 
 Text@C Program[program:out]
 {
-	out <- Fold["_Text C Program", Fold["_Defs C Program", "", [program]Functions >>], [program]Functions >>]
+	constants <- Fold["Combine Consts", New@Dictionary[], [program]Functions >>]
+	headers <- "#include <stdio.h>
+#include \"builtin.h\"
+#include \"object.h\"
+#include \"context.h\"
+#include \"func.h\"
+#include \"integer.h\"\n\n"
+	out <- [[[[headers]Append[Fold["_Text C Program", 
+				Fold["_Consts C Program", 
+					Fold["_Defs C Program", "", [program]Functions >>], 
+					constants
+				], [program]Functions >>]]
+		]Append["int main(int argc, char **argv)
+{
+	returntype ret;
+	calldata *cdata;
+	context * ct;
+	register_builtin_types();\n\n"]
+		]Append[Fold["_Set Consts C Program", "", constants]]
+		]Append["
+	ct = new_context();
+	cdata = alloc_cdata(ct, 0);
+	cdata->num_params = 0;
+	cdata->resume = 0;
+	ret = f_Main(cdata);
+	while(ret == TAIL_RETURN)
+		ret = cdata->tail_func(cdata);
+	if(ret == EXCEPTION_RETURN) {
+		puts(\"Exception!\");
+		return -1;
+	}
+	return 0;
+}\n\n"]
+
 }