diff options
-rw-r--r-- | src/parser.js | 17 | ||||
-rw-r--r-- | tests/runner.py | 4 |
2 files changed, 16 insertions, 5 deletions
diff --git a/src/parser.js b/src/parser.js index 214e5cb5..0b6b3dad 100644 --- a/src/parser.js +++ b/src/parser.js @@ -1938,8 +1938,19 @@ function JSify(data) { processItem: function(item) { switch(item.ident) { case '_vsnprintf': { - item.JS = 'function ' + item.ident + '(dst, num, src, args) {\n' + - ' _printf;\n'; + item.JS = + 'function _vsnprintf(dst, num, src, ptr) {\n' + + ' var args = [];\n' + + ' while (HEAP[ptr] != 0) {\n' + + ' args.push(HEAP[ptr]);\n' + + ' ptr ++;\n' + + ' }\n' + + ' var text = __formatString.apply(null, [src].concat(args));\n' + + ' for (var i = 0; i < num; i++) {\n' + + ' HEAP[dst+i] = HEAP[text+i];\n' + + ' if (HEAP[dst+i] == 0) break;\n' + + ' }\n' + + '}\n'; break; } default: { @@ -2376,7 +2387,7 @@ function JSify(data) { // Special cases if (ident == '_llvm_va_start') { - return params[0].ident + ' = Pointer_make(Array.prototype.slice.call(arguments, 1), 0)'; // XXX 1 + return 'HEAP[' + params[0].ident + '] = Pointer_make(Array.prototype.slice.call(arguments, 1).concat([0]), 0)'; // XXX 1 } else if (ident == '_llvm_va_end') { return ';' } diff --git a/tests/runner.py b/tests/runner.py index 26e0d0f5..d1a8b63f 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -557,7 +557,7 @@ class T(unittest.TestCase): ''' self.do_test(src, '*96,97,98,101,101*') - def zzztest_varargs(self): + def test_varargs(self): src = ''' #include <stdio.h> #include "stdarg.h" @@ -573,7 +573,7 @@ class T(unittest.TestCase): } int main() { - vary("*cheez: %d+%d*", 10, 23); + vary("*cheez: %d+%d*", 10, 24); return 0; } ''' |