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';