diff options
-rw-r--r-- | src/parser.js | 6 | ||||
-rw-r--r-- | src/preamble.js | 15 | ||||
-rw-r--r-- | src/snippets.js | 6 | ||||
-rw-r--r-- | tests/runner.py | 6 | ||||
-rw-r--r-- | tests/sauer/command.cpp | 1 |
5 files changed, 22 insertions, 12 deletions
diff --git a/src/parser.js b/src/parser.js index 94be1dc6..e4beee08 100644 --- a/src/parser.js +++ b/src/parser.js @@ -2447,10 +2447,12 @@ function JSify(data) { function makeFunctionCall(ident, params) { // Special cases if (ident == '_llvm_va_start') { + var args = 'Array.prototype.slice.call(arguments, __numArgs__)'; + var data = 'Pointer_make([' + args + '.length].concat(' + args + '), 0)'; if (SAFE_HEAP) { - return 'SAFE_HEAP_STORE(' + params[0].ident + ', Pointer_make(Array.prototype.slice.call(arguments, __numArgs__).concat([0]), 0))'; + return 'SAFE_HEAP_STORE(' + params[0].ident + ', ' + data + ', 0)'; } else { - return 'HEAP[' + params[0].ident + '] = Pointer_make(Array.prototype.slice.call(arguments, __numArgs__).concat([0]), 0)'; + return 'HEAP[' + params[0].ident + '] = ' + data; } } else if (ident == '_llvm_va_end') { return ';' diff --git a/src/preamble.js b/src/preamble.js index 4d473ee3..2ededac1 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -173,9 +173,18 @@ function _strlen(p) { // return p.slab.length; // XXX might want to find the null terminator... } -function String_copy(p, addZero) { +// Copies a list of num items on the HEAP into a +// a normal JavaScript array of numbers +function Array_copy(ptr, num) { // XXX hardcoded ptr impl - return HEAP.slice(p, p+_strlen(p)).concat(addZero ? [0] : []); + return HEAP.slice(ptr, ptr+num); +} + +// Copies a C-style string, terminated by a zero, from the HEAP into +// a normal JavaScript array of numbers +function String_copy(ptr, addZero) { + // XXX hardcoded ptr impl + return Array_copy(ptr, _strlen(ptr)).concat(addZero ? [0] : []); } // stdlib.h @@ -215,6 +224,8 @@ function jrint(label, obj) { print(label + JSON.stringify(obj)); } +// This processes a 'normal' string into a C-line array of numbers. +// For LLVM-originating strings, see parser.js:parseLLVMString function function intArrayFromString(stringy) { var ret = []; var t; diff --git a/src/snippets.js b/src/snippets.js index 96420990..2f60015f 100644 --- a/src/snippets.js +++ b/src/snippets.js @@ -1,10 +1,6 @@ var Snippets = { vsnprintf: function(dst, num, src, ptr) { - var args = []; - while (HEAP[ptr] != 0) { - args.push(HEAP[ptr]); - ptr ++; - } + var args = Array_copy(ptr+1, HEAP[ptr]); // # of args in in first place var text = __formatString.apply(null, [src].concat(args)); for (var i = 0; i < num; i++) { HEAP[dst+i] = HEAP[text+i]; diff --git a/tests/runner.py b/tests/runner.py index a24587da..5398327a 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -625,12 +625,12 @@ class T(unittest.TestCase): } int main() { - vary("*cheez: %d+%d*", 10, 24); + vary("*cheez: %d+%d*", 0, 24); // Also tests that '0' is not special as an array ender vary2('Q', "%d*", 85); return 0; } ''' - self.do_test(src, '*cheez: 10+24*\nQ85*') + self.do_test(src, '*cheez: 0+24*\nQ85*') def test_atexit(self): src = ''' @@ -688,7 +688,7 @@ class T(unittest.TestCase): # used, see Mozilla bug 593659. assert PARSER_ENGINE != SPIDERMONKEY_ENGINE # XXX RELOOP = 1 either is very very slow, or nonfinishing - self.do_test(path_from_root(['tests', 'sauer']), '*Temp is 32\n9*', main_file='command.cpp', emscripten_settings='{"RELOOP": 0}') + self.do_test(path_from_root(['tests', 'sauer']), '*Temp is 33\n9*', main_file='command.cpp', emscripten_settings='{"RELOOP": 0}') if __name__ == '__main__': if DEBUG: print "LLVM_GCC:", LLVM_GCC diff --git a/tests/sauer/command.cpp b/tests/sauer/command.cpp index 0b0afc68..7c39522f 100644 --- a/tests/sauer/command.cpp +++ b/tests/sauer/command.cpp @@ -1409,6 +1409,7 @@ int main() execute("somevar 9"); execute("temp = (+ 22 $somevar)"); execute("if (> $temp 30) [ temp = (+ $temp 1) ] [ temp = (* $temp 2) ]"); + execute("if (< $temp 30) [ temp = 0 ] [ temp = (+ $temp 1) ]"); execute("echo [*Temp is] $temp"); printf("%d*\n", getvar("somevar")); return 0; |