Mercurial > repos > rhope
view cbackend.rhope @ 17:d05184970c1c
Merged accidentally created head
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 26 May 2009 23:37:59 -0400 |
parents | 69dfca29565f |
children | ea991f95ae1f |
line wrap: on
line source
Import extendlib.rhope Import backendutils.rhope Blueprint Blueprint Def { Name Fixed Size Fields Methods } Blueprint Def[name] { 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 Inputs Outputs Convention Variables Statements Method Registry } C Function[name,inputs,outputs,convention:out] { 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] { out <- [func]Variables <<[ [[func]Variables >>]Set[name,type] ] } Add Statement@C Function[func,statement:out] { out <- [func]Statements <<[ [[func]Statements >>]Append[["\t"]Append[[statement]Append[";\n"]]] ] } 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]] } Add@C Function[func,source1,source2,dest:out] { out <- [func]Add Operator Statement[source1,source2,dest," + "] } Sub@C Function[func,source1,source2,dest:out] { out <- [func]Add Operator Statement[source1,source2,dest," - "] } Multiply@C Function[func,source1,source2,dest:out] { out <- [func]Add Operator Statement[source1,source2,dest," * "] } Divide@C Function[func,source1,source2,dest:out] { out <- [func]Add Operator Statement[source1,source2,dest," / "] } 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]] } 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]] { out <- [["\tlocals->"]Append[ [[func]Outputs >>]Join[" = NULL;\n\tlocals->"] ]]Append[" = NULL;\n"] }{ out <- "" } } _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 <- 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(" ]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"] }