wasm2js: function table undefined after calling async function
还没有人认领这个 Issue。
评估
调研方向
先从链接 gist 中由 wasm2js 生成的 JavaScript 文件以及所引用的 algokit-core 修订版本开始,然后使用 wasm-pack 的输出复现异步 Rust 到 JavaScript 的回调路径。在 makeMutClosure 和 __wbindgen_export_3 附近,对比失败的 wasm2js 模块与正常工作的 WASM 模块。当异步路径不再到达未定义的函数表时,即表示完成。
由索引模型根据 Issue 内容生成。
描述
A wasm2js-transpiled JS module is throwing an error after an async call, but the WASM binary is working just fine. The wasm binary is compiled from a rust crate using wasm-bindgen and then built with wasm-pack. For some context, this async call is to a Rust function that then makes a async call back into JS before returning.
The error in particular is
# Unhandled error between tests
-------------------------------
152 | try {
153 | return f(a, state.b, ...args);
154 | } finally {
155 | if (--state.cnt === 0) {
156 | console.debug("In makeMutClosure", {export3: wasm$1.__wbindgen_export_3, wasm1: wasm$1});
157 | wasm$1.__wbindgen_export_3.get(state.dtor)(a, state.b);
^
TypeError: undefined is not an object (evaluating 'wasm$1.__wbindgen_export_3.get')
at real (/Users/joe/git/algorandfoundation/algokit-core/packages/typescript/algokit_utils/dist/algokit_utils.wasm2js.mjs:157:24)
To be clear, the code after the async function still runs, so this seems to be happening async somewhere. Adding a debug statement to this finally block I can see, export 3, which is the function table, is indeed undefined.
In makeMutClosure {
export3: undefined,
wasm1: [Object: null prototype] {
__wbg_composer_free: [Function: $174],
__wbindgen_add_to_stack_pointer: [Function: $413],
__wbindgen_export_0: [Function: $330],
__wbindgen_export_1: [Function: $341],
__wbindgen_export_2: [Function: $390],
__wbindgen_export_4: [Function: $375],
__wbindgen_export_5: [Function: $358],
__wbindgen_export_6: [Function: $354],
addressFromPubKey: [Function: $248],
addressFromString: [Function: $249],
assignFee: [Function: $99],
attachSignature: [Function: $192],
composer_addTransaction: [Function: $138],
composer_encode: [Function: $131],
composer_getSuggestedParams: [Function: $336],
composer_new: [Function: $261],
composer_toJSON: [Function: $215],
composer_toString: [Function: $216],
composer_transactions: [Function: $77],
composer_valueOf: [Function: $214],
decodeTransaction: [Function: $86],
encodeTransaction: [Function: $164],
encodeTransactionRaw: [Function: $165],
estimateTransactionSize: [Function: $199],
getAlgorandConstant: [Function: legalstub$260],
getEncodedTransactionType: [Function: $61],
getTransactionId: [Function: $163],
getTransactionIdRaw: [Function: $162],
memory: {
grow: [Function: __wasm_memory_grow],
buffer: [Getter],
},
},
}
The same debug statement when using the WASM binary:
In makeMutClosure {
export3: Table {
length: 225,
grow: [Function: grow],
get: [Function: get],
set: [Function: set],
type: [Function: type],
},
wasm: [Object: null prototype] {
memory: Memory {
grow: [Function: grow],
buffer: ArrayBuffer(1179648) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... 1179135 more ],
type: [Function: type],
},
composer_addTransaction: [Function: 198],
composer_encode: [Function: 191],
composer_getSuggestedParams: [Function: 396],
composer_transactions: [Function: 137],
__wbg_composer_free: [Function: 234],
composer_new: [Function: 321],
composer_valueOf: [Function: 274],
composer_toJSON: [Function: 275],
composer_toString: [Function: 276],
getEncodedTransactionType: [Function: 121],
encodeTransaction: [Function: 224],
encodeTransactionRaw: [Function: 225],
decodeTransaction: [Function: 146],
attachSignature: [Function: 252],
estimateTransactionSize: [Function: 259],
addressFromPubKey: [Function: 308],
addressFromString: [Function: 309],
getTransactionIdRaw: [Function: 222],
getTransactionId: [Function: 223],
getAlgorandConstant: [Function: 320],
assignFee: [Function: 159],
__wbindgen_export_0: [Function: 390],
__wbindgen_export_1: [Function: 401],
__wbindgen_export_2: [Function: 450],
__wbindgen_export_3: Table {
length: 225,
grow: [Function: grow],
get: [Function: get],
set: [Function: set],
type: [Function: type],
},
__wbindgen_add_to_stack_pointer: [Function: 473],
__wbindgen_export_4: [Function: 435],
__wbindgen_export_5: [Function: 418],
__wbindgen_export_6: [Function: 414],
},
}
The JS files: https://gist.github.com/joe-p/0b12f34e45f5152043f3948d34572e40
The repo: https://github.com/algorandfoundation/algokit-core/tree/2b2eba2c60b0a6d008a4a15bbfa3a76374b04441/packages/typescript/algokit_utils
- 主要语言
- WebAssembly
- 星标
- 8.6k
- 派生
- 885
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 77
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
WebAssembly/binaryen 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 88/100
WebAssembly/binaryen#9135 · 1 条评论 ·
-
难度 2/5 半天 新手友好度 76/100
WebAssembly/binaryen#9018 · 3 条评论 ·
-
难度 5/5 一周以上 新手友好度 25/100
WebAssembly/binaryen#9133 ·
-
难度 4/5 3-5 天 新手友好度 52/100
WebAssembly/binaryen#9123 ·
-
难度 5/5 一周以上 新手友好度 35/100
WebAssembly/binaryen#9122 ·
查看 WebAssembly/binaryen 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 75/100
objectionary/eo#8923 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
-
Coarray integration tests carry no LABELS, so run_tests.py silently skips them under every backend 未关闭coarray
难度 2/5 1-3 小时 新手友好度 70/100
-
难度 2/5 1-3 小时 新手友好度 75/100
-
难度 1/5 1 小时以内 新手友好度 95/100