| //@ runWebAssemblySuite("--useWebAssemblyTypedFunctionReferences=true") |
| import * as assert from '../assert.js'; |
| import { instantiate } from "../wabt-wrapper.js"; |
| |
| function module(bytes, valid = true) { |
| let buffer = new ArrayBuffer(bytes.length); |
| let view = new Uint8Array(buffer); |
| for (let i = 0; i < bytes.length; ++i) { |
| view[i] = bytes.charCodeAt(i); |
| } |
| return new WebAssembly.Module(buffer); |
| } |
| |
| async function callFunctionFromTheSameInstance() { |
| /* |
| (module |
| (elem declare funcref (ref.func $foo)) |
| (func $foo (param $x i32) (result i32) |
| (i32.add (local.get $x) |
| (i32.const 19) |
| ) |
| ) |
| (func (export "main") (result i32) |
| (call_ref (i32.const 10) (ref.func $foo)) |
| ) |
| ) |
| */ |
| let instance = new WebAssembly.Instance(module("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x0a\x02\x60\x01\x7f\x01\x7f\x60\x00\x01\x7f\x03\x03\x02\x00\x01\x07\x08\x01\x04\x6d\x61\x69\x6e\x00\x01\x09\x05\x01\x03\x00\x01\x00\x0a\x11\x02\x07\x00\x20\x00\x41\x13\x6a\x0b\x07\x00\x41\x0a\xd2\x00\x14\x0b")); |
| assert.eq(instance.exports.main(), 29); |
| } |
| |
| async function callFunctionFromTheDifferentInstance() { |
| let wat = ` |
| (module |
| (func (export "bar") (param $x i32) (result i32) |
| (i32.add (local.get $x) |
| (i32.const 19)) |
| ) |
| )`; |
| const barProvider = await instantiate(wat, {}, {reference_types: true}); |
| |
| /* |
| (module |
| (import "exports" "bar" (func $bar (param i32) (result i32))) |
| (elem declare funcref (ref.func $bar)) |
| (func (export "main") (result i32) |
| (call_ref (i32.const 10) (ref.func $bar)) |
| ) |
| ) |
| */ |
| let instance = new WebAssembly.Instance( |
| module("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x0a\x02\x60\x01\x7f\x01\x7f\x60\x00\x01\x7f\x02\x0f\x01\x07\x65\x78\x70\x6f\x72\x74\x73\x03\x62\x61\x72\x00\x00\x03\x02\x01\x01\x07\x08\x01\x04\x6d\x61\x69\x6e\x00\x01\x09\x05\x01\x03\x00\x01\x00\x0a\x09\x01\x07\x00\x41\x0a\xd2\x00\x14\x0b"), |
| barProvider); |
| assert.eq(instance.exports.main(), 29); |
| } |
| |
| async function callFunctionFromJS() { |
| /* |
| (module |
| (import "exports" "bar" (func $bar (param i32) (result i32))) |
| (elem declare funcref (ref.func $bar)) |
| (func (export "main") (result i32) |
| (call_ref (i32.const 10) (ref.func $bar)) |
| ) |
| ) |
| */ |
| let instance = new WebAssembly.Instance( |
| module("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x0a\x02\x60\x01\x7f\x01\x7f\x60\x00\x01\x7f\x02\x0f\x01\x07\x65\x78\x70\x6f\x72\x74\x73\x03\x62\x61\x72\x00\x00\x03\x02\x01\x01\x07\x08\x01\x04\x6d\x61\x69\x6e\x00\x01\x09\x05\x01\x03\x00\x01\x00\x0a\x09\x01\x07\x00\x41\x0a\xd2\x00\x14\x0b"), |
| {exports: {bar : x => x + 19}}); |
| assert.eq(instance.exports.main(), 29); |
| } |
| |
| assert.asyncTest(callFunctionFromTheSameInstance()); |
| assert.asyncTest(callFunctionFromTheDifferentInstance()); |
| assert.asyncTest(callFunctionFromJS()); |