diff --git a/js/table.ml b/js/table.ml new file mode 100644 index 00000000..25a70d88 --- /dev/null +++ b/js/table.ml @@ -0,0 +1,12 @@ +open Js_of_ocaml.Js +open Js_of_ocaml.Js.Unsafe + +let add_table wasm_mod name initial maximum funcnames offset = + meth_call wasm_mod "addTable" + [| + inject (string name); + inject initial; + inject maximum; + inject (array (Array.of_list (List.map string funcnames))); + inject offset; + |] diff --git a/src/binaryen_stubs_tables.c b/src/binaryen_stubs_tables.c new file mode 100644 index 00000000..5879c985 --- /dev/null +++ b/src/binaryen_stubs_tables.c @@ -0,0 +1,31 @@ +#define CAML_NAME_SPACE +#include +#include +#include + +#include "binaryen-c.h" +#include "ocaml_helpers.h" + + +CAMLprim value +caml_binaryen_add_table(value _module, value _name, value _initial, value _maximum, value _funcnames, value _offset) { + CAMLparam5(_module, _name, _initial, _maximum, _funcnames); + CAMLxparam1(_offset); + BinaryenModuleRef module = BinaryenModuleRef_val(_module); + char* name = Safe_String_val(_name); + BinaryenIndex initial = Int_val(_initial); + BinaryenIndex maximum = Int_val(_maximum); + _funcnames = array_of_list(_funcnames); + int funcnamesLen = array_length(_funcnames); + const char* funcnames[funcnamesLen]; + for (int i = 0; i < funcnamesLen; i++) { + funcnames[i] = Safe_String_val(Field(_funcnames, i)); + } + BinaryenExpressionRef offset = BinaryenExpressionRef_val(_offset); + BinaryenAddTable(module, name, initial, maximum, funcnames, funcnamesLen, offset); + CAMLreturn(Val_unit); +} +CAMLprim value +caml_binaryen_add_table__bytecode(value * argv) { + return caml_binaryen_add_table(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); +} diff --git a/src/dune b/src/dune index e14d7f81..d766da24 100644 --- a/src/dune +++ b/src/dune @@ -7,8 +7,9 @@ (names binaryen_stubs_types binaryen_stubs_ops binaryen_stubs_literals binaryen_stubs_expressions binaryen_stubs_functions binaryen_stubs_imports binaryen_stubs_exports binaryen_stubs_globals - binaryen_stubs_function_tables binaryen_stubs_memory - binaryen_stubs_features binaryen_stubs_modules ocaml_helpers) + binaryen_stubs_function_tables binaryen_stubs_tables + binaryen_stubs_memory binaryen_stubs_features binaryen_stubs_modules + ocaml_helpers) (flags -O2 -Wall -Wextra)) (foreign_archives binaryen) (library_flags diff --git a/src/table.ml b/src/table.ml new file mode 100644 index 00000000..46734221 --- /dev/null +++ b/src/table.ml @@ -0,0 +1,4 @@ +external add_table : + Module.t -> string -> int -> int -> string list -> Expression.t -> unit + = "caml_binaryen_add_table__bytecode" "caml_binaryen_add_table" +(** Module, name, initial size, maximum size, function names, offset. *) diff --git a/test/test.expected b/test/test.expected index 081672a0..91861847 100644 --- a/test/test.expected +++ b/test/test.expected @@ -1,6 +1,8 @@ (module (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (memory $0 1) + (table $table 1 1 funcref) + (elem (i32.const 0) $adder) (export "adder" (func $adder)) (export "memory" (memory $0)) (func $adder (param $0 i32) (param $1 i32) (result i32) diff --git a/test/test.ml b/test/test.ml index 765b8313..557debe1 100644 --- a/test/test.ml +++ b/test/test.ml @@ -30,6 +30,10 @@ let adder = Function.add_function wasm_mod "adder" params results [||] add let _ = Export.add_function_export wasm_mod "adder" "adder" +let _ = + Table.add_table wasm_mod "table" 1 1 [ "adder" ] + (Expression.const wasm_mod (Literal.int32 0l)) + let _ = Memory.set_memory wasm_mod 1 Memory.unlimited "memory" [] false let _ = Module.print wasm_mod diff --git a/virtual/dune b/virtual/dune index f8cccb4e..ba47b675 100644 --- a/virtual/dune +++ b/virtual/dune @@ -1,6 +1,6 @@ (library (name binaryen) (public_name binaryen) - (virtual_modules export expression features function function_table global - import literal memory module op type) + (virtual_modules export expression features function function_table table + global import literal memory module op type) (default_implementation binaryen.native)) diff --git a/virtual/table.mli b/virtual/table.mli new file mode 100644 index 00000000..e92b4fbc --- /dev/null +++ b/virtual/table.mli @@ -0,0 +1,2 @@ +val add_table : + Module.t -> string -> int -> int -> string list -> Expression.t -> unit