Mercurial > repos > rhope
comparison cbackend.rhope @ 64:e1fd6d244f14
Some progress on updating C backend to work with new C strategy
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 30 May 2010 17:34:36 -0400 |
parents | 243d013a49cb |
children | 1db811fa4744 |
comparison
equal
deleted
inserted
replaced
63:04baa003de5a | 64:e1fd6d244f14 |
---|---|
411 Field Registry | 411 Field Registry |
412 Type Registry | 412 Type Registry |
413 Constants | 413 Constants |
414 Input Types | 414 Input Types |
415 Output Types | 415 Output Types |
416 Resume Index | |
416 } | 417 } |
417 | 418 |
418 C Function[name,inputs,outputs,convention:out] | 419 C Function[name,inputs,outputs,convention:out] |
419 { | 420 { |
420 out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[], C Field Registry[], C Type Registry[]] | 421 out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[], C Field Registry[], C Type Registry[]] |
421 } | 422 } |
422 | 423 |
423 C Function With Registry[name,inputs,outputs,convention,registry,field reg,type reg:out] | 424 C Function With Registry[name,inputs,outputs,convention,registry,field reg,type reg:out] |
424 { | 425 { |
425 out <- [[[[[[[[[[[[Build["C Function"] | 426 out <- [[[[[[[[[[[[[Build["C Function"] |
426 ]Name <<[name] | 427 ]Name <<[name] |
427 ]Inputs <<[inputs] | 428 ]Inputs <<[inputs] |
428 ]Outputs <<[outputs] | 429 ]Outputs <<[outputs] |
429 ]Convention <<[convention] | 430 ]Convention <<[convention] |
430 ]Variables <<[Dictionary[]] | 431 ]Variables <<[Dictionary[]] |
433 ]Field Registry <<[field reg] | 434 ]Field Registry <<[field reg] |
434 ]Type Registry <<[type reg] | 435 ]Type Registry <<[type reg] |
435 ]Constants <<[Dictionary[]] | 436 ]Constants <<[Dictionary[]] |
436 ]Input Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), inputs] ] | 437 ]Input Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), inputs] ] |
437 ]Output Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), outputs] ] | 438 ]Output Types <<[ Fold[["Append"]Set Input[1, "Any Type"], (), outputs] ] |
439 ]Resume Index <<[1] | |
438 } | 440 } |
439 | 441 |
440 Set Input Type@C Function[func,type,input num:out] | 442 Set Input Type@C Function[func,type,input num:out] |
441 { | 443 { |
442 out <- [func]Input Types <<[ [[func]Input Types >>]Set[input num, type] ] | 444 out <- [func]Input Types <<[ [[func]Input Types >>]Set[input num, type] ] |
682 out <- [func]Add Statement[ [[[dest]Append[" = ((char *)"]]Append[source]]Append[")+ sizeof(t_Array)"] ] | 684 out <- [func]Add Statement[ [[[dest]Append[" = ((char *)"]]Append[source]]Append[")+ sizeof(t_Array)"] ] |
683 } | 685 } |
684 | 686 |
685 _Function Arg C[func,val,inputnum:out] | 687 _Function Arg C[func,val,inputnum:out] |
686 { | 688 { |
687 out <- [func]Add Statement[ | 689 out <- [func]Add Raw Line[ |
688 [[["call->params[" | 690 [[[["SetParam(" |
689 ]Append[inputnum] | 691 ]Append[inputnum] |
690 ]Append["] = "] | 692 ]Append[", "] |
691 ]Append[val] | 693 ]Append[val] |
694 ]Append[")"] | |
692 ] | 695 ] |
693 } | 696 } |
694 | 697 |
695 Method Call@C Function[func,method,args:out] | 698 Method Call@C Function[func,method,args:out] |
696 { | 699 { |
697 out <- [func]Func Base[[[func]Method Registry >>]Method ID[method],args, "MCall"] | 700 out <- [func]Call[method,args] |
698 } | 701 } |
699 | 702 |
700 Call@C Function[func,name,args:out] | 703 Call@C Function[func,name,args:out] |
701 { | 704 { |
702 out <- [func]Func Base[Escape Rhope Name[name],args, "Call"] | 705 out <- [func]Func Base[Escape Rhope Name[name],args, "Call"] |
703 } | 706 } |
704 | 707 |
705 Func Base@C Function[func,tocall,args,type:out] | 708 Func Base@C Function[func,tocall,args,type:out] |
706 { | 709 { |
707 Pretty Print[args, ""] | |
708 { | |
709 rargs <- Map[args, ["Make Op"]Set Input[1, func]] | 710 rargs <- Map[args, ["Make Op"]Set Input[1, func]] |
710 out <- [Fold["_Function Arg C", func, rargs] | 711 out <- [[Fold["_Function Arg C", [func]Add Raw Line[ [["PrepCall("]Append[[rargs]Length]]Append[")"] ], rargs] |
711 ]Add Raw Line[[[[[ [type]Append["("] ]Append[tocall]]Append[", "]]Append[ [rargs]Length ]]Append[")"]] | 712 ]Add Raw Line[ |
712 } | 713 [[[[[[[[[type]Append["("] |
714 ]Append[tocall] | |
715 ]Append[", "] | |
716 ]Append[[rargs]Length] | |
717 ]Append[", "] | |
718 ]Append[[func]Resume Index >>] | |
719 ]Append[", "] | |
720 ]Append[Escape Rhope Name[[func]Name >>]] | |
721 ]Append[")"]] | |
722 ]Resume Index <<[ [[func]Resume Index >>]+[1] ] | |
713 } | 723 } |
714 | 724 |
715 Call Foreign@C Function[func,name,language,args,store result:out] | 725 Call Foreign@C Function[func,name,language,args,store result:out] |
716 { | 726 { |
717 rargs <- Map[args, ["Make Op"]Set Input[1, func]] | 727 rargs <- Map[args, ["Make Op"]Set Input[1, func]] |
1101 }{ | 1111 }{ |
1102 out <- text | 1112 out <- text |
1103 } | 1113 } |
1104 } | 1114 } |
1105 | 1115 |
1116 _Dispatch Switch Sub[text, num, name:out] | |
1117 { | |
1118 out <- [[[[[[[[[text | |
1119 ]Append["\tcase RES_"] | |
1120 ]Append[num] | |
1121 ]Append["_"] | |
1122 ]Append[name] | |
1123 ]Append[": goto r"] | |
1124 ]Append[num] | |
1125 ]Append["_"] | |
1126 ]Append[name] | |
1127 ]Append[";\\\n"] | |
1128 } | |
1129 | |
1130 _Dispatch Switch[text,func,raw name:out] | |
1131 { | |
1132 name <- Escape Rhope Name[raw name] | |
1133 out <- [[text]Append[ [[[["\tcase FUNC_"]Append[name]]Append[": goto f_"]]Append[name]]Append[";\\\n"] ] | |
1134 ]Append[Fold[["_Dispatch Switch Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] | |
1135 } | |
1136 | |
1137 _Dispatch Enum Sub[text, num, name:out] | |
1138 { | |
1139 out <- [[[[[text | |
1140 ]Append["\tRES_"] | |
1141 ]Append[num] | |
1142 ]Append["_"] | |
1143 ]Append[name] | |
1144 ]Append[",\n"] | |
1145 } | |
1146 | |
1147 _Dispatch Enum[text,func,raw name:out] | |
1148 { | |
1149 name <- Escape Rhope Name[raw name] | |
1150 out <- [[text]Append[ [["\tFUNC_"]Append[name]]Append[",\n"] ] | |
1151 ]Append[Fold[["_Dispatch Enum Sub"]Set Input[2, name], "", Range[1, [func]Resume Index >>]]] | |
1152 } | |
1153 | |
1154 Dispatch@C Program[program:out] | |
1155 { | |
1156 out <- [[[[["typedef enum {\n" | |
1157 ]Append[Fold["_Dispatch Enum", "", [program]Functions >>]] | |
1158 ]Append["\tEND\n} funcids;\n\n"] | |
1159 ]Append["#define DISPATCH switch(func) { \\\n"] | |
1160 ]Append[Fold["_Dispatch Switch", "", [program]Functions >>]] | |
1161 ]Append["\tcase END: goto DO_END;\\\n}\n\n"] | |
1162 } | |
1163 | |
1106 Text@C Program[program:out] | 1164 Text@C Program[program:out] |
1107 { | 1165 { |
1108 Print["Text@C Program"] | 1166 Print["Text@C Program"] |
1109 constants <- Fold["Combine Consts", Dictionary[], [program]Functions >>] | 1167 constants <- Fold["Combine Consts", Dictionary[], [program]Functions >>] |
1110 headers <- "#include <stdio.h> | 1168 headers <- "#include <stdio.h> |
1114 #include \"func.h\" | 1172 #include \"func.h\" |
1115 #include \"integer.h\" | 1173 #include \"integer.h\" |
1116 #include \"blueprint.h\" | 1174 #include \"blueprint.h\" |
1117 #include \"array.h\" | 1175 #include \"array.h\" |
1118 #include \"bool.h\"\n\n" | 1176 #include \"bool.h\"\n\n" |
1119 out <- [[[[[[[headers | 1177 out <- [[[[[[[[headers |
1178 ]Append[[program]Dispatch] | |
1120 ]Append[[[program]Type Registry >>]Type Defs] | 1179 ]Append[[[program]Type Registry >>]Type Defs] |
1121 ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], | 1180 ]Append[Fold[["_Text C Program"]Set Input[2, [program]Type Registry >>], |
1122 Fold["_Consts C Program", | 1181 Fold["_Consts C Program", |
1123 Fold["_Defs C Program", "", [program]Functions >>], | 1182 Fold["_Defs C Program", "", [program]Functions >>], |
1124 constants | 1183 constants |
1125 ], [program]Functions >>]] | 1184 ], [program]Functions >>]] |
1126 ]Append["#include \"builtin.c\"\n#include \"array.c\"\n\nint main(int argc, char **argv) | 1185 ]Append["\n\nint main(int argc, char **argv) |
1127 { | 1186 { |
1128 returntype ret; | |
1129 calldata *cdata; | |
1130 context * ct; | |
1131 blueprint * bp; | |
1132 register_builtin_types();\n\n"] | 1187 register_builtin_types();\n\n"] |
1133 ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] | 1188 ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] |
1134 ]Append[Fold[["_Set Consts C Program"]Set Input[3, [program]Type Registry >>], "", constants]] | 1189 ]Append[Fold[["_Set Consts C Program"]Set Input[3, [program]Type Registry >>], "", constants]] |
1135 ]Append[Fold[["_Set Late Consts C"]Set Input[3, [program]Type Registry >>], "", constants]] | 1190 ]Append[Fold[["_Set Late Consts C"]Set Input[3, [program]Type Registry >>], "", constants]] |
1136 ]Append[" | 1191 ]Append[" |
1137 ct = new_context(); | 1192 rhope(FUNC_Main); |
1138 cdata = alloc_cdata(ct, 0); | |
1139 cdata->num_params = 0; | |
1140 cdata->resume = 0; | |
1141 ret = f_Main(cdata); | |
1142 while(ret == TAIL_RETURN) | |
1143 ret = cdata->tail_func(cdata); | |
1144 if(ret == EXCEPTION_RETURN) { | |
1145 puts(\"Exception!\"); | |
1146 return -1; | |
1147 } | |
1148 return 0; | 1193 return 0; |
1149 }\n\n"] | 1194 }\n\n"] |
1150 | 1195 |
1151 } | 1196 } |
1152 | 1197 |