Mercurial > repos > rhope
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"] + +} +