aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser.js17
-rw-r--r--tests/runner.py4
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;
}
'''