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