Mercurial > repos > tabletprog
comparison ilbackend.js @ 294:d1dc2d70bdfd
Move OS module out of backend Javascript into a proper module file. Add normal bytearray to bytearray module. Add read:to method to os module for reading into a bytearray.
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 24 Jul 2014 21:58:26 -0700 |
parents | 6fe9343b1400 |
children |
comparison
equal
deleted
inserted
replaced
293:2b045d5b673b | 294:d1dc2d70bdfd |
---|---|
971 return [makeInt(64, false), makeInt(32, false), makeInt(16, false), makeInt(8, false), | 971 return [makeInt(64, false), makeInt(32, false), makeInt(16, false), makeInt(8, false), |
972 makeInt(64, true) , makeInt(32, true), makeInt(16, true), makeInt(8, true), | 972 makeInt(64, true) , makeInt(32, true), makeInt(16, true), makeInt(8, true), |
973 makeArray(), makeString(), makelambda()]; | 973 makeArray(), makeString(), makelambda()]; |
974 } | 974 } |
975 | 975 |
976 function addBuiltinModules(toplevel) | |
977 { | |
978 var os = new cObject('mod_obj_os'); | |
979 os.addInclude('<sys/stat.h>'); | |
980 os.addInclude('<fcntl.h>'); | |
981 os.addInclude('<stdlib.h>'); | |
982 os.addInclude('<time.h>'); | |
983 os.addInclude('<unistd.h>'); | |
984 os.addMessage('write', { | |
985 vars: {str: 'string *', intret: 'obj_int32 *', filedes: 'obj_int32 *'}, | |
986 lines: [ | |
987 'filedes = va_arg(args, obj_int32 *);', | |
988 'str = va_arg(args, string *);', | |
989 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
990 'intret->num = write(filedes->num, str->data, str->bytes);', | |
991 'return &(intret->header);' | |
992 ] | |
993 }); | |
994 os.addMessage('read', { | |
995 vars: {str: 'string *', size: 'obj_int32 *', filedes: 'obj_int32 *'}, | |
996 lines: [ | |
997 'filedes = va_arg(args, obj_int32 *);', | |
998 'size = va_arg(args, obj_int32 *);', | |
999 'str = (string *)make_object(&string_meta, NULL, 0);', | |
1000 'str->data = GC_MALLOC_ATOMIC(size->num + 1);', | |
1001 'str->len = str->bytes = read(filedes->num, str->data, size->num);', | |
1002 'if (str->bytes < 0) { str->bytes = str->len = 0; }', | |
1003 'str->data[str->bytes] = 0;', | |
1004 'return &(str->header);' | |
1005 ] | |
1006 }); | |
1007 os.addMessage('open', { | |
1008 vars: {str: 'string *', flags: 'obj_int32 *', filedes: 'obj_int32 *', perm: 'obj_int32 *'}, | |
1009 lines: [ | |
1010 'str = va_arg(args, string *);', | |
1011 'flags = va_arg(args, obj_int32 *);', | |
1012 'filedes = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1013 'if (num_params == 3) {', | |
1014 ' filedes->num = open(str->data, flags->num);', | |
1015 '} else if (num_params == 4) {', | |
1016 ' perm = va_arg(args, obj_int32 *);', | |
1017 ' filedes->num = open(str->data, flags->num, perm->num);', | |
1018 '} else {', | |
1019 ' filedes->num = -1;', | |
1020 '}', | |
1021 'return &(filedes->header);' | |
1022 ] | |
1023 }); | |
1024 os.addMessage('close', { | |
1025 vars: {filedes: 'obj_int32 *', intret: 'obj_int32 *'}, | |
1026 lines: [ | |
1027 'filedes = va_arg(args, obj_int32 *);', | |
1028 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1029 'intret->num = close(filedes->num);', | |
1030 'return &(intret->header);' | |
1031 ] | |
1032 }); | |
1033 os.addMessage('O_RDONLY', { | |
1034 vars: {intret: 'obj_int32 *'}, | |
1035 lines: [ | |
1036 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1037 'intret->num = O_RDONLY;', | |
1038 'return &(intret->header);' | |
1039 ] | |
1040 }); | |
1041 os.addMessage('O_WRONLY', { | |
1042 vars: {intret: 'obj_int32 *'}, | |
1043 lines: [ | |
1044 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1045 'intret->num = O_WRONLY;', | |
1046 'return &(intret->header);' | |
1047 ] | |
1048 }); | |
1049 os.addMessage('O_RDWR', { | |
1050 vars: {intret: 'obj_int32 *'}, | |
1051 lines: [ | |
1052 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1053 'intret->num = O_RDWR;', | |
1054 'return &(intret->header);' | |
1055 ] | |
1056 }); | |
1057 os.addMessage('O_CREAT', { | |
1058 vars: {intret: 'obj_int32 *'}, | |
1059 lines: [ | |
1060 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1061 'intret->num = O_CREAT;', | |
1062 'return &(intret->header);' | |
1063 ] | |
1064 }); | |
1065 os.addMessage('O_APPEND', { | |
1066 vars: {intret: 'obj_int32 *'}, | |
1067 lines: [ | |
1068 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1069 'intret->num = O_APPEND;', | |
1070 'return &(intret->header);' | |
1071 ] | |
1072 }); | |
1073 os.addMessage('O_TRUNC', { | |
1074 vars: {intret: 'obj_int32 *'}, | |
1075 lines: [ | |
1076 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1077 'intret->num = O_TRUNC;', | |
1078 'return &(intret->header);' | |
1079 ] | |
1080 }); | |
1081 os.addMessage('rand', { | |
1082 vars: {intret: 'obj_int32 *'}, | |
1083 lines: [ | |
1084 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1085 'intret->num = rand();', | |
1086 'return &(intret->header);' | |
1087 ] | |
1088 }); | |
1089 os.addMessage('rand64', { | |
1090 vars: {intret64: 'obj_int64 *'}, | |
1091 lines: [ | |
1092 'intret64 = (obj_int64 *)make_object(&obj_int64_meta, NULL, 0);', | |
1093 'intret64->num = (((int64_t)rand()) << 32 ) | rand();', | |
1094 'return &(intret64->header);' | |
1095 ] | |
1096 }); | |
1097 os.addMessage('srand', { | |
1098 vars: {oseed: 'object *', seed: 'obj_int32 *'}, | |
1099 lines: [ | |
1100 'oseed = va_arg(args, object *);', | |
1101 'seed = mcall(' + getMethodId("int32") + ', 1, oseed);', | |
1102 'srand(seed->num);', | |
1103 'return &(seed->header);' | |
1104 ] | |
1105 }); | |
1106 os.addMessage('time', { | |
1107 vars: {intret64: 'obj_int64 *'}, | |
1108 lines: [ | |
1109 'intret64 = (obj_int64 *)make_object(&obj_int64_meta, NULL, 0);', | |
1110 'intret64->num = time(NULL);', | |
1111 'return &(intret64->header);' | |
1112 ] | |
1113 }); | |
1114 os.addMessage('sleep', { | |
1115 vars: {osecs: 'object *', secs: 'obj_int32 *', intret: 'obj_int32 *'}, | |
1116 lines: [ | |
1117 'osecs = va_arg(args, object *);', | |
1118 'secs = mcall(' + getMethodId("int32") + ', 1, osecs);', | |
1119 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);', | |
1120 'intret->num = sleep(secs->num);', | |
1121 'return &(intret->header);' | |
1122 ] | |
1123 }); | |
1124 toplevel.names['os'] = os; | |
1125 } | |
1126 | |
1127 modulefile.prototype.toIL = function(){ | 976 modulefile.prototype.toIL = function(){ |
1128 return this.ast.toILModuleInstance(); | 977 return this.ast.toILModuleInstance(); |
1129 }; | 978 }; |
1130 | 979 |
1131 function processUsedToplevel(toplevel) | 980 function processUsedToplevel(toplevel) |
1173 var builtins = builtinTypes(); | 1022 var builtins = builtinTypes(); |
1174 for (var i in builtins) { | 1023 for (var i in builtins) { |
1175 forwarddec += builtins[i].toEarlyCDef(); | 1024 forwarddec += builtins[i].toEarlyCDef(); |
1176 toplevelcode += builtins[i].toILDef(); | 1025 toplevelcode += builtins[i].toILDef(); |
1177 } | 1026 } |
1178 addBuiltinModules(toplevel); | |
1179 debugprint('//------POPULATING SYMBOLS-----'); | 1027 debugprint('//------POPULATING SYMBOLS-----'); |
1180 obj.populateSymbols(toplevel); | 1028 obj.populateSymbols(toplevel); |
1181 var moduleinit = processUsedToplevel(toplevel); | 1029 var moduleinit = processUsedToplevel(toplevel); |
1182 debugprint('//------COMPILING AST-----'); | 1030 debugprint('//------COMPILING AST-----'); |
1183 var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toILModuleInstance() + ';\n\treturn main_module;\n}\n'; | 1031 var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toILModuleInstance() + ';\n\treturn main_module;\n}\n'; |