diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-12-10 12:55:57 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-10 12:55:57 -0800 |
commit | 4101e15f9edb7a8f14f96dbc813281ff8d601760 (patch) | |
tree | e8df4181e8627e2ee3d4c0e968e29280f539627f | |
parent | 762e6535d1753b0d23b12dd300916fad20f785d6 (diff) |
asm coerce args and return value when calling library functions, but not asm functions
-rw-r--r-- | src/jsifier.js | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index e76b7fba..b9b4a329 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1236,7 +1236,10 @@ function JSify(data, functionsOnly, givenFunctions) { } }); - args = args.map(function(arg, i) { return asmCoercion(indexizeFunctions(arg, argsTypes[i]), argsTypes[i]) }); + if (ASM_JS && shortident in Functions.libraryFunctions) { + args = args.map(function(arg, i) { return asmCoercion(indexizeFunctions(arg, argsTypes[i]), argsTypes[i]) }); + } + varargs = varargs.map(function(vararg, i) { if (ignoreFunctionIndexizing.indexOf(i) >= 0) return vararg; return vararg === 0 ? 0 : indexizeFunctions(vararg, varargsTypes[i]) @@ -1279,8 +1282,10 @@ function JSify(data, functionsOnly, givenFunctions) { return inline.apply(null, args); // Warning: inlining does not prevent recalculation of the arguments. They should be simple identifiers } + var returnType; + if (byPointer || ASM_JS) returnType = type.split(' ')[0]; + if (byPointer) { - var returnType = type.split(' ')[0]; var sig = Functions.getSignature(returnType, argsTypes); if (ASM_JS) { assert(returnType.search(/\("'\[,/) == -1); // XXX need isFunctionType(type, out) @@ -1289,7 +1294,11 @@ function JSify(data, functionsOnly, givenFunctions) { ident = Functions.getTable(sig) + '[' + ident + ']'; } - return ident + '(' + args.join(', ') + ')'; + var ret = ident + '(' + args.join(', ') + ')'; + if (ASM_JS && shortident in Functions.libraryFunctions) { + ret = asmCoercion(ret, returnType); + } + return ret; } makeFuncLineActor('getelementptr', function(item) { return finalizeLLVMFunctionCall(item) }); makeFuncLineActor('call', function(item) { |