From 35d78c0005201383c9e2cf5069be420037438b7c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 10 Sep 2024 16:15:06 -0700 Subject: [PATCH] Add some sanity checks when using `__i53abi` decorator See #21335 --- src/jsifier.mjs | 10 ++++++++++ src/library_webgpu.js | 5 ++++- test/test_other.py | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/jsifier.mjs b/src/jsifier.mjs index 15270ce00511b..eba2ba29b08b4 100644 --- a/src/jsifier.mjs +++ b/src/jsifier.mjs @@ -299,6 +299,16 @@ function(${args}) { const sig = LibraryManager.library[symbol + '__sig']; const i53abi = LibraryManager.library[symbol + '__i53abi']; + if (i53abi) { + if (!sig) { + error(`JS library error: '__i53abi' decorator requires '__sig' decorator: '${symbol}'`); + } + if (!sig.includes('j')) { + error( + `JS library error: '__i53abi' only makes sense when '__sig' includes 'j' (int64): '${symbol}'`, + ); + } + } if ( sig && ((i53abi && sig.includes('j')) || ((MEMORY64 || CAN_ADDRESS_2GB) && sig.includes('p'))) diff --git a/src/library_webgpu.js b/src/library_webgpu.js index 9af4766242ac5..e7f7ba55dd4ce 100644 --- a/src/library_webgpu.js +++ b/src/library_webgpu.js @@ -2883,7 +2883,10 @@ for (var value in LibraryWebGPU.$WebGPU.FeatureName) { for (const key of Object.keys(LibraryWebGPU)) { if (typeof LibraryWebGPU[key] === 'function') { - LibraryWebGPU[key + '__i53abi'] = true; + const sig = LibraryWebGPU[key + '__sig']; + if (sig?.includes('j')) { + LibraryWebGPU[key + '__i53abi'] = true; + } } } diff --git a/test/test_other.py b/test/test_other.py index 3214b22455fe0..a2d5cc8e68f58 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -4677,6 +4677,26 @@ def test_js_lib_invalid_decorator(self): err = self.expect_fail([EMCC, test_file('hello_world.c'), '--js-library', 'lib.js']) self.assertContained("lib.js: Decorator (jslibfunc__async} has wrong type. Expected 'boolean' not 'string'", err) + def test_js_lib_i53abi(self): + create_file('lib.js', r''' +mergeInto(LibraryManager.library, { + jslibfunc__i53abi: true, + jslibfunc: (x) => { return 42 }, +}); +''') + err = self.expect_fail([EMCC, test_file('hello_world.c'), '-sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE=jslibfunc', '--js-library', 'lib.js']) + self.assertContained("error: JS library error: '__i53abi' decorator requires '__sig' decorator: 'jslibfunc'", err) + + create_file('lib.js', r''' +mergeInto(LibraryManager.library, { + jslibfunc__i53abi: true, + jslibfunc__sig: 'ii', + jslibfunc: (x) => { return 42 }, +}); +''') + err = self.expect_fail([EMCC, test_file('hello_world.c'), '-sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE=jslibfunc', '--js-library', 'lib.js']) + self.assertContained("error: JS library error: '__i53abi' only makes sense when '__sig' includes 'j' (int64): 'jslibfunc'", err) + def test_js_lib_legacy(self): create_file('lib.js', r''' mergeInto(LibraryManager.library, {