Mercurial > repos > rhope
comparison cbackend.rhope @ 32:9ee9adc696e7
Merged changes
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Sep 2009 19:49:06 -0400 |
parents | 914ad38f9b59 |
children | 3b47a8538df2 |
comparison
equal
deleted
inserted
replaced
31:fab5bb137cf9 | 32:9ee9adc696e7 |
---|---|
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 |