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