aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-05-20 16:45:27 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-05-20 16:57:45 -0700
commit5efd506b7a9bc9ebae72f883e8fa5f1b18a85de2 (patch)
tree8fea83a4659337e9ca5ce7dcb9ac0e8bf29c22a6
parent6346adec3b5f59415d9eb9650eeefd4120f32763 (diff)
correctly count the number of normal vars even when there are i64s before a varargs
-rw-r--r--src/parseTools.js15
-rwxr-xr-xtests/runner.py40
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')