diff --git a/emcc.py b/emcc.py index c2bf3db5476e6..5201129cab329 100755 --- a/emcc.py +++ b/emcc.py @@ -1267,6 +1267,12 @@ def check(input_file): if shared.Settings.RELOCATABLE: shared.Settings.ALLOW_TABLE_GROWTH = 1 + if shared.Settings.ASYNCIFY: + # See: https://github.com/emscripten-core/emscripten/issues/12065 + # See: https://github.com/emscripten-core/emscripten/issues/12066 + shared.Settings.USE_LEGACY_DYNCALLS = 1 + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$getDynCaller'] + # Reconfigure the cache now that settings have been applied. Some settings # such as LTO and SIDE_MODULE/MAIN_MODULE effect which cache directory we use. shared.reconfigure_cache() @@ -1522,19 +1528,20 @@ def check(input_file): 'removeRunDependency', ] - if not shared.Settings.MINIMAL_RUNTIME or (shared.Settings.USE_PTHREADS or shared.Settings.EXIT_RUNTIME): + if not shared.Settings.MINIMAL_RUNTIME or shared.Settings.EXIT_RUNTIME: # MINIMAL_RUNTIME only needs callRuntimeCallbacks in certain cases, but the normal runtime # always does. - shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks'] + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks', '$dynCall'] if shared.Settings.USE_PTHREADS: # memalign is used to ensure allocated thread stacks are aligned. shared.Settings.EXPORTED_FUNCTIONS += ['_memalign', '_malloc'] - # dynCall_ii is used to call pthread entry points in worker.js (as + # dynCall is used to call pthread entry points in worker.js (as # metadce does not consider worker.js, which is external, we must - # consider it a user export, i.e., one which can never be removed). - building.user_requested_exports += ['dynCall_ii'] + # consider it an export, i.e., one which can never be removed). + shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$dynCall'] + shared.Settings.EXPORTED_FUNCTIONS += ['dynCall'] if shared.Settings.MINIMAL_RUNTIME: building.user_requested_exports += ['exit'] diff --git a/emscripten.py b/emscripten.py index a488aa821e6d2..0c438c8415be5 100644 --- a/emscripten.py +++ b/emscripten.py @@ -549,6 +549,13 @@ def finalize_wasm(temp_files, infile, outfile, memfile, DEBUG): args.append('-g') if shared.Settings.WASM_BIGINT: args.append('--bigint') + + if not shared.Settings.USE_LEGACY_DYNCALLS: + if shared.Settings.WASM_BIGINT: + args.append('--no-dyncalls') + else: + args.append('--dyncalls-i64') + if shared.Settings.LEGALIZE_JS_FFI != 1: args.append('--no-legalize-javascript-ffi') if not shared.Settings.MEM_INIT_IN_WASM: diff --git a/src/Fetch.js b/src/Fetch.js index 4d6dfcc5f893c..800d9078ab1c1 100644 --- a/src/Fetch.js +++ b/src/Fetch.js @@ -454,12 +454,12 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: operation success. e: ' + e); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; var reportProgress = function(fetch, xhr, e) { - if (onprogress) {{{ makeDynCall('vi') }}}(onprogress, fetch); + if (onprogress) {{{ makeDynCall('vi', 'onprogress') }}}(fetch); else if (progresscb) progresscb(fetch); }; @@ -467,7 +467,7 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.error('fetch: operation failed: ' + e); #endif - if (onerror) {{{ makeDynCall('vi') }}}(onerror, fetch); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(fetch); else if (errorcb) errorcb(fetch); }; @@ -475,7 +475,7 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: ready state change. e: ' + e); #endif - if (onreadystatechange) {{{ makeDynCall('vi') }}}(onreadystatechange, fetch); + if (onreadystatechange) {{{ makeDynCall('vi', 'onreadystatechange') }}}(fetch); else if (readystatechangecb) readystatechangecb(fetch); }; @@ -495,14 +495,14 @@ function emscripten_start_fetch(fetch, successcb, errorcb, progresscb, readystat #if FETCH_DEBUG console.log('fetch: IndexedDB store succeeded.'); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; var storeError = function(fetch, xhr, e) { #if FETCH_DEBUG console.error('fetch: IndexedDB store failed.'); #endif - if (onsuccess) {{{ makeDynCall('vi') }}}(onsuccess, fetch); + if (onsuccess) {{{ makeDynCall('vi', 'onsuccess') }}}(fetch); else if (successcb) successcb(fetch); }; __emscripten_fetch_cache_data(Fetch.dbInstance, fetch, xhr.response, storeSuccess, storeError); diff --git a/src/embind/embind.js b/src/embind/embind.js index 6f05404cd6f4c..f72a60c8fab0d 100644 --- a/src/embind/embind.js +++ b/src/embind/embind.js @@ -1062,42 +1062,20 @@ var LibraryEmbind = { #endif }, - $embind__requireFunction__deps: ['$readLatin1String', '$throwBindingError'], + $embind__requireFunction__deps: ['$readLatin1String', '$throwBindingError', '$getDynCaller'], $embind__requireFunction: function(signature, rawFunction) { signature = readLatin1String(signature); - function makeDynCaller(dynCall) { -#if DYNAMIC_EXECUTION == 0 - var argCache = [rawFunction]; - return function() { - argCache.length = arguments.length + 1; - for (var i = 0; i < arguments.length; i++) { - argCache[i + 1] = arguments[i]; - } - return dynCall.apply(null, argCache); - }; -#else - var args = []; - for (var i = 1; i < signature.length; ++i) { - args.push('a' + i); - } - - var name = 'dynCall_' + signature + '_' + rawFunction; - var body = 'return function ' + name + '(' + args.join(', ') + ') {\n'; - body += ' return dynCall(rawFunction' + (args.length ? ', ' : '') + args.join(', ') + ');\n'; - body += '};\n'; - - return (new Function('dynCall', 'rawFunction', body))(dynCall, rawFunction); + function makeDynCaller() { +#if !USE_LEGACY_DYNCALLS + if (signature.indexOf('j') == -1) { + return wasmTable.get(rawFunction); + } #endif + return getDynCaller(signature, rawFunction); } -#if MINIMAL_RUNTIME - var dc = asm['dynCall_' + signature]; -#else - var dc = Module['dynCall_' + signature]; -#endif - var fp = makeDynCaller(dc); - + var fp = makeDynCaller(); if (typeof fp !== "function") { throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction); } diff --git a/src/library.js b/src/library.js index 4d2d9efe8aec3..4182dffaf097c 100644 --- a/src/library.js +++ b/src/library.js @@ -3872,7 +3872,7 @@ LibraryManager.library = { var trace = _emscripten_get_callstack_js(); var parts = trace.split('\n'); for (var i = 0; i < parts.length; i++) { - var ret = {{{ makeDynCall('iii') }}}(func, 0, arg); + var ret = {{{ makeDynCall('iii', 'func') }}}(0, arg); if (ret !== 0) return; } }, @@ -3921,7 +3921,7 @@ LibraryManager.library = { emscripten_scan_stack: function(func) { var base = STACK_BASE; // TODO verify this is right on pthreads var end = stackSave(); - {{{ makeDynCall('vii') }}}(func, Math.min(base, end), Math.max(base, end)); + {{{ makeDynCall('vii', 'func') }}}(Math.min(base, end), Math.max(base, end)); }, // misc definitions to avoid unnecessary unresolved symbols being reported @@ -4004,6 +4004,60 @@ LibraryManager.library = { }); }, +#if USE_LEGACY_DYNCALLS || !WASM_BIGINT + $dynCallLegacy: function(sig, ptr, args) { +#if ASSERTIONS + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + } else { + assert(sig.length == 1); + } +#endif + if (args && args.length) { + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } + return Module['dynCall_' + sig].call(null, ptr); + }, + $dynCall__deps: ['$dynCallLegacy'], + + // Used in library code to get JS function from wasm function pointer. + // All callers should use direct table access where possible and only fall + // back to this function if needed. + $getDynCaller__deps: ['$dynCall'], + $getDynCaller: function(sig, ptr) { +#if !USE_LEGACY_DYNCALLS + assert(sig.indexOf('j') >= 0, 'getDynCaller should only be called with i64 sigs') +#endif + var argCache = []; + return function() { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; + }, +#endif + + $dynCall: function (sig, ptr, args) { +#if USE_LEGACY_DYNCALLS + return dynCallLegacy(sig, ptr, args); +#else +#if !WASM_BIGINT + // Without WASM_BIGINT support we cannot directly call function with i64 as + // part of thier signature, so we rely the dynCall functions generated by + // wasm-emscripten-finalize + if (sig.indexOf('j') != -1) { + return dynCallLegacy(sig, ptr, args); + } +#endif + + return wasmTable.get(ptr).apply(null, args) +#endif + }, + $callRuntimeCallbacks: function(callbacks) { while(callbacks.length > 0) { var callback = callbacks.shift(); @@ -4014,9 +4068,9 @@ LibraryManager.library = { var func = callback.func; if (typeof func === 'number') { if (callback.arg === undefined) { - dynCall_v(func); + {{{ makeDynCall('v', 'func') }}}(); } else { - dynCall_vi(func, callback.arg); + {{{ makeDynCall('vi', 'func') }}}(callback.arg); } } else { func(callback.arg === undefined ? null : callback.arg); diff --git a/src/library_async.js b/src/library_async.js index 93f9c724f1e7e..a1cecaf41d85a 100644 --- a/src/library_async.js +++ b/src/library_async.js @@ -347,7 +347,7 @@ mergeInto(LibraryManager.library, { Asyncify.afterUnwind = function() { var stackBegin = Asyncify.currData + {{{ C_STRUCTS.asyncify_data_s.__size__ }}}; var stackEnd = HEAP32[Asyncify.currData >> 2]; - {{{ makeDynCall('vii') }}}(func, stackBegin, stackEnd); + {{{ makeDynCall('vii', 'func') }}}(stackBegin, stackEnd); wakeUp(); }; }); @@ -408,7 +408,7 @@ mergeInto(LibraryManager.library, { {{{ makeSetValue('newFiber', C_STRUCTS.emscripten_fiber_s.entry, 0, 'i32') }}}; var userData = {{{ makeGetValue('newFiber', C_STRUCTS.emscripten_fiber_s.user_data, 'i32') }}}; - {{{ makeDynCall('vi') }}}(entryPoint, userData); + {{{ makeDynCall('vi', 'entryPoint') }}}(userData); } else { var asyncifyData = newFiber + {{{ C_STRUCTS.emscripten_fiber_s.asyncify_data }}}; Asyncify.currData = asyncifyData; diff --git a/src/library_browser.js b/src/library_browser.js index d174cdf0e4e37..4dce3af830ffd 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -831,7 +831,7 @@ var LibraryBrowser = { function doCallback(callback) { if (callback) { var stack = stackSave(); - {{{ makeDynCall('vi') }}}(callback, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); + {{{ makeDynCall('vi', 'callback') }}}(allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); stackRestore(stack); } } @@ -861,7 +861,7 @@ var LibraryBrowser = { $funcWrappers: {}, - $getFuncWrapper__deps: ['$funcWrappers'], + $getFuncWrapper__deps: ['$funcWrappers', '$dynCall'], $getFuncWrapper: function(func, sig) { if (!func) return; // on null pointer, return undefined assert(sig); @@ -895,10 +895,10 @@ var LibraryBrowser = { Browser.asyncLoad(UTF8ToString(url), function(byteArray) { var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - {{{ makeDynCall('viii') }}}(onload, arg, buffer, byteArray.length); + {{{ makeDynCall('viii', 'onload') }}}(arg, buffer, byteArray.length); _free(buffer); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); }, true /* no need for run dependency, this is async but will not do any prepare etc. step */ ); }, @@ -936,11 +936,11 @@ var LibraryBrowser = { FS.createDataFile( _file.substr(0, index), _file.substr(index + 1), new Uint8Array(/** @type{ArrayBuffer}*/(http.response)), true, true, false); if (onload) { var stack = stackSave(); - {{{ makeDynCall('viii') }}}(onload, handle, arg, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); + {{{ makeDynCall('viii', 'onload') }}}(handle, arg, allocate(intArrayFromString(_file), 'i8', ALLOC_STACK)); stackRestore(stack); } } else { - if (onerror) {{{ makeDynCall('viii') }}}(onerror, handle, arg, http.status); + if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status); } delete Browser.wgetRequests[handle]; @@ -948,7 +948,7 @@ var LibraryBrowser = { // ERROR http.onerror = function http_onerror(e) { - if (onerror) {{{ makeDynCall('viii') }}}(onerror, handle, arg, http.status); + if (onerror) {{{ makeDynCall('viii', 'onerror') }}}(handle, arg, http.status); delete Browser.wgetRequests[handle]; }; @@ -956,7 +956,7 @@ var LibraryBrowser = { http.onprogress = function http_onprogress(e) { if (e.lengthComputable || (e.lengthComputable === undefined && e.total != 0)) { var percentComplete = (e.loaded / e.total)*100; - if (onprogress) {{{ makeDynCall('viii') }}}(onprogress, handle, arg, percentComplete); + if (onprogress) {{{ makeDynCall('viii', 'onprogress') }}}(handle, arg, percentComplete); } }; @@ -997,10 +997,10 @@ var LibraryBrowser = { var byteArray = new Uint8Array(/** @type{ArrayBuffer} */(http.response)); var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - if (onload) {{{ makeDynCall('viiii') }}}(onload, handle, arg, buffer, byteArray.length); + if (onload) {{{ makeDynCall('viiii', 'onload') }}}(handle, arg, buffer, byteArray.length); if (free) _free(buffer); } else { - if (onerror) {{{ makeDynCall('viiii') }}}(onerror, handle, arg, http.status, http.statusText); + if (onerror) {{{ makeDynCall('viiii', 'onerror') }}}(handle, arg, http.status, http.statusText); } delete Browser.wgetRequests[handle]; }; @@ -1008,14 +1008,14 @@ var LibraryBrowser = { // ERROR http.onerror = function http_onerror(e) { if (onerror) { - {{{ makeDynCall('viiii') }}}(onerror, handle, arg, http.status, http.statusText); + {{{ makeDynCall('viiii', 'onerror') }}}(handle, arg, http.status, http.statusText); } delete Browser.wgetRequests[handle]; }; // PROGRESS http.onprogress = function http_onprogress(e) { - if (onprogress) {{{ makeDynCall('viiii') }}}(onprogress, handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0); + if (onprogress) {{{ makeDynCall('viiii', 'onprogress') }}}(handle, arg, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0); }; // ABORT @@ -1059,10 +1059,10 @@ var LibraryBrowser = { PATH.basename(_file), new Uint8Array(data.object.contents), true, true, function() { - if (onload) {{{ makeDynCall('vi') }}}(onload, file); + if (onload) {{{ makeDynCall('vi', 'onload') }}}(file); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, file); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(file); }, true // don'tCreateFile - it's already there ); @@ -1086,10 +1086,10 @@ var LibraryBrowser = { {{{ makeHEAPView('U8', 'data', 'data + size') }}}, true, true, function() { - if (onload) {{{ makeDynCall('vii') }}}(onload, arg, cname); + if (onload) {{{ makeDynCall('vii', 'onload') }}}(arg, cname); }, function() { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); }, true // don'tCreateFile - it's already there ); @@ -1199,7 +1199,7 @@ var LibraryBrowser = { emscripten_set_main_loop__deps: ['$setMainLoop'], emscripten_set_main_loop__docs: '/** @param {number|boolean=} noSetTiming */', emscripten_set_main_loop: function(func, fps, simulateInfiniteLoop, arg, noSetTiming) { - var browserIterationFunc = function() { {{{ makeDynCall('v') }}}(func); }; + var browserIterationFunc = function() { {{{ makeDynCall('v', 'func') }}}(); }; setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop, arg, noSetTiming); }, @@ -1334,7 +1334,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. emscripten_set_main_loop_arg__deps: ['$setMainLoop'], emscripten_set_main_loop_arg: function(func, arg, fps, simulateInfiniteLoop) { - var browserIterationFunc = function() { {{{ makeDynCall('vi') }}}(func, arg); }; + var browserIterationFunc = function() { {{{ makeDynCall('vi', 'func') }}}(arg); }; setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop, arg); }, @@ -1357,7 +1357,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. _emscripten_push_main_loop_blocker: function(func, arg, name) { Browser.mainLoop.queue.push({ func: function() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); }, name: UTF8ToString(name), counted: true }); Browser.mainLoop.updateStatus(); }, @@ -1365,7 +1365,7 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. _emscripten_push_uncounted_main_loop_blocker: function(func, arg, name) { Browser.mainLoop.queue.push({ func: function() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); }, name: UTF8ToString(name), counted: false }); Browser.mainLoop.updateStatus(); }, @@ -1382,7 +1382,7 @@ var LibraryBrowser = { noExitRuntime = true; function wrapper() { - {{{ makeDynCall('vi') }}}(func, arg); + {{{ makeDynCall('vi', 'func') }}}(arg); } if (millis >= 0) { diff --git a/src/library_exceptions.js b/src/library_exceptions.js index 6b81a85851213..878d84c353083 100644 --- a/src/library_exceptions.js +++ b/src/library_exceptions.js @@ -195,7 +195,7 @@ var LibraryExceptions = { var destructor = info.get_destructor(); if (destructor) { // In Wasm, destructors return 'this' as in ARM - {{{ makeDynCall('ii') }}}(destructor, info.excPtr); + {{{ makeDynCall('ii', 'destructor') }}}(info.excPtr); } ___cxa_free_exception(info.excPtr); #if EXCEPTION_DEBUG diff --git a/src/library_glfw.js b/src/library_glfw.js index cecdeeb889ef6..8869b8feda73c 100644 --- a/src/library_glfw.js +++ b/src/library_glfw.js @@ -361,11 +361,11 @@ var LibraryGLFW = { if (charCode == 0 || (charCode >= 0x00 && charCode <= 0x1F)) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.charFunc, charCode, 1); + {{{ makeDynCall('vii', 'GLFW.active.charFunc') }}}(charCode, 1); #endif #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.charFunc, GLFW.active.id, charCode); + {{{ makeDynCall('vii', 'GLFW.active.charFunc') }}}(GLFW.active.id, charCode); #endif }, @@ -383,12 +383,12 @@ var LibraryGLFW = { if (!GLFW.active.keyFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.keyFunc, key, status); + {{{ makeDynCall('vii', 'GLFW.active.keyFunc') }}}(key, status); #endif #if USE_GLFW == 3 if (repeat) status = 2; // GLFW_REPEAT - {{{ makeDynCall('viiiii') }}}(GLFW.active.keyFunc, GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); + {{{ makeDynCall('viiiii', 'GLFW.active.keyFunc') }}}(GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); #endif }, @@ -433,11 +433,11 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorPosFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorPosFunc, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('vii', 'GLFW.active.cursorPosFunc') }}}(Browser.mouseX, Browser.mouseY); #endif #if USE_GLFW == 3 - {{{ makeDynCall('vidd') }}}(GLFW.active.cursorPosFunc, GLFW.active.id, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('vidd', 'GLFW.active.cursorPosFunc') }}}(GLFW.active.id, Browser.mouseX, Browser.mouseY); #endif }, @@ -461,7 +461,7 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorEnterFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorEnterFunc, GLFW.active.id, 1); + {{{ makeDynCall('vii', 'GLFW.active.cursorEnterFunc') }}}(GLFW.active.id, 1); #endif }, @@ -471,7 +471,7 @@ var LibraryGLFW = { if (event.target != Module["canvas"] || !GLFW.active.cursorEnterFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('vii') }}}(GLFW.active.cursorEnterFunc, GLFW.active.id, 0); + {{{ makeDynCall('vii', 'GLFW.active.cursorEnterFunc') }}}(GLFW.active.id, 0); #endif }, @@ -496,11 +496,11 @@ var LibraryGLFW = { if (!GLFW.active.mouseButtonFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.mouseButtonFunc, eventButton, status); + {{{ makeDynCall('vii', 'GLFW.active.mouseButtonFunc') }}}(eventButton, status); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viiii') }}}(GLFW.active.mouseButtonFunc, GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); + {{{ makeDynCall('viiii', 'GLFW.active.mouseButtonFunc') }}}(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); #endif }, @@ -523,7 +523,7 @@ var LibraryGLFW = { if (!GLFW.active || !GLFW.active.scrollFunc || event.target != Module['canvas']) return; #if USE_GLFW == 2 - {{{ makeDynCall('vi') }}}(GLFW.active.scrollFunc, GLFW.wheelPos); + {{{ makeDynCall('vi', 'GLFW.active.scrollFunc') }}}(GLFW.wheelPos); #endif #if USE_GLFW == 3 @@ -537,7 +537,7 @@ var LibraryGLFW = { sy = event.deltaY; } - {{{ makeDynCall('vidd') }}}(GLFW.active.scrollFunc, GLFW.active.id, sx, sy); + {{{ makeDynCall('vidd', 'GLFW.active.scrollFunc') }}}(GLFW.active.id, sx, sy); #endif event.preventDefault(); @@ -592,11 +592,11 @@ var LibraryGLFW = { if (!GLFW.active.windowSizeFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(GLFW.active.windowSizeFunc, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('vii', 'GLFW.active.windowSizeFunc') }}}(GLFW.active.width, GLFW.active.height); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(GLFW.active.windowSizeFunc, GLFW.active.id, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('viii', 'GLFW.active.windowSizeFunc') }}}(GLFW.active.id, GLFW.active.width, GLFW.active.height); #endif }, @@ -606,7 +606,7 @@ var LibraryGLFW = { if (!GLFW.active.framebufferSizeFunc) return; #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(GLFW.active.framebufferSizeFunc, GLFW.active.id, GLFW.active.width, GLFW.active.height); + {{{ makeDynCall('viii', 'GLFW.active.framebufferSizeFunc') }}}(GLFW.active.id, GLFW.active.width, GLFW.active.height); #endif }, @@ -656,7 +656,7 @@ var LibraryGLFW = { }; if (GLFW.joystickFunc) { - {{{ makeDynCall('vii') }}}(GLFW.joystickFunc, joy, 0x00040001); // GLFW_CONNECTED + {{{ makeDynCall('vii', 'GLFW.joystickFunc') }}}(joy, 0x00040001); // GLFW_CONNECTED } } @@ -674,7 +674,7 @@ var LibraryGLFW = { console.log('glfw joystick disconnected',joy); if (GLFW.joystickFunc) { - {{{ makeDynCall('vii') }}}(GLFW.joystickFunc, joy, 0x00040002); // GLFW_DISCONNECTED + {{{ makeDynCall('vii', 'GLFW.joystickFunc') }}}(joy, 0x00040002); // GLFW_DISCONNECTED } _free(GLFW.joys[joy].id); @@ -765,7 +765,7 @@ var LibraryGLFW = { var data = e.target.result; FS.writeFile(path, new Uint8Array(data)); if (++written === count) { - {{{ makeDynCall('viii') }}}(GLFW.active.dropFunc, GLFW.active.id, count, filenames); + {{{ makeDynCall('viii', 'GLFW.active.dropFunc') }}}(GLFW.active.id, count, filenames); for (var i = 0; i < filenamesArray.length; ++i) { _free(filenamesArray[i]); @@ -807,7 +807,7 @@ var LibraryGLFW = { // function returns. // GLFW3 on the over hand doesn't have this behavior (https://github.com/glfw/glfw/issues/62). if (!win.windowSizeFunc) return null; - {{{ makeDynCall('vii') }}}(win.windowSizeFunc, win.width, win.height); + {{{ makeDynCall('vii', 'win.windowSizeFunc') }}}(win.width, win.height); #endif return prevcbfun; @@ -969,11 +969,11 @@ var LibraryGLFW = { if (!win.windowSizeFunc) return; #if USE_GLFW == 2 - {{{ makeDynCall('vii') }}}(win.windowSizeFunc, width, height); + {{{ makeDynCall('vii', 'win.windowSizeFunc') }}}(width, height); #endif #if USE_GLFW == 3 - {{{ makeDynCall('viii') }}}(win.windowSizeFunc, win.id, width, height); + {{{ makeDynCall('viii', 'win.windowSizeFunc') }}}(win.id, width, height); #endif }, @@ -1037,7 +1037,7 @@ var LibraryGLFW = { #if USE_GLFW == 3 if (win.windowCloseFunc) - {{{ makeDynCall('vi') }}}(win.windowCloseFunc, win.id); + {{{ makeDynCall('vi', 'win.windowCloseFunc') }}}(win.id); #endif GLFW.windows[win.id - 1] = null; @@ -1750,7 +1750,7 @@ var LibraryGLFW = { }, glfwCreateThread: function(fun, arg) { - {{{ makeDynCall('vi') }}}(str, fun, arg); + {{{ makeDynCall('vi', 'str') }}}(fun, arg); // One single thread return 0; }, diff --git a/src/library_glut.js b/src/library_glut.js index 350889cb61f98..23e524430acdb 100644 --- a/src/library_glut.js +++ b/src/library_glut.js @@ -55,11 +55,11 @@ var LibraryGLUT = { if (GLUT.buttons == 0 && event.target == Module["canvas"] && GLUT.passiveMotionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('vii') }}}(GLUT.passiveMotionFunc, lastX, lastY); + {{{ makeDynCall('vii', 'GLUT.passiveMotionFunc') }}}(lastX, lastY); } else if (GLUT.buttons != 0 && GLUT.motionFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('vii') }}}(GLUT.motionFunc, lastX, lastY); + {{{ makeDynCall('vii', 'GLUT.motionFunc') }}}(lastX, lastY); } }, @@ -167,7 +167,7 @@ var LibraryGLUT = { if( GLUT.specialFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.specialFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.specialFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } else @@ -176,7 +176,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardFunc ) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.keyboardFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.keyboardFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } } @@ -189,7 +189,7 @@ var LibraryGLUT = { if(GLUT.specialUpFunc) { event.preventDefault (); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.specialUpFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.specialUpFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } else @@ -198,7 +198,7 @@ var LibraryGLUT = { if( key !== null && GLUT.keyboardUpFunc ) { event.preventDefault (); GLUT.saveModifiers(event); - {{{ makeDynCall('viii') }}}(GLUT.keyboardUpFunc, key, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viii', 'GLUT.keyboardUpFunc') }}}(key, Browser.mouseX, Browser.mouseY); } } } @@ -241,7 +241,7 @@ var LibraryGLUT = { } catch (e) {} event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, event['button'], 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(event['button'], 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); } }, @@ -253,7 +253,7 @@ var LibraryGLUT = { if (GLUT.mouseFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY); } }, @@ -274,7 +274,7 @@ var LibraryGLUT = { if (GLUT.mouseFunc) { event.preventDefault(); GLUT.saveModifiers(event); - {{{ makeDynCall('viiii') }}}(GLUT.mouseFunc, button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); + {{{ makeDynCall('viiii', 'GLUT.mouseFunc') }}}(button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY); } }, @@ -299,7 +299,7 @@ var LibraryGLUT = { /* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */ if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height); - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } _glutPostRedisplay(); } @@ -344,7 +344,7 @@ var LibraryGLUT = { Browser.resizeListeners.push(function(width, height) { if (GLUT.reshapeFunc) { - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } }); @@ -426,7 +426,7 @@ var LibraryGLUT = { glutIdleFunc: function(func) { function callback() { if (GLUT.idleFunc) { - {{{ makeDynCall('v') }}}(GLUT.idleFunc); + {{{ makeDynCall('v', 'GLUT.idleFunc') }}}(); Browser.safeSetTimeout(callback, 4); // HTML spec specifies a 4ms minimum delay on the main thread; workers might get more, but we standardize here } } @@ -439,7 +439,7 @@ var LibraryGLUT = { glutTimerFunc__proxy: 'sync', glutTimerFunc__sig: 'viii', glutTimerFunc: function(msec, func, value) { - Browser.safeSetTimeout(function() { {{{ makeDynCall('vi') }}}(func, value); }, msec); + Browser.safeSetTimeout(function() { {{{ makeDynCall('vi', 'func') }}}(value); }, msec); }, glutDisplayFunc__proxy: 'sync', @@ -607,7 +607,7 @@ var LibraryGLUT = { Browser.setCanvasSize(width, height, true); // N.B. GLUT.reshapeFunc is also registered as a canvas resize callback. // Just call it once here. if (GLUT.reshapeFunc) { - {{{ makeDynCall('vii') }}}(GLUT.reshapeFunc, width, height); + {{{ makeDynCall('vii', 'GLUT.reshapeFunc') }}}(width, height); } _glutPostRedisplay(); }, @@ -653,7 +653,7 @@ var LibraryGLUT = { Browser.requestAnimationFrame(function() { GLUT.requestedAnimationFrame = false; Browser.mainLoop.runIter(function() { - {{{ makeDynCall('v') }}}(GLUT.displayFunc); + {{{ makeDynCall('v', 'GLUT.displayFunc') }}}(); }); }); } diff --git a/src/library_html5.js b/src/library_html5.js index 6268930a9bff3..77594bd292f6a 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -271,7 +271,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, keyEventData, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, keyEventData, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, keyEventData, userData)) e.preventDefault(); }; var eventHandler = { @@ -523,7 +523,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, mouseEventData, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -651,7 +651,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, wheelEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, wheelEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, wheelEvent, userData)) e.preventDefault(); }; #if MIN_IE_VERSION <= 8 || MIN_SAFARI_VERSION < 60100 // Browsers that do not support https://caniuse.com/#feat=mdn-api_wheelevent // The 'mousewheel' event as implemented in Safari 6.0.5 @@ -664,7 +664,7 @@ var LibraryJSEvents = { {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaY, 'wheelDeltaY', 'double') }}}; {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaZ, '0 /* Not available */', 'double') }}}; {{{ makeSetValue('JSEvents.wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaMode, '0 /* DOM_DELTA_PIXEL */', 'i32') }}}; - var shouldCancel = {{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.wheelEvent, userData); + var shouldCancel = {{{ makeDynCall('iiii', 'callbackfunc') }}}( eventTypeId, JSEvents.wheelEvent, userData); if (shouldCancel) { e.preventDefault(); } @@ -752,7 +752,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, uiEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, uiEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, uiEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -806,7 +806,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, focusEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, focusEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, focusEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -878,7 +878,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -953,7 +953,7 @@ var LibraryJSEvents = { JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData); } else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1028,7 +1028,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, orientationChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, orientationChangeEvent, userData)) e.preventDefault(); }; if (eventTypeString == "orientationchange" && screen.mozOrientation !== undefined) { @@ -1152,7 +1152,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1237,7 +1237,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; @@ -1389,7 +1389,7 @@ var LibraryJSEvents = { if (__currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(__currentFullscreenStrategy.canvasResizedCallbackTargetThread, __currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(__currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', '__currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); } } } @@ -1517,7 +1517,7 @@ var LibraryJSEvents = { if (__currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(__currentFullscreenStrategy.canvasResizedCallbackTargetThread, __currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(__currentFullscreenStrategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', '__currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData); } }, @@ -1641,7 +1641,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } __currentFullscreenStrategy = 0; } @@ -1655,7 +1655,7 @@ var LibraryJSEvents = { if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); else #endif - {{{ makeDynCall('iiii') }}}(strategy.canvasResizedCallback, {{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); + {{{ makeDynCall('iiii', 'strategy.canvasResizedCallback') }}}({{{ cDefine('EMSCRIPTEN_EVENT_CANVASRESIZED') }}}, 0, strategy.canvasResizedCallbackUserData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; @@ -1736,7 +1736,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -1785,7 +1785,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); }; var eventHandler = { @@ -1994,7 +1994,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2116,7 +2116,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, touchEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, touchEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, touchEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2214,7 +2214,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, gamepadEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, gamepadEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2295,7 +2295,7 @@ var LibraryJSEvents = { var e = ev || event; // Note: This is always called on the main browser thread, since it needs synchronously return a value! - var confirmationMessage = {{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData); + var confirmationMessage = {{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData); if (confirmationMessage) { confirmationMessage = UTF8ToString(confirmationMessage); @@ -2359,7 +2359,7 @@ var LibraryJSEvents = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, batteryEvent, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, batteryEvent, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, batteryEvent, userData)) e.preventDefault(); }; var eventHandler = { @@ -2648,7 +2648,7 @@ var LibraryJSEvents = { emscripten_request_animation_frame: function(cb, userData) { return requestAnimationFrame(function(timeStamp) { - {{{ makeDynCall('idi') }}}(cb, timeStamp, userData); + {{{ makeDynCall('idi', 'cb') }}}(timeStamp, userData); }); }, @@ -2658,7 +2658,7 @@ var LibraryJSEvents = { emscripten_request_animation_frame_loop: function(cb, userData) { function tick(timeStamp) { - if ({{{ makeDynCall('idi') }}}(cb, timeStamp, userData)) { + if ({{{ makeDynCall('idi', 'cb') }}}(timeStamp, userData)) { requestAnimationFrame(tick); } } @@ -2694,7 +2694,7 @@ var LibraryJSEvents = { emscripten_set_immediate: function(cb, userData) { polyfillSetImmediate(); return setImmediate(function() { - {{{ makeDynCall('vi') }}}(cb, userData); + {{{ makeDynCall('vi', 'cb') }}}(userData); }); }, @@ -2706,7 +2706,7 @@ var LibraryJSEvents = { emscripten_set_immediate_loop: function(cb, userData) { polyfillSetImmediate(); function tick() { - if ({{{ makeDynCall('ii') }}}(cb, userData)) { + if ({{{ makeDynCall('ii', 'cb') }}}(userData)) { setImmediate(tick); } } @@ -2715,7 +2715,7 @@ var LibraryJSEvents = { emscripten_set_timeout: function(cb, msecs, userData) { return setTimeout(function() { - {{{ makeDynCall('vi') }}}(cb, userData); + {{{ makeDynCall('vi', 'cb') }}}(userData); }, msecs); }, @@ -2727,7 +2727,7 @@ var LibraryJSEvents = { function tick() { var t = performance.now(); var n = t + msecs; - if ({{{ makeDynCall('idi') }}}(cb, t, userData)) { + if ({{{ makeDynCall('idi', 'cb') }}}(t, userData)) { setTimeout(tick, #if WASM // Save a little bit of code space: modern browsers should treat negative setTimeout as timeout of 0 (https://stackoverflow.com/questions/8430966/is-calling-settimeout-with-a-negative-delay-ok) @@ -2744,7 +2744,7 @@ var LibraryJSEvents = { emscripten_set_interval: function(cb, msecs, userData) { return setInterval(function() { - {{{ makeDynCall('vi') }}}(cb, userData) + {{{ makeDynCall('vi', 'cb') }}}(userData) }, msecs); }, diff --git a/src/library_html5_webgl.js b/src/library_html5_webgl.js index 84cd712cc42c0..05aeb14c02577 100644 --- a/src/library_html5_webgl.js +++ b/src/library_html5_webgl.js @@ -399,7 +399,7 @@ var LibraryHtml5WebGL = { if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif - if ({{{ makeDynCall('iiii') }}}(callbackfunc, eventTypeId, 0, userData)) e.preventDefault(); + if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); }; var eventHandler = { diff --git a/src/library_idbstore.js b/src/library_idbstore.js index d407710a7c3c2..fe9c13ce65bdc 100644 --- a/src/library_idbstore.js +++ b/src/library_idbstore.js @@ -17,12 +17,12 @@ var LibraryIDBStore = { emscripten_idb_async_load: function(db, id, arg, onload, onerror) { IDBStore.getFile(UTF8ToString(db), UTF8ToString(id), function(error, byteArray) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } var buffer = _malloc(byteArray.length); HEAPU8.set(byteArray, buffer); - {{{ makeDynCall('viii') }}}(onload, arg, buffer, byteArray.length); + {{{ makeDynCall('viii', 'onload') }}}(arg, buffer, byteArray.length); _free(buffer); }); }, @@ -30,28 +30,28 @@ var LibraryIDBStore = { // note that we copy the data here, as these are async operatins - changes to HEAPU8 meanwhile should not affect us! IDBStore.setFile(UTF8ToString(db), UTF8ToString(id), new Uint8Array(HEAPU8.subarray(ptr, ptr+num)), function(error) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (onstore) {{{ makeDynCall('vi') }}}(onstore, arg); + if (onstore) {{{ makeDynCall('vi', 'onstore') }}}(arg); }); }, emscripten_idb_async_delete: function(db, id, arg, ondelete, onerror) { IDBStore.deleteFile(UTF8ToString(db), UTF8ToString(id), function(error) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (ondelete) {{{ makeDynCall('vi') }}}(ondelete, arg); + if (ondelete) {{{ makeDynCall('vi', 'ondelete') }}}(arg); }); }, emscripten_idb_async_exists: function(db, id, arg, oncheck, onerror) { IDBStore.existsFile(UTF8ToString(db), UTF8ToString(id), function(error, exists) { if (error) { - if (onerror) {{{ makeDynCall('vi') }}}(onerror, arg); + if (onerror) {{{ makeDynCall('vi', 'onerror') }}}(arg); return; } - if (oncheck) {{{ makeDynCall('vii') }}}(oncheck, arg, exists); + if (oncheck) {{{ makeDynCall('vii', 'oncheck') }}}(arg, exists); }); }, diff --git a/src/library_pthread.js b/src/library_pthread.js index 5d2ce5d188ce8..1f43053726570 100644 --- a/src/library_pthread.js +++ b/src/library_pthread.js @@ -1093,7 +1093,7 @@ var LibraryPThread = { pthread_cleanup_push__sig: 'vii', pthread_cleanup_push: function(routine, arg) { - PThread.threadExitHandlers.push(function() { {{{ makeDynCall('vi') }}}(routine, arg) }); + PThread.threadExitHandlers.push(function() { {{{ makeDynCall('vi', 'routine') }}}(arg) }); }, pthread_cleanup_pop: function(execute) { diff --git a/src/library_pthread_stub.js b/src/library_pthread_stub.js index a91fe938cc17f..4ae3e5864d5b7 100644 --- a/src/library_pthread_stub.js +++ b/src/library_pthread_stub.js @@ -71,9 +71,10 @@ var LibraryPThreadStub = { pthread_setcancelstate: function() { return 0; }, pthread_setcanceltype: function() { return 0; }, + pthread_cleanup_push__deps: ['$makeDynCaller'], pthread_cleanup_push__sig: 'vii', pthread_cleanup_push: function(routine, arg) { - __ATEXIT__.push(function() { {{{ makeDynCall('vi') }}}(routine, arg) }) + __ATEXIT__.push(function() { {{{ makeDynCall('vi', 'routine') }}}(arg) }) _pthread_cleanup_push.level = __ATEXIT__.length; }, diff --git a/src/library_sdl.js b/src/library_sdl.js index 4032dbb278f41..d312e5394c73b 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -873,7 +873,7 @@ var LibrarySDL = { if (!SDL.eventHandler) return; while (SDL.pollEvent(SDL.eventHandlerTemp)) { - {{{ makeDynCall('iii') }}}(SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp); + {{{ makeDynCall('iii', 'SDL.eventHandler') }}}(SDL.eventHandlerContext, SDL.eventHandlerTemp); } }, @@ -2498,7 +2498,7 @@ var LibrarySDL = { if (secsUntilNextPlayStart >= SDL.audio.bufferingDelay + SDL.audio.bufferDurationSecs*SDL.audio.numSimultaneouslyQueuedBuffers) return; // Ask SDL audio data from the user code. - {{{ makeDynCall('viii') }}}(SDL.audio.callback, SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize); + {{{ makeDynCall('viii', 'SDL.audio.callback') }}}(SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize); // And queue it to be played after the currently playing audio stream. SDL.audio.pushAudio(SDL.audio.buffer, SDL.audio.bufferSize); } @@ -2966,7 +2966,7 @@ var LibrarySDL = { } audio['onended'] = function SDL_audio_onended() { // TODO: cache these if (channelInfo.audio == this) { channelInfo.audio.paused = true; channelInfo.audio = null; } - if (SDL.channelFinished) {{{ makeDynCall('vi') }}}(SDL.channelFinished, channel); + if (SDL.channelFinished) {{{ makeDynCall('vi', 'SDL.channelFinished') }}}(channel); } channelInfo.audio = audio; // TODO: handle N loops. Behavior matches Mix_PlayMusic @@ -2991,7 +2991,7 @@ var LibrarySDL = { info.audio = null; } if (SDL.channelFinished) { - {{{ makeDynCall('vi') }}}(SDL.channelFinished, channel); + {{{ makeDynCall('vi', 'SDL.channelFinished') }}}(channel); } } if (channel != -1) { @@ -3088,7 +3088,7 @@ var LibrarySDL = { } SDL.music.audio = null; if (SDL.hookMusicFinished) { - {{{ makeDynCall('v') }}}(SDL.hookMusicFinished); + {{{ makeDynCall('v', 'SDL.hookMusicFinished') }}}(); } return 0; }, @@ -3719,7 +3719,7 @@ var LibrarySDL = { SDL_AddTimer__sig: 'iiii', SDL_AddTimer: function(interval, callback, param) { return window.setTimeout(function() { - {{{ makeDynCall('iii') }}}(callback, interval, param); + {{{ makeDynCall('iii', 'callback') }}}(interval, param); }, interval); }, SDL_RemoveTimer__proxy: 'sync', diff --git a/src/library_signals.js b/src/library_signals.js index 152763f3e2516..a46553e5d1bfa 100644 --- a/src/library_signals.js +++ b/src/library_signals.js @@ -108,7 +108,7 @@ var funs = { alarm__deps: ['_sigalrm_handler'], alarm: function(seconds) { setTimeout(function() { - if (__sigalrm_handler) {{{ makeDynCall('vi') }}}(__sigalrm_handler, 0); + if (__sigalrm_handler) {{{ makeDynCall('vi', '__sigalrm_handler') }}}(0); }, seconds*1000); }, ualarm: function() { diff --git a/src/library_sockfs.js b/src/library_sockfs.js index 36985f9b823f3..4e7bf3ef44ddd 100644 --- a/src/library_sockfs.js +++ b/src/library_sockfs.js @@ -738,10 +738,10 @@ mergeInto(LibraryManager.library, { if (event === 'error') { var sp = stackSave(); var msg = allocate(intArrayFromString(data[2]), 'i8', ALLOC_STACK); - {{{ makeDynCall('viiii') }}}(callback, data[0], data[1], msg, userData); + {{{ makeDynCall('viiii', 'callback') }}}(data[0], data[1], msg, userData); stackRestore(sp); } else { - {{{ makeDynCall('vii') }}}(callback, data, userData); + {{{ makeDynCall('vii', 'callback') }}}(data, userData); } } catch (e) { if (e instanceof ExitStatus) { diff --git a/src/library_webgpu.js b/src/library_webgpu.js index 0a3adf1799352..bade54c5468af 100644 --- a/src/library_webgpu.js +++ b/src/library_webgpu.js @@ -1018,7 +1018,7 @@ var LibraryWebGPU = { if (ev.error instanceof GPUValidationError) type = Validation; else if (ev.error instanceof GPUOutOfMemoryError) type = OutOfMemory; var messagePtr = allocateUTF8(ev.error.message); - {{{ makeDynCall('viii') }}}(callback, type, messagePtr, userdata); + {{{ makeDynCall('viii', 'callback') }}}(type, messagePtr, userdata); _free(messagePtr); }; }, @@ -1031,9 +1031,9 @@ var LibraryWebGPU = { var completionValue = {{{ gpu.makeU64ToNumber('completionValue_low', 'completionValue_high') }}}; fence.onCompletion(completionValue).then(function() { - {{{ makeDynCall('vii') }}}(callback, 0 /* WEBGPU_FENCE_COMPLETION_STATUS_SUCCESS */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(0 /* WEBGPU_FENCE_COMPLETION_STATUS_SUCCESS */, userdata); }, function() { - {{{ makeDynCall('vii') }}}(callback, 1 /* WEBGPU_FENCE_COMPLETION_STATUS_ERROR */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(1 /* WEBGPU_FENCE_COMPLETION_STATUS_ERROR */, userdata); }); }, @@ -1374,10 +1374,10 @@ var LibraryWebGPU = { // `callback` takes (WGPUBufferMapAsyncStatus status, void * userdata) buffer["mapAsync"](mode, offset, size).then(function() { - {{{ makeDynCall('vii') }}}(callback, 0 /* WGPUBufferMapAsyncStatus_Success */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(0 /* WGPUBufferMapAsyncStatus_Success */, userdata); }, function() { // TODO(kainino0x): Figure out how to pick other error status values. - {{{ makeDynCall('vii') }}}(callback, 1 /* WGPUBufferMapAsyncStatus_Error */, userdata); + {{{ makeDynCall('vii', 'callback') }}}(1 /* WGPUBufferMapAsyncStatus_Error */, userdata); }); }, diff --git a/src/library_websocket.js b/src/library_websocket.js index e98deb0c7390f..55b024c28a3c4 100644 --- a/src/library_websocket.js +++ b/src/library_websocket.js @@ -153,7 +153,7 @@ var LibraryWebSocket = { console.error('websocket event "open": socketId='+socketId+',userData='+userData+',callbackFunc='+callbackFunc+')'); #endif HEAPU32[WS.socketEvent>>2] = socketId; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -180,7 +180,7 @@ var LibraryWebSocket = { console.error('websocket event "error": socketId='+socketId+',userData='+userData+',callbackFunc='+callbackFunc+')'); #endif HEAPU32[WS.socketEvent>>2] = socketId; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -210,7 +210,7 @@ var LibraryWebSocket = { HEAPU32[(WS.socketEvent+4)>>2] = e.wasClean; HEAPU32[(WS.socketEvent+8)>>2] = e.code; stringToUTF8(e.reason, HEAPU32[(WS.socketEvent+10)>>2], 512); - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, @@ -264,7 +264,7 @@ var LibraryWebSocket = { } HEAPU32[(WS.socketEvent+4)>>2] = buf; HEAPU32[(WS.socketEvent+8)>>2] = len; - {{{ makeDynCall('iiii') }}}(callbackFunc, 0/*TODO*/, WS.socketEvent, userData); + {{{ makeDynCall('iiii', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData); _free(buf); } return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; diff --git a/src/parseTools.js b/src/parseTools.js index fd91713694a5d..66263c9ce7fd8 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1454,10 +1454,13 @@ function asmFFICoercion(value, type) { return value; } -function makeDynCall(sig) { - // TODO(sbc): Should this be: exportedAsmFunc('dynCall_' + sig); - // See https://github.com/emscripten-core/emscripten/pull/11991; - return 'dynCall_' + sig; +function makeDynCall(sig, funcPtr) { + assert(sig.indexOf('j') == -1); + if (USE_LEGACY_DYNCALLS) { + return `getDynCaller("${sig}", ${funcPtr})`; + } else { + return `wasmTable.get(${funcPtr})`; + } } function heapAndOffset(heap, ptr) { // given HEAP8, ptr , we return splitChunk, relptr diff --git a/src/postamble_minimal.js b/src/postamble_minimal.js index 2964b0974412c..6b944363bd67b 100644 --- a/src/postamble_minimal.js +++ b/src/postamble_minimal.js @@ -56,7 +56,7 @@ function initRuntime(asm) { // Export needed variables that worker.js needs to Module. Module['_emscripten_tls_init'] = _emscripten_tls_init; Module['HEAPU32'] = HEAPU32; - Module['dynCall_ii'] = dynCall_ii; + Module['dynCall'] = dynCall; Module['registerPthreadPtr'] = registerPthreadPtr; Module['_pthread_self'] = _pthread_self; diff --git a/src/settings_internal.js b/src/settings_internal.js index 2b15c469a2293..6fb20d17b9455 100644 --- a/src/settings_internal.js +++ b/src/settings_internal.js @@ -201,3 +201,5 @@ var EXPECT_MAIN = 1; // Provide and export a .ready() Promise. This is currently used by default with // MODULARIZE, and returned from the factory function. var EXPORT_READY_PROMISE = 1; + +var USE_LEGACY_DYNCALLS = 0; diff --git a/src/support.js b/src/support.js index b2ca86267e9b1..09e798b052090 100644 --- a/src/support.js +++ b/src/support.js @@ -571,33 +571,6 @@ function makeBigInt(low, high, unsigned) { return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); } -/** @param {Array=} args */ -function dynCall(sig, ptr, args) { -#if !WASM_BIGINT - // Without WASM_BIGINT support we cannot directly call function with i64 as - // part of their signature, so we rely on the dynCall functions generated by - // wasm-emscripten-finalize - if (sig.indexOf('j') != -1) { -#if ASSERTIONS - assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); - if (args && args.length) { - // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. - assert(args.length === sig.substring(1).replace(/j/g, '--').length); - } else { - assert(sig.length == 1); - } -#endif - if (args && args.length) { - return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); - } else { - return Module['dynCall_' + sig].call(null, ptr); - } - } -#endif - - return wasmTable.get(ptr).apply(null, args) -} - var tempRet0 = 0; var setTempRet0 = function(value) { diff --git a/src/worker.js b/src/worker.js index 8678de2d2807c..34ee7bb8d7e46 100644 --- a/src/worker.js +++ b/src/worker.js @@ -200,7 +200,7 @@ this.onmessage = function(e) { // enable that to work. If you find the following line to crash, either change the signature // to "proper" void *ThreadMain(void *arg) form, or try linking with the Emscripten linker // flag -s EMULATE_FUNCTION_POINTER_CASTS=1 to add in emulation for this x86 ABI extension. - var result = Module['dynCall_ii'](e.data.start_routine, e.data.arg); + var result = Module['dynCall']('ii', e.data.start_routine, [e.data.arg]); #if STACK_OVERFLOW_CHECK Module['checkStackCookie'](); diff --git a/tests/code_size/hello_webgl2_wasm.json b/tests/code_size/hello_webgl2_wasm.json index c72b745e33894..2460aa820a7ca 100644 --- a/tests/code_size/hello_webgl2_wasm.json +++ b/tests/code_size/hello_webgl2_wasm.json @@ -1,10 +1,10 @@ { "a.html": 563, "a.html.gz": 377, - "a.js": 5064, - "a.js.gz": 2417, - "a.wasm": 10917, - "a.wasm.gz": 6935, - "total": 16544, - "total_gz": 9729 + "a.js": 5060, + "a.js.gz": 2412, + "a.wasm": 10893, + "a.wasm.gz": 6922, + "total": 16516, + "total_gz": 9711 } diff --git a/tests/code_size/hello_webgl2_wasm2js.json b/tests/code_size/hello_webgl2_wasm2js.json index 6f8a5eef1d8dd..c329071c53be4 100644 --- a/tests/code_size/hello_webgl2_wasm2js.json +++ b/tests/code_size/hello_webgl2_wasm2js.json @@ -1,10 +1,10 @@ { "a.html": 588, "a.html.gz": 386, - "a.js": 22182, - "a.js.gz": 8483, + "a.js": 22114, + "a.js.gz": 8453, "a.mem": 3168, "a.mem.gz": 2711, - "total": 25938, - "total_gz": 11580 + "total": 25870, + "total_gz": 11550 } diff --git a/tests/code_size/hello_webgl_wasm.json b/tests/code_size/hello_webgl_wasm.json index f335d5fbf132d..605403ec06237 100644 --- a/tests/code_size/hello_webgl_wasm.json +++ b/tests/code_size/hello_webgl_wasm.json @@ -1,10 +1,10 @@ { "a.html": 563, "a.html.gz": 377, - "a.js": 4549, - "a.js.gz": 2240, - "a.wasm": 10917, - "a.wasm.gz": 6935, - "total": 16029, - "total_gz": 9552 + "a.js": 4545, + "a.js.gz": 2235, + "a.wasm": 10893, + "a.wasm.gz": 6922, + "total": 16001, + "total_gz": 9534 } diff --git a/tests/code_size/hello_webgl_wasm2js.json b/tests/code_size/hello_webgl_wasm2js.json index 8206626e74aaa..87ad8c5eb137a 100644 --- a/tests/code_size/hello_webgl_wasm2js.json +++ b/tests/code_size/hello_webgl_wasm2js.json @@ -1,10 +1,10 @@ { "a.html": 588, "a.html.gz": 386, - "a.js": 21671, - "a.js.gz": 8324, + "a.js": 21603, + "a.js.gz": 8293, "a.mem": 3168, "a.mem.gz": 2711, - "total": 25427, - "total_gz": 11421 + "total": 25359, + "total_gz": 11390 } diff --git a/tests/code_size/random_printf_wasm2js.json b/tests/code_size/random_printf_wasm2js.json index 454bbd9ff4760..ae31b6715fbb2 100644 --- a/tests/code_size/random_printf_wasm2js.json +++ b/tests/code_size/random_printf_wasm2js.json @@ -1,6 +1,6 @@ { "a.html": 19387, - "a.html.gz": 8068, + "a.html.gz": 8070, "total": 19387, - "total_gz": 8068 + "total_gz": 8070 } diff --git a/tests/other/metadce/hello_libcxx_O2.exports b/tests/other/metadce/hello_libcxx_O2.exports index e370369a3bc97..8a8bcc4e0e2cf 100644 --- a/tests/other/metadce/hello_libcxx_O2.exports +++ b/tests/other/metadce/hello_libcxx_O2.exports @@ -2,26 +2,10 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_libcxx_O2_fexceptions.exports b/tests/other/metadce/hello_libcxx_O2_fexceptions.exports index ce5222228ec74..8bdc3ac5572c1 100644 --- a/tests/other/metadce/hello_libcxx_O2_fexceptions.exports +++ b/tests/other/metadce/hello_libcxx_O2_fexceptions.exports @@ -5,37 +5,11 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_diii -dynCall_fiii -dynCall_i -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii -dynCall_iiiiiiiiiii -dynCall_iiiiiiiiiiii -dynCall_iiiiiiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii -dynCall_viiiiiii -dynCall_viiiiiiiiii -dynCall_viiiiiiiiiiiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports b/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports index 3434e1d9218ff..8162a257a83ef 100644 --- a/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports +++ b/tests/other/metadce/hello_libcxx_O2_fexceptions_DEMANGLE_SUPPORT.exports @@ -6,37 +6,11 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_diii -dynCall_fiii -dynCall_i -dynCall_ii -dynCall_iidiiii -dynCall_iii -dynCall_iiii -dynCall_iiiii -dynCall_iiiiid -dynCall_iiiiii -dynCall_iiiiiii -dynCall_iiiiiiii -dynCall_iiiiiiiii -dynCall_iiiiiiiiiii -dynCall_iiiiiiiiiiii -dynCall_iiiiiiiiiiiii dynCall_iiiiiijj dynCall_iiiiij dynCall_iiiiijj dynCall_jiiii dynCall_jiji -dynCall_v -dynCall_vi -dynCall_vii -dynCall_viii -dynCall_viiii -dynCall_viiiii -dynCall_viiiiii -dynCall_viiiiiii -dynCall_viiiiiiiiii -dynCall_viiiiiiiiiiiiiii dynCall_viijii free main diff --git a/tests/other/metadce/hello_world.exports b/tests/other/metadce/hello_world.exports index 4541a116a95c2..22878a4a6e84d 100644 --- a/tests/other/metadce/hello_world.exports +++ b/tests/other/metadce/hello_world.exports @@ -2,11 +2,7 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iidiiii -dynCall_iiii dynCall_jiji -dynCall_vii fflush free main diff --git a/tests/other/metadce/hello_world.funcs b/tests/other/metadce/hello_world.funcs index 244f5f951af9e..40885b7eef362 100644 --- a/tests/other/metadce/hello_world.funcs +++ b/tests/other/metadce/hello_world.funcs @@ -23,11 +23,7 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iidiiii -$dynCall_iiii $dynCall_jiji -$dynCall_vii $emscripten_get_sbrk_ptr $fflush $fmt_fp diff --git a/tests/other/metadce/hello_world_O1.exports b/tests/other/metadce/hello_world_O1.exports index 2aa0ef17c56bd..9e43d3335f546 100644 --- a/tests/other/metadce/hello_world_O1.exports +++ b/tests/other/metadce/hello_world_O1.exports @@ -2,8 +2,6 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji free main diff --git a/tests/other/metadce/hello_world_O1.funcs b/tests/other/metadce/hello_world_O1.funcs index 4c37be4c37267..65dd8d380ad5a 100644 --- a/tests/other/metadce/hello_world_O1.funcs +++ b/tests/other/metadce/hello_world_O1.funcs @@ -13,8 +13,6 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iiii $dynCall_jiji $emscripten_get_sbrk_ptr $fputs diff --git a/tests/other/metadce/hello_world_O2.exports b/tests/other/metadce/hello_world_O2.exports index 2aa0ef17c56bd..9e43d3335f546 100644 --- a/tests/other/metadce/hello_world_O2.exports +++ b/tests/other/metadce/hello_world_O2.exports @@ -2,8 +2,6 @@ __data_end __errno_location __growWasmMemory __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji free main diff --git a/tests/other/metadce/hello_world_O2.funcs b/tests/other/metadce/hello_world_O2.funcs index 5e7924976d4e3..7c63c15bfaef8 100644 --- a/tests/other/metadce/hello_world_O2.funcs +++ b/tests/other/metadce/hello_world_O2.funcs @@ -10,8 +10,6 @@ $__wasi_syscall_ret $__wasm_call_ctors $dlfree $dlmalloc -$dynCall_ii -$dynCall_iiii $fwrite $legalstub$dynCall_jiji $main diff --git a/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports b/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports index 7345569c691c2..e51fa9e34c472 100644 --- a/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports +++ b/tests/other/metadce/hello_world_O3_MAIN_MODULE_2.exports @@ -2,8 +2,6 @@ __assign_got_enties __errno_location __stdio_write __wasm_call_ctors -dynCall_ii -dynCall_iiii dynCall_jiji main malloc diff --git a/tests/return64bit/testbind_bigint.js b/tests/return64bit/testbind_bigint.js index 6fe717397cb40..08d657cb8ae60 100644 --- a/tests/return64bit/testbind_bigint.js +++ b/tests/return64bit/testbind_bigint.js @@ -17,7 +17,7 @@ Module['runtest'] = function() { console.log("high = " + high); var ptr = _get_func_ptr(); - bigint = dynCall_jj(ptr, eval('0xabcdef1912345678n')); + bigint = dynCall('jj', ptr, [eval('0xabcdef1912345678n')]); low = Number(bigint & BigInt(0xffffffff)); high = Number(bigint >> BigInt(32)); console.log("low = " + low); diff --git a/tests/test_core.py b/tests/test_core.py index b6e130f2bddbe..26a1b28cf6bdc 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -6415,6 +6415,7 @@ def test_ccall(self): self.do_run_in_out_file_test('tests', 'core', 'test_ccall.cpp') def test_EXTRA_EXPORTED_RUNTIME_METHODS(self): + self.set_setting('DEFAULT_LIBRARY_FUNCS_TO_INCLUDE', ['$dynCall']) self.do_run_in_out_file_test('tests', 'core', 'EXTRA_EXPORTED_RUNTIME_METHODS.c') # test dyncall (and other runtime methods in support.js) can be exported self.emcc_args += ['-DEXPORTED'] diff --git a/tests/test_other.py b/tests/test_other.py index dfa245f28e3e3..89cab6ca12f5a 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -6254,7 +6254,8 @@ def test_sixtyfour_bit_return_value(self, args, bind_js): '--pre-js', path_from_root('tests', 'return64bit', 'testbindstart.js'), '--pre-js', path_from_root('tests', 'return64bit', bind_js), '--post-js', path_from_root('tests', 'return64bit', 'testbindend.js'), - '-s', 'EXPORTED_FUNCTIONS=["_test_return64"]', '-o', 'test.js', '-O2', + '-s', 'DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[$dynCall]', + '-s', 'EXPORTED_FUNCTIONS=[_test_return64]', '-o', 'test.js', '-O2', '--closure', '1', '-g1', '-s', 'WASM_ASYNC_COMPILATION=0'] + args) # Simple test program to load the test.js binding library and call the binding to the diff --git a/tools/shared.py b/tools/shared.py index 79dbc931358da..2cfd60cef64ae 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1212,7 +1212,7 @@ def make_jscall(sig): @staticmethod def make_dynCall(sig, args): # wasm2c and asyncify are not yet compatible with direct wasm table calls - if Settings.ASYNCIFY or Settings.WASM2C or not JS.is_legal_sig(sig): + if Settings.USE_LEGACY_DYNCALLS or not JS.is_legal_sig(sig): args = ','.join(args) if not Settings.MAIN_MODULE and not Settings.SIDE_MODULE: # Optimize dynCall accesses in the case when not building with dynamic