comparison 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
comparison
equal deleted inserted replaced
29:3cc5e4a42344 30:914ad38f9b59
64 Outputs 64 Outputs
65 Convention 65 Convention
66 Variables 66 Variables
67 Statements 67 Statements
68 Method Registry 68 Method Registry
69 Constants
69 } 70 }
70 71
71 C Function[name,inputs,outputs,convention:out] 72 C Function[name,inputs,outputs,convention:out]
72 { 73 {
73 out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[]] 74 out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[]]
74 } 75 }
75 76
76 C Function With Registry[name,inputs,outputs,convention,registry:out] 77 C Function With Registry[name,inputs,outputs,convention,registry:out]
77 { 78 {
78 out <- [[[[[[[Build["C Function"] 79 out <- [[[[[[[[Build["C Function"]
79 ]Name <<[name] 80 ]Name <<[name]
80 ]Inputs <<[inputs] 81 ]Inputs <<[inputs]
81 ]Outputs <<[outputs] 82 ]Outputs <<[outputs]
82 ]Convention <<[convention] 83 ]Convention <<[convention]
83 ]Variables <<[New@Dictionary[]] 84 ]Variables <<[New@Dictionary[]]
84 ]Statements <<[()] 85 ]Statements <<[()]
85 ]Method Registry <<[registry] 86 ]Method Registry <<[registry]
87 ]Constants <<[New@Dictionary[]]
88 }
89
90 Register Constant@C Function[func,name,constant:out]
91 {
92 Print["Register Constant"]
93 Print[name]
94 Print[constant]
95 out <- [func]Constants <<[ [[func]Constants >>]Set[name, constant] ]
96 { Print["Got register constant output"] }
86 } 97 }
87 98
88 Allocate Var@C Function[func,name,type:out] 99 Allocate Var@C Function[func,name,type:out]
89 { 100 {
90 out <- [func]Variables <<[ [[func]Variables >>]Set[name,type] ] 101 out <- [func]Variables <<[ [[func]Variables >>]Set[name,type] ]
146 { 157 {
147 source <- [psource]Make Op[func] 158 source <- [psource]Make Op[func]
148 out <- [func]Add Statement[[["release_ref("]Append[source]]Append[")"]] 159 out <- [func]Add Statement[[["release_ref("]Append[source]]Append[")"]]
149 } 160 }
150 161
151 Null@C Function[func,pdest:out] 162 Set Null@C Function[func,pdest:out]
152 { 163 {
153 dest <- [pdest]Make Op[func] 164 dest <- [pdest]Make Op[func]
154 out <- [func]Add Statement[[dest]Append[" = NULL"]] 165 out <- [func]Add Statement[[dest]Append[" = NULL"]]
166 }
167
168 Lookup Constant@C Function[func,const:out]
169 {
170 out <- [["add_ref(_const_"]Append[Escape Rhope Name[const]]]Append[")"]
155 } 171 }
156 172
157 _Function Arg C[func,val,inputnum:out] 173 _Function Arg C[func,val,inputnum:out]
158 { 174 {
159 out <- [func]Add Statement[ 175 out <- [func]Add Statement[
169 out <- [func]Func Base[[[func]Method Registry >>]Method ID[method],args, "MCall"] 185 out <- [func]Func Base[[[func]Method Registry >>]Method ID[method],args, "MCall"]
170 } 186 }
171 187
172 Call@C Function[func,name,args:out] 188 Call@C Function[func,name,args:out]
173 { 189 {
174 out <- [func]Func Base[name,args, "Call"] 190 out <- [func]Func Base[Escape Rhope Name[name],args, "Call"]
175 } 191 }
176 192
177 Func Base@C Function[func,tocall,args,type:out] 193 Func Base@C Function[func,tocall,args,type:out]
178 { 194 {
179 rargs <- Map[args, ["Make Op"]Set Input[1, func]] 195 rargs <- Map[args, ["Make Op"]Set Input[1, func]]
186 out <- [func]Func Base[[[func]Method Registry >>]Method ID[method],args, "TMCall"] 202 out <- [func]Func Base[[[func]Method Registry >>]Method ID[method],args, "TMCall"]
187 } 203 }
188 204
189 Tail Call@C Function[func,name,args:out] 205 Tail Call@C Function[func,name,args:out]
190 { 206 {
191 out <- [func]Func Base[name,args, "TCall"] 207 out <- [func]Func Base[Escape Rhope Name[name],args, "TCall"]
192 } 208 }
193 209
194 Resolve@C Function[func,op:out] 210 Resolve@C Function[func,op:out]
195 { 211 {
196 [[func]Inputs >>]Find[op] 212 [[func]Inputs >>]Find[op]
289 } 305 }
290 306
291 307
292 Definitions@C Function[func:out] 308 Definitions@C Function[func:out]
293 { 309 {
294 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"] 310 If[ [ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]]
311 {
312 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"]
313 }{
314 out <- ""
315 }
295 } 316 }
296 317
297 Text@C Function[func:out] 318 Text@C Function[func:out]
298 { 319 {
299 cname <- Escape Rhope Name[[func]Name >>] 320 cname <- Escape Rhope Name[[func]Name >>]
300 out <- [[[[[[[[["Func(" 321 If[ [[[func]Variables >>]Length] = [0] ]
301 ]Append[cname] 322 {
302 ]Append[",\n\tNumParams "] 323 out <- [[[[[["FuncNoLocals("
303 ]Append[ [[func]Inputs >>]Length ] 324 ]Append[cname]
304 ]Append[",\n\tCallSpace 32,\n\t"]//TODO: Fill in with calculated callspace value 325 ]Append[",\n\tNumParams "]
305 ]Append[["l_"]Append[cname]] 326 ]Append[ [[func]Inputs >>]Length ]
306 ]Append[")\n\n"] 327 ]Append[",\n\tCallSpace 32)\n\n"]//TODO: Fill in with calculated callspace value
307 ]Append[ [[func]Statements >>]Join[""] ] 328 ]Append[ [[func]Statements >>]Join[""] ]
308 ]Append[[func]Set Outputs] 329 ]Append["EndFunc"]
309 ]Append["EndFunc"] 330 }{
310 331 out <- [[[[[[[[["Func("
332 ]Append[cname]
333 ]Append[",\n\tNumParams "]
334 ]Append[ [[func]Inputs >>]Length ]
335 ]Append[",\n\tCallSpace 32,\n\t"]//TODO: Fill in with calculated callspace value
336 ]Append[["l_"]Append[cname]]
337 ]Append[")\n\n"]
338 ]Append[ [[func]Statements >>]Join[""] ]
339 ]Append[[func]Set Outputs]
340 ]Append["EndFunc"]
341 }
311 } 342 }
312 343
313 Blueprint C Program 344 Blueprint C Program
314 { 345 {
315 Functions 346 Functions
336 is,isnot <- [[program]Method Registry >>]Method ID[funcname] 367 is,isnot <- [[program]Method Registry >>]Method ID[funcname]
337 } 368 }
338 369
339 _Defs C Program[text,func:out] 370 _Defs C Program[text,func:out]
340 { 371 {
341 Print["start _Defs"] 372 def <- [func]Definitions
342 out <- [text]Append[[func]Definitions] 373 If[[def]=[""]]
343 { Print["_Defs done"] } 374 {
375 out <- text
376 }{
377 out <- [text]Append[[def]Append["\n\n"]]
378 }
344 } 379 }
345 380
346 _Text C Program[text,func:out] 381 _Text C Program[text,func:out]
347 { 382 {
348 Print["start _Text"] 383 out <- [text]Append[[[func]Text]Append["\n\n"]]
349 out <- [text]Append[[func]Text] 384 }
350 { Print["_Text done"] } 385
386 Combine Consts[consts,func:out]
387 {
388 out <- Combine[[func]Constants >>, consts]
389 }
390
391 _Consts C Program[text,value,name:out]
392 {
393 out <- [text]Append[ [["object * _const_"]Append[Escape Rhope Name[name]]]Append[";\n"] ]
394 }
395
396 _Set Consts C Program[text,value,name:out]
397 {
398 //TODO: Support more constant types
399 out <- [text]Append[[[[["\t_const_"]Append[Escape Rhope Name[name]]]Append[" = make_Int32("]]Append[value]]Append[");\n"]]
351 } 400 }
352 401
353 Text@C Program[program:out] 402 Text@C Program[program:out]
354 { 403 {
355 out <- Fold["_Text C Program", Fold["_Defs C Program", "", [program]Functions >>], [program]Functions >>] 404 constants <- Fold["Combine Consts", New@Dictionary[], [program]Functions >>]
356 } 405 headers <- "#include <stdio.h>
357 406 #include \"builtin.h\"
358 407 #include \"object.h\"
408 #include \"context.h\"
409 #include \"func.h\"
410 #include \"integer.h\"\n\n"
411 out <- [[[[headers]Append[Fold["_Text C Program",
412 Fold["_Consts C Program",
413 Fold["_Defs C Program", "", [program]Functions >>],
414 constants
415 ], [program]Functions >>]]
416 ]Append["int main(int argc, char **argv)
417 {
418 returntype ret;
419 calldata *cdata;
420 context * ct;
421 register_builtin_types();\n\n"]
422 ]Append[Fold["_Set Consts C Program", "", constants]]
423 ]Append["
424 ct = new_context();
425 cdata = alloc_cdata(ct, 0);
426 cdata->num_params = 0;
427 cdata->resume = 0;
428 ret = f_Main(cdata);
429 while(ret == TAIL_RETURN)
430 ret = cdata->tail_func(cdata);
431 if(ret == EXCEPTION_RETURN) {
432 puts(\"Exception!\");
433 return -1;
434 }
435 return 0;
436 }\n\n"]
437
438 }
439
440