Mercurial > repos > rhope
diff cbackend.rhope @ 30:914ad38f9b59
Compiler now works for some simple programs
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Sep 2009 19:42:33 -0400 |
parents | e9272f7ebd26 |
children | 3b47a8538df2 |
line wrap: on
line diff
--- a/cbackend.rhope Sat Jun 27 01:50:33 2009 -0400 +++ b/cbackend.rhope Mon Sep 28 19:42:33 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"] + }