diff options
Diffstat (limited to 'src/jsifier.js')
-rw-r--r-- | src/jsifier.js | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 9c34ddf1..bd432001 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -42,6 +42,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { substrate = new Substrate('JSifyer'); var GLOBAL_VARIABLES = !mainPass ? givenGlobalVariables : data.globalVariables; + Variables.globals = GLOBAL_VARIABLES; Functions.currFunctions = !mainPass ? givenFunctions.currFunctions : {}; Functions.currExternalFunctions = !mainPass ? givenFunctions.currExternalFunctions : {}; @@ -299,6 +300,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { substrate.addActor('FunctionStub', { processItem: function(item) { var ret = [item]; + if (IGNORED_FUNCTIONS.indexOf(item.ident) >= 0) return null; var shortident = item.ident.substr(1); if (BUILD_AS_SHARED_LIB) { // Shared libraries reuse the runtime of their parents. @@ -409,6 +411,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { funcs: {}, seen: {}, processItem: function(item) { + if (IGNORED_FUNCTIONS.indexOf(item.ident) >= 0) return null; if (this.seen[item.__uid__]) return null; if (item.intertype == 'function') { this.funcs[item.ident] = item; @@ -831,28 +834,13 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { // We cannot compile assembly. See comment in intertyper.js:'Call' assert(ident != 'asm', 'Inline assembly cannot be compiled to JavaScript!'); - // Special cases - if (ident == '_llvm_va_start') { - // varargs - we received a pointer to the varargs as a final 'extra' parameter - var data = 'arguments[' + Framework.currItem.funcData.ident + '.length]'; - return makeSetValue(params[0].ident, 0, data, 'void*'); - } else if (ident == '_llvm_va_end') { - return ';'; - } else if (ident == '_EMSCRIPTEN_COMMENT') { - var param = finalizeParam(params[0]); - if (param.indexOf('CHECK_OVERFLOW') >= 0) { - param = param.split('(')[1].split(',')[0]; - } - return '// ' + GLOBAL_VARIABLES[param].value.text.replace('\\00', '') + ' '; - } - + var shortident = LibraryManager.getRootIdent(ident.slice(1)) || ident.slice(1); // ident may not be in library, if all there is is ident__inline var func = Functions.currFunctions[ident] || Functions.currExternalFunctions[ident]; - var args = []; var argsTypes = []; var varargs = []; var varargsTypes = []; - var useJSArgs = (ident.slice(1) + '__jsargs') in LibraryManager.library; + var useJSArgs = (shortident + '__jsargs') in LibraryManager.library; params.forEach(function(param, i) { var val = finalizeParam(param); @@ -878,11 +866,21 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { varargs = makePointer('[' + varargs + ']', 0, 'ALLOC_STACK', varargsTypes); } + args = args.concat(varargs); + var argsText = args.join(', '); + + // Inline if either we inline whenever we can (and we can), or if there is no noninlined version + var inline = LibraryManager.library[shortident + '__inline']; + var nonInlined = shortident in LibraryManager.library; + if (inline && (INLINE_LIBRARY_FUNCS || !nonInlined)) { + return inline.apply(null, args); // Warning: inlining does not prevent recalculation of the arguments. They should be simple identifiers + } + if (getVarData(funcData, ident)) { ident = 'FUNCTION_TABLE[' + ident + ']'; } - return ident + '(' + args.concat(varargs).join(', ') + ')'; + return ident + '(' + args.join(', ') + ')'; } makeFuncLineActor('getelementptr', function(item) { return finalizeLLVMFunctionCall(item) }); makeFuncLineActor('call', function(item) { |