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