// META: global=window,dedicatedworker,jsshell // META: script=/wasm/jsapi/wasm-module-builder.js // META: script=/wasm/jsapi/jspi/testharness-additions.js test(() => { let builder = new WasmModuleBuilder(); let js_tag = builder.addImportedTag("", "tag", kSig_v_r); let try_sig_index = builder.addType(kSig_i_v); let promise42 = new WebAssembly.Suspending(() => Promise.resolve(42)); let kPromise42Ref = builder.addImport("", "promise42", kSig_i_v); builder.addFunction("test", kSig_i_v) .addBody([ kExprTry, try_sig_index, kExprCallFunction, kPromise42Ref, kExprReturn, // If there was no trap or exception, return kExprCatch, js_tag, kExprI32Const, 43, kExprReturn, kExprEnd, ]) .exportFunc(); let instance = builder.instantiate({"": { promise42: promise42, tag: WebAssembly.JSTag, }}); assert_equals(43, instance.exports.test()); },"catch SuspendError"); promise_test(async t=>{ let builder = new WasmModuleBuilder(); let js_tag = builder.addImportedTag("", "tag", kSig_v_r); let try_sig_index = builder.addType(kSig_i_v); let promise42 = new WebAssembly.Suspending(() => Promise.resolve(42)); let kPromise42Ref = builder.addImport("", "promise42", kSig_i_v); let backChnnlRef = builder.addImport("","backChnnl",kSig_i_v); builder.addFunction("main", kSig_i_v) .addBody([ kExprTry, try_sig_index, kExprCallFunction, backChnnlRef, kExprReturn, // If there was no trap or exception, return kExprCatch, js_tag, kExprI32Const, 43, kExprReturn, kExprEnd, ]) .exportFunc(); builder.addFunction("inner", kSig_i_v) .addBody([ kExprCallFunction, kPromise42Ref, ]) .exportFunc(); let backChnnl = ()=>instance.exports.inner(); let instance = builder.instantiate({"": { promise42: promise42, backChnnl: backChnnl, tag: WebAssembly.JSTag, }}); wrapped_export = WebAssembly.promising(instance.exports.main); assert_equals(await wrapped_export(), 43); },"throw on reentrance"); test(() => { let builder = new WasmModuleBuilder(); import_index = builder.addImport('m', 'import', kSig_v_v); builder.addFunction("test", kSig_v_v) .addBody([ kExprCallFunction, import_index, ]).exportFunc(); let js_import = new WebAssembly.Suspending(() => Promise.resolve()); let instance = builder.instantiate({m: {import: js_import}}); assert_throws_js(WebAssembly.SuspendError, instance.exports.test); },"unwrapped export");