aboutsummaryrefslogtreecommitdiff
path: root/src/parser.js
diff options
context:
space:
mode:
authoralon@honor <none@none>2010-09-04 18:05:18 -0700
committeralon@honor <none@none>2010-09-04 18:05:18 -0700
commit1715e6c9b2819fa2ca9b8a0031ae2c93781af20f (patch)
treeea3634b45dd1094357b14f7685866721e9181db6 /src/parser.js
parent4344835f29a8812a2ae0ab45fffbaef1add0b08d (diff)
finish varargs work
Diffstat (limited to 'src/parser.js')
-rw-r--r--src/parser.js17
1 files changed, 14 insertions, 3 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 ';'
}