| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // dart2wasmOptions=--extra-compiler-option=--enable-experimental-wasm-interop |
| |
| import 'dart:_wasm'; |
| |
| import 'package:expect/expect.dart'; |
| |
| WasmTable<WasmFuncRef?> funcrefTable = WasmTable(3); |
| WasmTable<WasmFunction<int Function(int)>?> funcTable = WasmTable(1); |
| |
| void f1() {} |
| |
| void f2(int x) { |
| Expect.equals(4, x); |
| } |
| |
| int f3(int x) => x + 1; |
| |
| main() { |
| // Initialize untyped function table |
| Expect.equals(3, funcrefTable.size.toIntUnsigned()); |
| funcrefTable[0.toWasmI32()] = WasmFunction.fromFunction(f1); |
| funcrefTable[1.toWasmI32()] = WasmFunction.fromFunction(f2); |
| funcrefTable[2.toWasmI32()] = WasmFunction.fromFunction(f3); |
| |
| // Reading and calling functions in untyped function table |
| WasmFunction<void Function()>.fromFuncRef(funcrefTable[0.toWasmI32()]!) |
| .call(); |
| WasmFunction<void Function(int)>.fromFuncRef(funcrefTable[1.toWasmI32()]!) |
| .call(4); |
| Expect.equals( |
| 6, |
| WasmFunction<int Function(int)>.fromFuncRef(funcrefTable[2.toWasmI32()]!) |
| .call(5)); |
| |
| // Calling functions in untyped function table with callIndirect |
| funcrefTable.callIndirect<void Function()>(0.toWasmI32())(); |
| funcrefTable.callIndirect<void Function(int)>(1.toWasmI32())(4); |
| Expect.equals( |
| 16, funcrefTable.callIndirect<int Function(int)>(2.toWasmI32())(15)); |
| |
| // Initialize typed function table |
| Expect.equals(1, funcTable.size.toIntUnsigned()); |
| funcTable[0.toWasmI32()] = WasmFunction.fromFunction(f3); |
| |
| // Reading and calling function in typed function table |
| Expect.equals(8, funcTable[0.toWasmI32()]!.call(7)); |
| |
| // Calling function in typed function table with callIndirect |
| Expect.equals( |
| 18, funcTable.callIndirect<int Function(int)>(0.toWasmI32())(17)); |
| } |