diff options
-rw-r--r-- | src/jsifier.js | 2 | ||||
-rw-r--r-- | src/parseTools.js | 4 | ||||
-rwxr-xr-x | tests/runner.py | 20 |
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 = ''' |