diff cbackend.rhope @ 14:69dfca29565f

C backend close to being useable
author Mike Pavone <pavone@retrodev.com>
date Tue, 26 May 2009 23:52:32 +0000
parents 31f8182f3433
children ea991f95ae1f
line wrap: on
line diff
--- a/cbackend.rhope	Mon May 25 23:34:36 2009 -0400
+++ b/cbackend.rhope	Tue May 26 23:52:32 2009 +0000
@@ -14,6 +14,49 @@
 	out <- [[[[Build["Blueprint Def"]]Name <<[name]]Fixed Size <<[0]]Fields <<[()]]Methods <<[New@Dictionary[]]
 }
 
+Blueprint C Method Registry
+{
+	Lookup
+	Next ID
+}
+
+C Method Registry[:out]
+{
+	builtins <- [[[[[[[[[[[[[New@Dictionary[]
+		]Set["+", "METHOD_ADD"]
+		]Set["-", "METHOD_SUB"]
+		]Set["/", "METHOD_DIV"]
+		]Set["*", "METHOD_MUL"]
+		]Set["LShift", "METHOD_LSHIFT"]
+		]Set["RShift", "METHOD_RSHIFT"]
+		]Set["=", "METHOD_EQUALS"]
+		]Set[">", "METHOD_GREATER"]
+		]Set["<", "METHOD_LESS"]
+		]Set["If", "METHOD_IF"]
+		]Set["Set Missing Field", "METHOD_SETFIELDMISSING"]
+		]Set["Get Missing Field", "METHOD_GETFIELDMISSING"]
+		]Set["Missing Method", "METHOD_MISSING"]
+	out <- [[Build["C Method Registry"]]Lookup <<[builtins]]Next ID<<[0]
+
+}
+
+Register Method@C Method Registry[reg,method:out]
+{
+	[[reg]Lookup >>]Index[method]
+	{
+		out <- reg
+	}{
+		method ID <- [reg]Next ID>>
+		new lookup <- [[reg]Lookup >>]Set[method, ["METHOD_FIRST_USER+"]Append[method ID]]
+		out <- [[reg]Lookup <<[new lookup]]Next ID <<[[method ID]+[1]]
+	}
+}
+
+Method ID@C Method Registry[reg,method:out]
+{
+	out <- [[reg]Lookup >>]Index[method]
+}
+
 Blueprint C Function
 {
 	Name
@@ -22,17 +65,24 @@
 	Convention
 	Variables
 	Statements
+	Method Registry
 }
 
 C Function[name,inputs,outputs,convention:out]
 {
-	out <- [[[[[[Build["C Function"]
+	out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[]]
+}
+
+C Function With Registry[name,inputs,outputs,convention,registry:out]
+{
+	out <- [[[[[[[Build["C Function"]
 		]Name <<[name]
 		]Inputs <<[inputs]
 		]Outputs <<[outputs]
 		]Convention <<[convention]
 		]Variables <<[New@Dictionary[]]
 		]Statements <<[()]
+		]Method Registry <<[registry]
 }
 
 Allocate Var@C Function[func,name,type:out]
@@ -45,8 +95,16 @@
 	out <- [func]Statements <<[ [[func]Statements >>]Append[["\t"]Append[[statement]Append[";\n"]]] ]
 }
 
-Add Operator Statement@C Function[func,source1,source2,dest,op:out]
+Add Raw Line@C Function[func,line:out]
 {
+	out <- [func]Statements <<[ [[func]Statements >>]Append[["\t"]Append[[line]Append["\n"]]] ]
+}
+
+Add Operator Statement@C Function[func,psource1,psource2,pdest,op:out]
+{
+	source1 <- [psource1]Make Op[func]
+	source2 <- [psource2]Make Op[func]
+	dest <- [pdest]Make Op[func]
 	out <- [func]Add Statement[[[[[dest]Append[" = "]]Append[source1]]Append[op]]Append[source2]]
 }
 
@@ -70,12 +128,86 @@
 	out <- [func]Add Operator Statement[source1,source2,dest," / "]
 }
 
-Move@C Function[func,source,dest:out]
+Move@C Function[func,psource,pdest:out]
 {
+	source <- [psource]Make Op[func]
+	dest <- [pdest]Make Op[func]
 	out <- [func]Add Statement[[[dest]Append[" = "]]Append[source]]
 }
 
-Init Outputs@C Function[func]
+AddRef@C Function[func,psource,pdest:out]
+{
+        source <- [psource]Make Op[func] 
+        dest <- [pdest]Make Op[func]
+        out <- [func]Add Statement[[[[dest]Append[" = add_ref("]]Append[source]]Append[")"]]
+}
+
+Release@C Function[func,psource:out]
+{
+	source <- [psource]Make Op[func]
+	out <- [func]Add Statement[[["release_ref("]Append[source]]Append[")"]]
+}
+
+Null@C Function[func,pdest:out]
+{
+	dest <- [pdest]Make Op[func]
+	out <- [func]Add Statement[[dest]Append[" = NULL;"]]
+}
+
+_Method Arg[func,val,inputnum:out]
+{
+	out <- [func]Add Statement[
+		[[["call->params["
+		]Append[inputnum]
+		]Append["] = "]
+		]Append[val]
+	]
+}
+
+Method Call@C Function[func,method,args:out]
+{
+	rargs <- Map[args, ["Make Op"]Set Input[1, func]]
+	out <- [Fold["_Method Arg", func, rargs]
+	]Add Raw Line[[[[["MCall("]Append[ [[func]Method Registry >>]Method ID[method] ]]Append[", "]]Append[ [rargs]Length ]]Append[")"]]
+}
+
+Resolve@C Function[func,op:out]
+{
+	[[func]Inputs >>]Find[op]
+	{
+		out <- [["cdata->params["]Append[~]]Append["]"]
+	}{
+		out <- ["locals->"]Append[Escape Rhope Name[op]]
+	}
+}
+
+Instruction Stream@C Function[func:out]
+{
+	out <- [func]Statements <<[()]
+}
+
+_If C[func, statement:out]
+{
+	out <- [func]Statements <<[ [[func]Statements >>]Append[ ["\t"]Append[statement] ] ]
+}
+
+Do If@C Function[func,condition,stream:out]
+{
+	cond <- [condition]Make Op[func]
+	out <- [Fold["_If C", [[func
+		]Add Raw Line[ [["if("]Append[cond]]Append[")"] ]
+		]Add Raw Line["{"], [stream]Statements >>]
+		]Add Raw Line["}"]
+	{ Print["Do if done"] }
+
+}
+
+Result Reference@C Function[func,output:out]
+{
+	out <- [["call->params["]Append[output]]Append["]"]
+}
+
+Init Outputs@C Function[func:out]
 {
 	If[[[[func]Outputs >>]Length ] > [0]]
 	{
@@ -85,30 +217,69 @@
 	}
 }
 
-Release Inputs@C Function[func]
+_Release Inputs[string,inputname,inputnum:out]
+{
+	out <- [[[string
+		]Append["\trelease_ref(cdata->params["]
+		]Append[inputnum]
+		]Append["]);\n"]
+}
+
+Release Inputs@C Function[func:out]
 {
 	If[[[[func]Inputs >>]Length ] > [0]]
 	{
-		out <- [["\trelease_ref(->"]Append[ [[func]Outputs >>]Join[" = NULL;\n\tlocals->"] ]]Append[" = NULL;\n"]
+		out <- Fold["_Release Inputs", "", [func]Inputs >>] 
 	}{
 		out <- ""
 	}
 }
 
+_Set Outputs C[string,inputname,inputnum:out]
+{
+	out <- [string]Append[[[ [ ["\tRet("]Append[inputnum] ]Append[", locals->"]]Append[inputname]]Append[")\n"]]
+}
+
+Set Outputs@C Function[func:out]
+{
+	If[[[[func]Outputs >>]Length ] > [0]]
+	{
+		out <- Fold["_Set Outputs C", "", [func]Outputs >>]
+	}{
+		out <- ""
+	}
+}
+_Output Defs C[string,varname:out]
+{
+	Print[varname]
+	out <- [[[string]Append["\tobject *"]]Append[Escape Rhope Name[varname]]]Append[";\n"]
+}
+_Var Defs C[string,type,varname:out]
+{
+	Print[type]
+	{Print[varname]}
+	out <- [[[string]Append["\tobject *"]]Append[Escape Rhope Name[varname]]]Append[";\n"]
+}
+
 Definitions@C Function[func:out]
 {
-	
+	Print["Definitions"]
+	out <- [[[Fold["_Definitions C", Fold["_Definitions","typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} l_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"]
 }
 
 Text@C Function[func:out]
 {
 	cname <- Escape Rhope Name[[func]Name >>]
-	out <- [[[[[[["Func("
+	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]Init Outputs]
-}
\ No newline at end of file
+		]Append[ [[func]Statements >>]Join[""] ]
+		]Append[[func]Set Outputs]
+		]Append["EndFunc"]
+
+}
+