aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-08-25 04:49:10 +0300
committermax99x <max99x@gmail.com>2011-08-25 04:49:10 +0300
commit96a5349290b327f024f05b906886aa4af6ed08b3 (patch)
treeb1dd74c5e07c8978a042efa9c8761d634d896365
parent5acf78dda1ece67fb4fac131658147a725f802a4 (diff)
parent51c74c1c724281fac1f3f22fc10d7e6c38feb7b8 (diff)
Merge remote-tracking branch 'upstream/master'
-rw-r--r--src/library.js35
-rw-r--r--src/parseTools.js1
-rw-r--r--tests/runner.py1
-rw-r--r--tools/autodebugger_c.py29
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.'
+