diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-05-20 16:45:27 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-05-20 16:57:45 -0700 |
commit | 5efd506b7a9bc9ebae72f883e8fa5f1b18a85de2 (patch) | |
tree | 8fea83a4659337e9ca5ce7dcb9ac0e8bf29c22a6 | |
parent | 6346adec3b5f59415d9eb9650eeefd4120f32763 (diff) |
correctly count the number of normal vars even when there are i64s before a varargs
-rw-r--r-- | src/parseTools.js | 15 | ||||
-rwxr-xr-x | tests/runner.py | 40 |
2 files changed, 53 insertions, 2 deletions
diff --git a/src/parseTools.js b/src/parseTools.js index 1a58b4e7..f30883b5 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -286,11 +286,22 @@ function isVarArgsFunctionType(type) { return type.substr(-varArgsSuffix.length) == varArgsSuffix; } +function getNumVars(type) { // how many variables are needed to represent this type + if (type in Runtime.FLOAT_TYPES) return 1; + return Math.max(getNumIntChunks(type), 1); +} + function countNormalArgs(type, out) { out = out || {}; if (!isFunctionType(type, out)) return -1; - if (isVarArgsFunctionType(type)) out.numArgs--; - return out.numArgs; + var ret = 0; + if (out.segments) { + for (var i = 0; i < out.segments.length; i++) { + ret += getNumVars(out.segments[i][0].text); + } + } + if (isVarArgsFunctionType(type)) ret--; + return ret; } function addIdent(token) { diff --git a/tests/runner.py b/tests/runner.py index cff43210..4428fddc 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -1179,6 +1179,46 @@ m_divisor is 1091269979 ''' self.do_run(src, 'Succeeded!') + def test_i64_varargs(self): + if Settings.USE_TYPED_ARRAYS != 2: return self.skip('full i64 stuff only in ta2') + + src = r''' + #include <stdio.h> + #include <stdint.h> + #include <stdarg.h> + + void ccv_cache_generate_signature(char *msg, int len, int64_t sig_start, ...) { + if (sig_start < 10123) + printf("%s\n", msg+len); + va_list v; + va_start(v, sig_start); + if (sig_start > 1413) + printf("%d\n", va_arg(v, int)); + else + printf("nada\n"); + va_end(v); + } + + int main(int argc, char **argv) + { + for (int i = 0; i < argc; i++) { + if (i % 123123 == 0) + ccv_cache_generate_signature(argv[i], i+2, (int64_t)argc*argc, 54.111); + else + ccv_cache_generate_signature(argv[i], i+2, (int64_t)argc*argc, 13); + } + }; + ''' + self.do_run(src, '''in/this.program +nada +a +nada +fl +nada +sdfasdfasdf +nada +''', 'waka fleefl asdfasdfasdfasdf'.split(' ')) + def test_i32_mul_precise(self): if self.emcc_args == None: return self.skip('needs ta2') |