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