aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jsifier.js2
-rw-r--r--src/parseTools.js4
-rwxr-xr-xtests/runner.py20
3 files changed, 25 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index 727fb41d..ca34d406 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -1392,7 +1392,7 @@ function JSify(data, functionsOnly, givenFunctions) {
}
var returnType;
- if (byPointer || ASM_JS) returnType = type.split(' ')[0];
+ if (byPointer || ASM_JS) returnType = getReturnType(type);
if (byPointer) {
var sig = Functions.getSignature(returnType, argsTypes, hasVarArgs);
diff --git a/src/parseTools.js b/src/parseTools.js
index a5939994..9bb7aec5 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -227,6 +227,10 @@ function isFunctionType(type, out) {
return isFunctionDef({ text: argText, item: tokenize(argText.substr(1, argText.length-2), true) }, out);
}
+function getReturnType(type) {
+ return type.substr(0, type.lastIndexOf('(')-1);
+}
+
var isTypeCache = {}; // quite hot, optimize as much as possible
function isType(type) {
if (type in isTypeCache) return isTypeCache[type];
diff --git a/tests/runner.py b/tests/runner.py
index 842dacad..2be8bff9 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -2860,6 +2860,26 @@ Exiting setjmp function, level: 0, prev_jmp: -1
'''
self.do_run(src, 'fn2(-5) = 5, fn(10) = 3.16')
+ def test_funcptrfunc(self):
+ src = r'''
+ #include <stdio.h>
+
+ typedef void (*funcptr)(int, int);
+ typedef funcptr (*funcptrfunc)(int);
+
+ funcptr __attribute__ ((noinline)) getIt(int x) {
+ return (funcptr)x;
+ }
+
+ int main(int argc, char **argv)
+ {
+ funcptrfunc fpf = argc < 100 ? getIt : NULL;
+ printf("*%p*\n", fpf(argc));
+ return 0;
+ }
+ '''
+ self.do_run(src, '*0x1*')
+
def test_emptyclass(self):
if self.emcc_args is None: return self.skip('requires emcc')
src = '''