diff options
author | alon@honor <none@none> | 2010-09-04 18:05:18 -0700 |
---|---|---|
committer | alon@honor <none@none> | 2010-09-04 18:05:18 -0700 |
commit | 1715e6c9b2819fa2ca9b8a0031ae2c93781af20f (patch) | |
tree | ea3634b45dd1094357b14f7685866721e9181db6 | |
parent | 4344835f29a8812a2ae0ab45fffbaef1add0b08d (diff) |
finish varargs work
-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; } ''' |