Skip to content

Commit 6dc0fa8

Browse files
ospencerphated
authored andcommitted
feat: write bindings for add_table
1 parent 61d28c5 commit 6dc0fa8

File tree

8 files changed

+60
-4
lines changed

8 files changed

+60
-4
lines changed

js/table.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
open Js_of_ocaml.Js
2+
open Js_of_ocaml.Js.Unsafe
3+
4+
let add_table wasm_mod name initial maximum funcnames offset =
5+
meth_call wasm_mod "addTable"
6+
[|
7+
inject (string name);
8+
inject initial;
9+
inject maximum;
10+
inject (array (Array.of_list (List.map string funcnames)));
11+
inject offset;
12+
|]

src/binaryen_stubs_tables.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#define CAML_NAME_SPACE
2+
#include <caml/mlvalues.h>
3+
#include <caml/fail.h>
4+
#include <caml/memory.h>
5+
6+
#include "binaryen-c.h"
7+
#include "ocaml_helpers.h"
8+
9+
10+
CAMLprim value
11+
caml_binaryen_add_table(value _module, value _name, value _initial, value _maximum, value _funcnames, value _offset) {
12+
CAMLparam5(_module, _name, _initial, _maximum, _funcnames);
13+
CAMLxparam1(_offset);
14+
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
15+
char* name = Safe_String_val(_name);
16+
BinaryenIndex initial = Int_val(_initial);
17+
BinaryenIndex maximum = Int_val(_maximum);
18+
_funcnames = array_of_list(_funcnames);
19+
int funcnamesLen = array_length(_funcnames);
20+
const char* funcnames[funcnamesLen];
21+
for (int i = 0; i < funcnamesLen; i++) {
22+
funcnames[i] = Safe_String_val(Field(_funcnames, i));
23+
}
24+
BinaryenExpressionRef offset = BinaryenExpressionRef_val(_offset);
25+
BinaryenAddTable(module, name, initial, maximum, funcnames, funcnamesLen, offset);
26+
CAMLreturn(Val_unit);
27+
}
28+
CAMLprim value
29+
caml_binaryen_add_table__bytecode(value * argv) {
30+
return caml_binaryen_add_table(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
31+
}

src/dune

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
(names binaryen_stubs_types binaryen_stubs_ops binaryen_stubs_literals
88
binaryen_stubs_expressions binaryen_stubs_functions
99
binaryen_stubs_imports binaryen_stubs_exports binaryen_stubs_globals
10-
binaryen_stubs_function_tables binaryen_stubs_memory
11-
binaryen_stubs_features binaryen_stubs_modules ocaml_helpers)
10+
binaryen_stubs_function_tables binaryen_stubs_tables
11+
binaryen_stubs_memory binaryen_stubs_features binaryen_stubs_modules
12+
ocaml_helpers)
1213
(flags -O2 -Wall -Wextra))
1314
(foreign_archives binaryen)
1415
(library_flags

src/table.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
external add_table :
2+
Module.t -> string -> int -> int -> string list -> Expression.t -> unit
3+
= "caml_binaryen_add_table__bytecode" "caml_binaryen_add_table"
4+
(** Module, name, initial size, maximum size, function names, offset. *)

test/test.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
(module
22
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
33
(memory $0 1)
4+
(table $table 1 1 funcref)
5+
(elem (i32.const 0) $adder)
46
(export "adder" (func $adder))
57
(export "memory" (memory $0))
68
(func $adder (param $0 i32) (param $1 i32) (result i32)

test/test.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ let adder = Function.add_function wasm_mod "adder" params results [||] add
3030

3131
let _ = Export.add_function_export wasm_mod "adder" "adder"
3232

33+
let _ =
34+
Table.add_table wasm_mod "table" 1 1 [ "adder" ]
35+
(Expression.const wasm_mod (Literal.int32 0l))
36+
3337
let _ = Memory.set_memory wasm_mod 1 Memory.unlimited "memory" [] false
3438

3539
let _ = Module.print wasm_mod

virtual/dune

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
(library
22
(name binaryen)
33
(public_name binaryen)
4-
(virtual_modules export expression features function function_table global
5-
import literal memory module op type)
4+
(virtual_modules export expression features function function_table table
5+
global import literal memory module op type)
66
(default_implementation binaryen.native))

virtual/table.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
val add_table :
2+
Module.t -> string -> int -> int -> string list -> Expression.t -> unit

0 commit comments

Comments
 (0)