Mercurial > repos > rhope
comparison jsbackend.rhope @ 136:fc3815b7462f
Javascript backend now produces working code for some simple examples, still more of the standard lib that needs to be ported.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 14 Nov 2010 23:07:55 -0500 |
parents | 18a4403fe576 |
children | 4580c08fd4e8 |
comparison
equal
deleted
inserted
replaced
135:18a4403fe576 | 136:fc3815b7462f |
---|---|
121 | 121 |
122 [("Array", "Worker")]Find[=[[jstype]Name >>, ?]] | 122 [("Array", "Worker")]Find[=[[jstype]Name >>, ?]] |
123 { | 123 { |
124 constructor <- [[[["var t_"]Append[ename]]Append[" = "]]Append[ [("Array","Function")]Index[~] ]]Append[";\n"] | 124 constructor <- [[[["var t_"]Append[ename]]Append[" = "]]Append[ [("Array","Function")]Index[~] ]]Append[";\n"] |
125 }{ | 125 }{ |
126 constructor <- [["function t_"]Append[ename]]Append["\n{}\n"] | 126 constructor <- [["function t_"]Append[ename]]Append["()\n{}\n"] |
127 } | 127 } |
128 out <- [[[[[constructor | 128 out <- [[[[[constructor |
129 ]Append[ [[[["t_"]Append[ename]]Append[".prototype.type_id = "]]Append[id]]Append[";\n"] ] | 129 ]Append[ [[[["t_"]Append[ename]]Append[".prototype.type_id = "]]Append[id]]Append[";\n"] ] |
130 ]Append[ [["t_"]Append[ename]]Append[".prototype.conversions = new Array();\n"] ] | 130 ]Append[ [["t_"]Append[ename]]Append[".prototype.conversions = new Array();\n"] ] |
131 ]Append[ [["t = new t_Blueprint;\nt.id = "]Append[id]]Append[";\n"] ] | 131 ]Append[ [["t = new t_Blueprint;\nt.id = "]Append[id]]Append[";\n"] ] |
298 source2 <- [psource2]Make Op[func] | 298 source2 <- [psource2]Make Op[func] |
299 dest <- [pdest]Make Op[func] | 299 dest <- [pdest]Make Op[func] |
300 out <- [func]Add Statement[[[[[dest]Append[" = "]]Append[source1]]Append[op]]Append[source2]] | 300 out <- [func]Add Statement[[[[[dest]Append[" = "]]Append[source1]]Append[op]]Append[source2]] |
301 } | 301 } |
302 | 302 |
303 Make AddRef Op@JS Function[func,val:out] | |
304 { | |
305 out <- [val]Make Op[func] | |
306 } | |
307 | |
303 Add@JS Function[func,source1,source2,dest:out] | 308 Add@JS Function[func,source1,source2,dest:out] |
304 { | 309 { |
305 out <- [func]Add Operator Statement[source1,source2,dest," + "] | 310 out <- [func]Add Operator Statement[source1,source2,dest," + "] |
306 } | 311 } |
307 | 312 |
443 } | 448 } |
444 | 449 |
445 Set Null@JS Function[func,pdest:out] | 450 Set Null@JS Function[func,pdest:out] |
446 { | 451 { |
447 dest <- [pdest]Make Op[func] | 452 dest <- [pdest]Make Op[func] |
448 out <- [func]Add Statement[[dest]Append[" = NULL"]] | 453 out <- [func]Add Statement[[dest]Append[" = null"]] |
449 } | 454 } |
450 | 455 |
451 Lookup Constant@JS Function[func,const,doaddref:out] | 456 Lookup Constant@JS Function[func,const,doaddref:out] |
452 { | 457 { |
453 out <- ["_const_"]Append[Escape Rhope Name[const,[func]Escape Pattern >>]] | 458 out <- ["_const_"]Append[Escape Rhope Name[const,[func]Escape Pattern >>]] |
471 result op <- Field Ref[var,field] | 476 result op <- Field Ref[var,field] |
472 } | 477 } |
473 | 478 |
474 Set Field Null@JS Function[func,var,field:out] | 479 Set Field Null@JS Function[func,var,field:out] |
475 { | 480 { |
476 out <- [func]Add Statement[ [[func]Field Result[var,field]]Append[" = NULL"] ] | 481 out <- [func]Add Statement[ [[func]Field Result[var,field]]Append[" = null"] ] |
477 } | 482 } |
478 | 483 |
479 Copy@JS Function[func,pdest:out] | 484 Copy@JS Function[func,pdest:out] |
480 { | 485 { |
481 dest <- [pdest]Make Op[func] | 486 dest <- [pdest]Make Op[func] |
482 out <- [func]Add Statement[ [dest]Append[[[" = copy_object("]Append[dest]]Append[")"]] ] | 487 out <- [func]Add Statement[ [dest]Append[[[" = copy_object("]Append[dest]]Append[")"]] ] |
483 } | 488 } |
484 | 489 |
485 Box@JS Function[func,psource,pdest,type:out] | 490 Box@JS Function[func,psource,pdest,type:out] |
486 { | 491 { |
487 out <- func | 492 dest <- [pdest]Make Op[func] |
493 source <- [psource]Make Op[func] | |
494 typename <- [type]Name >> | |
495 [("Int32","UInt32","UInt8")]Find[=[typename,?]] | |
496 { | |
497 out <- [func]Add Statement[ [[[[dest]Append[[" = make_"]Append[typename]]]Append["("]]Append[source]]Append[")"] ] | |
498 }{ | |
499 If[[typename]=["Boolean"]] | |
500 { | |
501 out <- [func]Add Statement[ [[[[dest]Append[" = make_Bool"]]Append["("]]Append[source]]Append[")"] ] | |
502 }{ | |
503 out <- [func]Move[psource,pdest] | |
504 } | |
505 } | |
488 } | 506 } |
489 | 507 |
490 Unbox@JS Function[func,psource,pdest:out] | 508 Unbox@JS Function[func,psource,pdest:out] |
491 { | 509 { |
492 out <- func | 510 dest <- [pdest]Make Op[func] |
511 source <- [psource]Make Op[func] | |
512 out <- [func]Add Statement[ [[[dest]Append[" = "]]Append[source]]Append[".unbox()"] ] | |
493 } | 513 } |
494 | 514 |
495 Get Raw Pointer@JS Function[func,psource,pdest:out] | 515 Get Raw Pointer@JS Function[func,psource,pdest:out] |
496 { | 516 { |
497 out <- func | 517 out <- func |
602 } | 622 } |
603 | 623 |
604 Get Field Call@JS Function[func,field,source:out] | 624 Get Field Call@JS Function[func,field,source:out] |
605 { | 625 { |
606 //This will need to change later when I add support for "Field Missing" | 626 //This will need to change later when I add support for "Field Missing" |
607 [func]Escape Pattern >> | 627 efield <- Escape Rhope Name[field, [func]Escape Pattern >>] |
608 { | 628 out <- [func]Add Statement[[[[["res = ["]Append[Make Op[source,func]]]Append[".p_"]]Append[efield]]Append["]"]] |
609 esource <- Escape Rhope Name[Make Op[source,func], ~] | |
610 efield <- Escape Rhope Name[field, ~] | |
611 } | |
612 out <- [func]Add Statement[[[["res = "]Append[esource]]Append[".p_"]]Append[efield]] | |
613 } | 629 } |
614 | 630 |
615 Set Field Call@JS Function[func,field,object,value:out] | 631 Set Field Call@JS Function[func,field,object,value:out] |
616 { | 632 { |
617 out <- [func]Func Base[Escape Rhope Name[[field]Append[" <<"],[func]Escape Pattern >>], [[()]Append[object]]Append[value], "Call"] | 633 out <- [func]Func Base[Escape Rhope Name[[field]Append[" <<"],[func]Escape Pattern >>], [[()]Append[object]]Append[value], "MCall"] |
618 } | 634 } |
619 | 635 |
620 Tail Method Call@JS Function[func,method,args:out] | 636 Tail Method Call@JS Function[func,method,args:out] |
621 { | 637 { |
622 //Javascript doesn't support tail calls, at least not directly anyway | 638 //Javascript doesn't support tail calls, at least not directly anyway |
665 } | 681 } |
666 | 682 |
667 Do If@JS Function[func,condition,stream:out] | 683 Do If@JS Function[func,condition,stream:out] |
668 { | 684 { |
669 cond <- [condition]Make Op[func] | 685 cond <- [condition]Make Op[func] |
670 out <- [Fold[_If JS[?], [[func | 686 If[[[stream]Statements >>]Length] |
671 ]Add Raw Line[ [["if("]Append[cond]]Append[")"] ] | 687 { |
672 ]Add Raw Line["{"], [stream]Statements >>] | 688 out <- [Fold[_If JS[?], [[func |
673 ]Add Raw Line["}"] | 689 ]Add Raw Line[ [["if("]Append[cond]]Append[")"] ] |
690 ]Add Raw Line["{"], [stream]Statements >>] | |
691 ]Add Raw Line["}"] | |
692 }{ | |
693 out <- func | |
694 } | |
674 } | 695 } |
675 | 696 |
676 Discard Outputs@JS Function[func,first to discard:out] | 697 Discard Outputs@JS Function[func,first to discard:out] |
677 { | 698 { |
678 out <- func | 699 out <- func |
705 | 726 |
706 Set Outputs@JS Function[func:out] | 727 Set Outputs@JS Function[func:out] |
707 { | 728 { |
708 If[[[func]Convention >>] = ["rhope"]] | 729 If[[[func]Convention >>] = ["rhope"]] |
709 { | 730 { |
710 out <- [["\treturn ["]Append[ [Map[[func]Outputs >>, Escape Rhope Name[?, [func]Escape Pattern >>]]]Join[","] ]]Append["];\n"] | 731 out <- [["\treturn ["]Append[ [ Map[Map[[func]Outputs >>, Escape Rhope Name[?, [func]Escape Pattern >>]], ["lv_"]Append[?]] ]Join[","] ]]Append["];\n"] |
711 }{ | 732 }{ |
712 [[func]Outputs >>]Index[0] | 733 [[func]Outputs >>]Index[0] |
713 { | 734 { |
714 out <- [["\treturn "]Append[Escape Rhope Name[~,[func]Escape Pattern >>]]]Append[";\n"] | 735 out <- [["\treturn "]Append[Escape Rhope Name[~,[func]Escape Pattern >>]]]Append[";\n"] |
715 }{ | 736 }{ |
744 { | 765 { |
745 Print[["Text@JS Function: "]Append[[func]Name >>]] | 766 Print[["Text@JS Function: "]Append[[func]Name >>]] |
746 If[ [[func]Convention >>] = ["rhope"] ] | 767 If[ [[func]Convention >>] = ["rhope"] ] |
747 { | 768 { |
748 | 769 |
749 before <- [[func]Name >>]Partition["@"] {} {} | 770 before,,after <- [[func]Name >>]Partition["@"] |
750 { | 771 { |
751 ivars <- Tail[[func]Inputs >>, 1] | 772 If[[after]=[""]] |
752 cname <- [["t_"]Append[Escape Rhope Name[~,[func]Escape Pattern >>]] | 773 { |
753 ]Append[[".f_"]Append[Escape Rhope Name[before,[func]Escape Pattern >>]]] | 774 norm name <- Val[before] |
754 [[func]Inputs >>]Index[0] | 775 } { |
755 { move this <- ["\tlv_"]Append[[Escape Rhope Name[~, [func]Escape Pattern >>]]Append[" = this;"]] } | 776 ivars <- Tail[[func]Inputs >>, 1] |
756 { move this <- "" } | 777 cname <- [[["t_"]Append[Escape Rhope Name[after,[func]Escape Pattern >>]] |
757 }{ | 778 ]Append[[".prototype.f_"]Append[Escape Rhope Name[before,[func]Escape Pattern >>]]] |
779 ]Append[" = function"] | |
780 [[func]Inputs >>]Index[0] | |
781 { move this <- ["\tlv_"]Append[[Escape Rhope Name[~, [func]Escape Pattern >>]]Append[" = this;"]] } | |
782 { move this <- "" } | |
783 } | |
784 } {} {} { | |
785 norm name <- Name >>[func] | |
786 } | |
787 Val[norm name] | |
788 { | |
758 ivars <- [func]Inputs >> | 789 ivars <- [func]Inputs >> |
759 fname <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>] | 790 fname <- ["f_"]Append[Escape Rhope Name[norm name,[func]Escape Pattern >>]] |
760 move this <- "" | 791 move this <- "" |
761 } | 792 } |
762 inproc <- Val[Map[?, _Add Prefix[?]]] | 793 inproc <- Val[Map[?, _Add Prefix[?]]] |
763 }{ | 794 }{ |
764 fname <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>] | 795 fname <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>] |
765 ivars <- Inputs >>[func] | 796 ivars <- Inputs >>[func] |
766 move this <- "" | 797 move this <- "" |
767 inproc <- Val[Val[?]] | 798 inproc <- Val[Val[?]] |
768 } | 799 } |
769 cname <- ["var "]Append[fname] | 800 cname <- ["function "]Append[fname] |
770 param check <- Fold[Check Param Type JS[?, ?, ?, func], "", [func]Input Types >>] | 801 param check <- Fold[Check Param Type JS[?, ?, ?, func], "", [func]Input Types >>] |
802 | |
803 allvars <- Concatenate[[func]Outputs >>, Keys[[func]Variables >>]] | |
804 If[[allvars]Length] | |
805 { | |
806 vardec <- [["\tvar "]Append[ [ [inproc]Call[Map[allvars, Escape Rhope Name[?, [func]Escape Pattern >>]]] ]Join[","] ]]Append[";\n"] | |
807 }{ | |
808 vardec <- "" | |
809 } | |
771 | 810 |
772 out <- [[[[[[[[[cname | 811 out <- [[[[[[[[[cname |
773 ]Append[" = function("] | 812 ]Append["("] |
774 ]Append[ [[inproc]Call[Map[ivars, Escape Rhope Name[?, [func]Escape Pattern >>]]]]Join[","] ] | 813 ]Append[ [[inproc]Call[Map[ivars, Escape Rhope Name[?, [func]Escape Pattern >>]]]]Join[","] ] |
775 ]Append[")\n{\n"] | 814 ]Append[")\n{\n"] |
776 ]Append[move this] | 815 ]Append[move this] |
777 ]Append[param check] | 816 ]Append[param check] |
778 ]Append[ [["\tvar "]Append[ [ [inproc]Call[Concatenate[[func]Outputs >>, Keys[[func]Variables >>]]] ]Join[","] ]]Append[";\n"] ] | 817 ]Append[vardec] |
779 ]Append[ [[func]Statements >>]Join[""] ] | 818 ]Append[ [[func]Statements >>]Join[""] ] |
780 ]Append[[func]Set Outputs] | 819 ]Append[[func]Set Outputs] |
781 ]Append["}"] | 820 ]Append["}"] |
782 } | 821 } |
783 | 822 |
805 | 844 |
806 Needed Specials@JS Program[program,typename,makespecial:out] | 845 Needed Specials@JS Program[program,typename,makespecial:out] |
807 { | 846 { |
808 out <- () | 847 out <- () |
809 } | 848 } |
849 | |
850 Set Stdlib Imports@JS Program[program,parser:out] | |
851 { | |
852 out <- [parser]Imports <<[ [[parser]Imports >>]Set["kerneljs.rhope", Yes] ] | |
853 } | |
854 | |
810 | 855 |
811 Link@JS Program[program,language,library:out] | 856 Link@JS Program[program,language,library:out] |
812 { | 857 { |
813 If[[library] = ["runtime"]] | 858 If[[library] = ["runtime"]] |
814 { | 859 { |
1016 var TYPE_BLUEPRINT = i++; | 1061 var TYPE_BLUEPRINT = i++; |
1017 var TYPE_ARRAY = i++; | 1062 var TYPE_ARRAY = i++; |
1018 var TYPE_WORKER = i++; | 1063 var TYPE_WORKER = i++; |
1019 var TYPE_FIRST_USER = i; | 1064 var TYPE_FIRST_USER = i; |
1020 | 1065 |
1066 Object.prototype.unbox = function() | |
1067 { | |
1068 return this; | |
1069 } | |
1070 | |
1021 registered_types = new Array(); | 1071 registered_types = new Array(); |
1022 | 1072 |
1023 function t_Blueprint() | 1073 function t_Blueprint() |
1024 { | 1074 { |
1025 } | 1075 } |
1030 t.id = TYPE_BLUEPRINT; | 1080 t.id = TYPE_BLUEPRINT; |
1031 t.construct = t_Blueprint; | 1081 t.construct = t_Blueprint; |
1032 registered_types[TYPE_BLUEPRINT] = t;\n\n" | 1082 registered_types[TYPE_BLUEPRINT] = t;\n\n" |
1033 ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] | 1083 ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] |
1034 ]Append[" | 1084 ]Append[" |
1085 | |
1086 t_Int32.prototype.unbox = function() | |
1087 { | |
1088 return this.p_Num; | |
1089 } | |
1090 | |
1091 t_UInt32.prototype.unbox = function() | |
1092 { | |
1093 return this.p_Num; | |
1094 } | |
1095 | |
1096 t_UInt8.prototype.unbox = function() | |
1097 { | |
1098 return this.p_Num; | |
1099 } | |
1100 | |
1101 t_Boolean.prototype.unbox = function() | |
1102 { | |
1103 return this.p_Val; | |
1104 } | |
1035 | 1105 |
1036 function make_Int32(val) | 1106 function make_Int32(val) |
1037 { | 1107 { |
1038 var out = new t_Int32; | 1108 var out = new t_Int32; |
1039 out.p_Val = val; | 1109 out.p_Num = val; |
1040 return out; | 1110 return out; |
1041 } | 1111 } |
1042 | 1112 |
1043 function make_UInt8(val) | 1113 function make_UInt8(val) |
1044 { | 1114 { |
1045 var out = new t_UInt8; | 1115 var out = new t_UInt8; |
1046 out.p_Val = val & 255; | 1116 out.p_Num = val & 255; |
1047 return out; | 1117 return out; |
1048 } | 1118 } |
1049 | 1119 |
1050 function make_UInt32(val) | 1120 function make_UInt32(val) |
1051 { | 1121 { |
1052 var out = new t_UInt32; | 1122 var out = new t_UInt32; |
1053 out.p_Val = val; | 1123 out.p_Num = val; |
1054 return out; | 1124 return out; |
1055 } | 1125 } |
1056 | 1126 |
1057 function make_Boolean(val) | 1127 function make_Bool(val) |
1058 { | 1128 { |
1059 var out = new t_Boolean; | 1129 var out = new t_Boolean; |
1060 out.p_Val = val; | 1130 out.p_Val = val; |
1061 return out; | 1131 return out; |
1062 } | 1132 } |
1063 | 1133 |
1064 function make_Float64(val) | 1134 function make_Float64(val) |
1065 { | 1135 { |
1066 var out = new t_Float64; | 1136 var out = new t_Float64; |
1067 out.p_Val = val; | 1137 out.p_Num = val; |
1138 return out; | |
1139 } | |
1140 | |
1141 function make_String(string) | |
1142 { | |
1143 var out = new t_String; | |
1144 out.p_Buffer = string; | |
1068 return out; | 1145 return out; |
1069 } | 1146 } |
1070 | 1147 |
1071 function make_Blueprint(typeid) | 1148 function make_Blueprint(typeid) |
1072 { | 1149 { |
1083 return out[0]; | 1160 return out[0]; |
1084 } | 1161 } |
1085 throw new Error(\"Conversion needed\"); | 1162 throw new Error(\"Conversion needed\"); |
1086 } | 1163 } |
1087 | 1164 |
1165 function copy_object(obj) | |
1166 { | |
1167 if (obj.type_id == TYPE_ARRAY) { | |
1168 return obj.slice(0); | |
1169 } | |
1170 var dest = new registered_types[obj.type_id].construct; | |
1171 for (var prop in obj) { | |
1172 if (obj.hasOwnProperty(prop)) { | |
1173 dest[prop] = obj[prop]; | |
1174 } | |
1175 } | |
1176 return dest; | |
1177 } | |
1178 | |
1179 function _internal_js_length(arr) | |
1180 { | |
1181 return arr.length; | |
1182 } | |
1183 | |
1184 function _internal_js_eq(left,right) | |
1185 { | |
1186 return left == right; | |
1187 } | |
1188 | |
1189 function _internal_array_set(arr,index,val) | |
1190 { | |
1191 arr[index] = val; | |
1192 } | |
1193 | |
1194 function _internal_array_get(arr,index) | |
1195 { | |
1196 return arr[index] | |
1197 } | |
1198 | |
1088 function f_Build(type) | 1199 function f_Build(type) |
1089 { | 1200 { |
1090 type = check_type(type, TYPE_BLUEPRINT); | 1201 type = check_type(type, TYPE_BLUEPRINT); |
1091 return [new type.construct()]; | 1202 return [new type.construct()]; |
1092 } | 1203 } |
1103 } | 1214 } |
1104 | 1215 |
1105 function f_BlueprintSP_FromSP_ID(id) | 1216 function f_BlueprintSP_FromSP_ID(id) |
1106 { | 1217 { |
1107 id = check_type(id, TYPE_UINT32); | 1218 id = check_type(id, TYPE_UINT32); |
1108 if (id.p_Val > 0 && registered_types[id.p_Val] != null) { | 1219 if (id.p_Num > 0 && registered_types[id.p_Num] != null) { |
1109 return [registered_types[id.p_Val], null]; | 1220 return [registered_types[id.p_Num], null]; |
1110 } else { | 1221 } else { |
1111 return [null,id]; | 1222 return [null,id]; |
1112 } | 1223 } |
1113 }\n"] | 1224 }\n"] |
1114 ]Append[Fold[_Text JS Program[?, ?, [program]Type Registry >>], "", [program]Functions >>]] | 1225 ]Append[Fold[_Text JS Program[?, ?, [program]Type Registry >>], "", [program]Functions >>]] |
1115 ]Append[Fold[_Set Consts JS Program[?, ?, ?, [program]Type Registry >>], "", constants]] | 1226 ]Append[Fold[_Set Consts JS Program[?, ?, ?, [program]Type Registry >>], "", constants]] |
1116 ]Append[Fold[_Set Late Consts JS[?, ?, ?, [program]Type Registry >>], "", constants]] | 1227 ]Append[Fold[_Set Late Consts JS[?, ?, ?, [program]Type Registry >>], "", constants]] |
1117 ]Append[" | 1228 ]Append[" |
1118 var args = f_List()[0]; | 1229 try { |
1119 for (var i in arguments) { | 1230 var args = f_List()[0]; |
1120 args = args.f_Append(make_String(arguments[i]))[0]; | 1231 for (var i in arguments) { |
1121 } | 1232 args = args.f_Append(make_String(arguments[i]))[0]; |
1122 f_Main(args);"] | 1233 } |
1123 | 1234 res = f_Main(args); |
1124 } | 1235 } catch(e) { |
1125 | 1236 res = f_Main(); |
1126 | 1237 } |
1238 if (res[0] != null && res[0].type_id == TYPE_INT32) { | |
1239 print(res[0].p_Num); | |
1240 } | |
1241 "] | |
1242 | |
1243 } | |
1244 | |
1245 |