]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-128627: Emscripten: Fix address calculation for wasm-gc trampoline (#128782)
authorHood Chatham <roberthoodchatham@gmail.com>
Thu, 23 Jan 2025 00:02:04 +0000 (00:02 +0000)
committerGitHub <noreply@github.com>
Thu, 23 Jan 2025 00:02:04 +0000 (08:02 +0800)
Modifies the memory calculation to divide the entire memory address by 4, not just the base address.

Python/emscripten_trampoline.c
configure
configure.ac

index 2f9648a12ef2e441745a6f5e84d1b1df3815a380..0293c7ea0f37ad9add3bf5e7d72c6dc028153b78 100644 (file)
@@ -26,11 +26,9 @@ EM_JS(CountArgsFunc, _PyEM_GetCountArgsPtr, (), {
 // Binary module for the checks. It has to be done in web assembly because
 // clang/llvm have no support yet for the reference types yet. In fact, the wasm
 // binary toolkit doesn't yet support the ref.test instruction either. To
-// convert the following module to the binary, my approach is to find and
-// replace "ref.test $type" -> "drop i32.const n" on the source text. This
-// results in the bytes "0x1a, 0x41, n" where we need the bytes "0xfb, 0x14, n"
-// so doing a find and replace on the output from "0x1a, 0x41" -> "0xfb, 0x14"
-// gets us the output we need.
+// convert the following textual wasm to a binary, you can build wabt from this
+// branch: https://github.com/WebAssembly/wabt/pull/2529 and then use that
+// wat2wasm binary.
 //
 // (module
 //     (type $type0 (func (param) (result i32)))
@@ -154,15 +152,15 @@ addOnPreRun(() => {
     let ptr = 0;
     try {
         const mod = new WebAssembly.Module(code);
-        const inst = new WebAssembly.Instance(mod, {e: {t: wasmTable}});
+        const inst = new WebAssembly.Instance(mod, { e: { t: wasmTable } });
         ptr = addFunction(inst.exports.f);
-    } catch(e) {
+    } catch (e) {
         // If something goes wrong, we'll null out _PyEM_CountFuncParams and fall
         // back to the JS trampoline.
     }
     Module._PyEM_CountArgsPtr = ptr;
-    const offset = HEAP32[__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET/4];
-    HEAP32[__PyRuntime/4 + offset] = ptr;
+    const offset = HEAP32[__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET / 4];
+    HEAP32[(__PyRuntime + offset) / 4] = ptr;
 });
 );
 
index ae1b649630171fb1463fc8f962737f7f167324c3..885c2cf7828d6c6404e055bf8c8d7ec7a2ca0299 100755 (executable)
--- a/configure
+++ b/configure
@@ -9627,7 +9627,7 @@ fi
 
         as_fn_append LINKFORSHARED " -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"
     as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV"
-    as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version"
+    as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET"
     as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB"
 
     if test "x$enable_wasm_dynamic_linking" = xyes
index cc499dfbc502f14e6f08043d07d1a4631971b936..f89a0801948ca53b88ffaccc3b3919392b59bab3 100644 (file)
@@ -2369,7 +2369,7 @@ AS_CASE([$ac_sys_system],
     dnl Include file system support
     AS_VAR_APPEND([LINKFORSHARED], [" -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"])
     AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV"])
-    AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version"])
+    AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET"])
     AS_VAR_APPEND([LINKFORSHARED], [" -sSTACK_SIZE=5MB"])
 
     AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [