aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser.js6
-rw-r--r--src/preamble.js15
-rw-r--r--src/snippets.js6
-rw-r--r--tests/runner.py6
-rw-r--r--tests/sauer/command.cpp1
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;