diff options
-rw-r--r-- | src/library.js | 35 | ||||
-rw-r--r-- | src/parseTools.js | 1 | ||||
-rw-r--r-- | tests/runner.py | 1 | ||||
-rw-r--r-- | tools/autodebugger_c.py | 29 |
4 files changed, 47 insertions, 19 deletions
diff --git a/src/library.js b/src/library.js index a7ac6fc0..e6ca3851 100644 --- a/src/library.js +++ b/src/library.js @@ -393,6 +393,10 @@ LibraryManager.library = { // Once initialized, permissions start having effect. FS.ignorePermissions = false; + + // Allocate some necessary buffers now + FS.buffer1 = allocate([0], 'i8', ALLOC_STATIC); + FS.errno = allocate([0], 'i32', ALLOC_STATIC) } }, @@ -728,9 +732,8 @@ LibraryManager.library = { return -1; } else { var pathArray = intArrayFromString(FS.streams[fildes].path); - var pathPtr = allocate(pathArray, 'i8', ALLOC_NORMAL); + var pathPtr = allocate(pathArray, 'i8', ALLOC_STACK); var result = _stat(pathPtr, buf); - _free(pathPtr); return result; } }, @@ -791,9 +794,8 @@ LibraryManager.library = { return -1; } else { var pathArray = intArrayFromString(FS.streams[fildes].path); - var pathPtr = allocate(pathArray, 'i8', ALLOC_NORMAL); + var pathPtr = allocate(pathArray, 'i8', ALLOC_STACK); var result = _chmod(pathPtr, mode); - _free(pathPtr); return result; } }, @@ -2634,10 +2636,9 @@ LibraryManager.library = { // int fgetc(FILE *stream); // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html if (!(stream in FS.streams)) return -1; - if (!_fgetc.buffer) _fgetc.buffer = _malloc(1); var streamObj = FS.streams[stream]; if (streamObj.eof || streamObj.error) return -1; - var ret = _read(stream, _fgetc.buffer, 1); + var ret = _read(stream, FS.buffer1, 1); if (ret == 0) { streamObj.eof = true; return -1; @@ -2645,7 +2646,7 @@ LibraryManager.library = { streamObj.error = true; return -1; } else { - return {{{ makeGetValue('_fgetc.buffer', '0', 'i8') }}}; + return {{{ makeGetValue('FS.buffer1', '0', 'i8') }}}; } }, getc: 'fgetc', @@ -2750,14 +2751,13 @@ LibraryManager.library = { var ret = _open(filename, flags, 0x1FF); // All creation permissions. return (ret == -1) ? 0 : ret; }, - fputc__deps: ['write'], + fputc__deps: ['$FS', 'write'], fputc: function(c, stream) { // int fputc(int c, FILE *stream); // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html - if (!_fputc.buffer) _fputc.buffer = _malloc(1); var chr = unSign(c & 0xFF); - {{{ makeSetValue('_fputc.buffer', '0', 'chr', 'i8') }}} - var ret = _write(stream, _fputc.buffer, 1); + {{{ makeSetValue('FS.buffer1', '0', 'chr', 'i8') }}} + var ret = _write(stream, FS.buffer1, 1); if (ret == -1) { if (stream in FS.streams) FS.streams[stream].error = true; return -1; @@ -3087,9 +3087,8 @@ LibraryManager.library = { var args = Array.prototype.slice.call(arguments, 1); args.unshift(false); var result = __formatString.apply(null, args); - var buffer = allocate(result, 'i8', ALLOC_NORMAL); + var buffer = allocate(result, 'i8', ALLOC_STACK); var ret = _fwrite(buffer, 1, result.length, stream); - _free(buffer); return ret; }, printf__deps: ['fprintf'], @@ -3112,9 +3111,8 @@ LibraryManager.library = { // int vfprintf(FILE *restrict stream, const char *restrict format, va_list ap); // http://pubs.opengroup.org/onlinepubs/000095399/functions/vprintf.html var result = __formatString(true, format, ap); - var buffer = allocate(result, 'i8', ALLOC_NORMAL); + var buffer = allocate(result, 'i8', ALLOC_STACK); var ret = _fwrite(buffer, 1, result.length, stream); - _free(buffer); return ret; }, vsnprintf__deps: ['_formatString'], @@ -5087,17 +5085,16 @@ LibraryManager.library = { 26: 'Text file busy', 18: 'Invalid cross-device link' }, + __setErrNo__deps: ['$FS'], __setErrNo: function(value) { // For convenient setting and returning of errno. var me = ___setErrNo; - if (!me.ptr) me.ptr = allocate([0], 'i32', ALLOC_NORMAL); - {{{ makeSetValue('me.ptr', '0', 'value', 'i32') }}} + {{{ makeSetValue('FS.errno', '0', 'value', 'i32') }}} return value; }, __errno_location__deps: ['__setErrNo'], __errno_location: function() { - if (!___setErrNo.ptr) ___setErrNo(0); - return ___setErrNo.ptr; + return FS.errno; }, // ========================================================================== diff --git a/src/parseTools.js b/src/parseTools.js index 94989f9d..4a2ff3a8 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1070,6 +1070,7 @@ function finalizeLLVMParameter(param) { } function makeSignOp(value, type, op) { + if (isPointerType(type)) type = 'i32'; // Pointers are treated as 32-bit ints if (!value) return value; var bits, full; if (type in Runtime.INT_TYPES) { diff --git a/tests/runner.py b/tests/runner.py index 17403146..39cab477 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -2739,6 +2739,7 @@ if 'benchmark' not in sys.argv: src = open(path_from_root('tests', 'dlmalloc.c'), 'r').read() self.do_test(src, '*1,0*', ['200', '1']) + self.do_test(src, '*400,0*', ['400', '400'], no_build=True) def zzztest_gl(self): # Switch to gcc from g++ - we don't compile properly otherwise (why?) diff --git a/tools/autodebugger_c.py b/tools/autodebugger_c.py new file mode 100644 index 00000000..0876e054 --- /dev/null +++ b/tools/autodebugger_c.py @@ -0,0 +1,29 @@ +''' +Processes a C source file, adding debugging information. + +Similar to autodebugger.py, but runs on .c files +''' + +import os, sys, re + +filename, ofilename = sys.argv[1], sys.argv[2] +f = open(filename, 'r') +data = f.read() +f.close() + +lines = data.split('\n') +for i in range(len(lines)): + m = re.match('^ [ ]*([\w\d \[\]]+) = +([^;]+);$', lines[i]) + if m and (' if ' not in lines[i-1] or '{' in lines[i-1]) and \ + (' if ' not in lines[i+1] or '{' in lines[i+1]) and \ + (' else' not in lines[i-1] or '{' in lines[i-1]) and \ + (' else' not in lines[i+1] or '{' in lines[i+1]): + var = m.groups(1)[0].rstrip().split(' ')[-1] + lines[i] += ''' printf("%d:%s=%%d\\n", %s);''' % (i+1, var, var) + +f = open(ofilename, 'w') +f.write('\n'.join(lines)) +f.close() + +print 'Success.' + |