Skip to content

Commit

Permalink
feat: write bindings for add_table
Browse files Browse the repository at this point in the history
  • Loading branch information
ospencer authored and phated committed Mar 17, 2021
1 parent 61d28c5 commit 6dc0fa8
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 4 deletions.
12 changes: 12 additions & 0 deletions 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;
|]
31 changes: 31 additions & 0 deletions src/binaryen_stubs_tables.c
@@ -0,0 +1,31 @@
#define CAML_NAME_SPACE
#include <caml/mlvalues.h>
#include <caml/fail.h>
#include <caml/memory.h>

#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]);
}
5 changes: 3 additions & 2 deletions src/dune
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions 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. *)
2 changes: 2 additions & 0 deletions 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)
Expand Down
4 changes: 4 additions & 0 deletions test/test.ml
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions 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))
2 changes: 2 additions & 0 deletions virtual/table.mli
@@ -0,0 +1,2 @@
val add_table :
Module.t -> string -> int -> int -> string list -> Expression.t -> unit

0 comments on commit 6dc0fa8

Please sign in to comment.