Skip to content

Commit

Permalink
feat: Upgrade to Binaryen 100 (#75)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Table name must now be provided to the `Expression.call_indirect` and `Expression.return_call_indirect` instructions.
  • Loading branch information
ospencer committed Mar 5, 2021
1 parent 341e718 commit d59f5f9
Show file tree
Hide file tree
Showing 14 changed files with 357 additions and 167 deletions.
6 changes: 4 additions & 2 deletions js/expression.ml
Expand Up @@ -37,9 +37,10 @@ let call wasm_mod name params return_typ =
inject return_typ;
|]

let call_indirect wasm_mod target params params_typ return_typ =
let call_indirect wasm_mod table target params params_typ return_typ =
meth_call wasm_mod "call_indirect"
[|
inject table;
inject target;
inject (array (Array.of_list params));
inject params_typ;
Expand All @@ -54,9 +55,10 @@ let return_call wasm_mod name params return_typ =
inject return_typ;
|]

let return_call_indirect wasm_mod target params params_typ return_typ =
let return_call_indirect wasm_mod table target params params_typ return_typ =
meth_call wasm_mod "return_call_indirect"
[|
inject table;
inject target;
inject (array (Array.of_list params));
inject params_typ;
Expand Down
24 changes: 18 additions & 6 deletions src/binaryen_stubs_expressions.c
Expand Up @@ -103,9 +103,11 @@ caml_binaryen_call(value _module, value _name, value _params, value _retty) {
}

CAMLprim value
caml_binaryen_call_indirect(value _module, value _target, value _params, value _paramsty, value _retty) {
CAMLparam5(_module, _target, _params, _paramsty, _retty);
caml_binaryen_call_indirect(value _module, value _table, value _target, value _params, value _paramsty, value _retty) {
CAMLparam5(_module, _table, _target, _params, _paramsty);
CAMLxparam1(_retty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* table = Safe_String_val(_table);
BinaryenExpressionRef target = BinaryenExpressionRef_val(_target);
_params = array_of_list(_params);
int paramsLen = array_length(_params);
Expand All @@ -115,9 +117,13 @@ caml_binaryen_call_indirect(value _module, value _target, value _params, value _
}
BinaryenType paramsty = BinaryenType_val(_paramsty);
BinaryenType retty = BinaryenType_val(_retty);
BinaryenExpressionRef exp = BinaryenCallIndirect(module, target, params, paramsLen, paramsty, retty);
BinaryenExpressionRef exp = BinaryenCallIndirect(module, table, target, params, paramsLen, paramsty, retty);
CAMLreturn(alloc_BinaryenExpressionRef(exp));
}
CAMLprim value
caml_binaryen_call_indirect__bytecode(value * argv) {
return caml_binaryen_call_indirect(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
}

CAMLprim value
caml_binaryen_return_call(value _module, value _name, value _params, value _retty) {
Expand All @@ -136,9 +142,11 @@ caml_binaryen_return_call(value _module, value _name, value _params, value _rett
}

CAMLprim value
caml_binaryen_return_call_indirect(value _module, value _target, value _params, value _paramsty, value _retty) {
CAMLparam5(_module, _target, _params, _paramsty, _retty);
caml_binaryen_return_call_indirect(value _module, value _table, value _target, value _params, value _paramsty, value _retty) {
CAMLparam5(_module, _table, _target, _params, _paramsty);
CAMLxparam1(_retty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* table = Safe_String_val(_table);
BinaryenExpressionRef target = BinaryenExpressionRef_val(_target);
_params = array_of_list(_params);
int paramsLen = array_length(_params);
Expand All @@ -148,9 +156,13 @@ caml_binaryen_return_call_indirect(value _module, value _target, value _params,
}
BinaryenType paramsty = BinaryenType_val(_paramsty);
BinaryenType retty = BinaryenType_val(_retty);
BinaryenExpressionRef exp = BinaryenReturnCallIndirect(module, target, params, paramsLen, paramsty, retty);
BinaryenExpressionRef exp = BinaryenReturnCallIndirect(module, table, target, params, paramsLen, paramsty, retty);
CAMLreturn(alloc_BinaryenExpressionRef(exp));
}
CAMLprim value
caml_binaryen_return_call_indirect__bytecode(value * argv) {
return caml_binaryen_return_call_indirect(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
}

CAMLprim value
caml_binaryen_local_get(value _module, value _slot, value _ty) {
Expand Down
5 changes: 5 additions & 0 deletions src/dune
Expand Up @@ -18,6 +18,11 @@
(action
(copy ../vendor/binaryen-c.h binaryen-c.h)))

(rule
(target wasm-delegations.h)
(action
(copy ../vendor/wasm-delegations.h wasm-delegations.h)))

(rule
(target libbinaryen.a)
(action
Expand Down
12 changes: 6 additions & 6 deletions src/expression.ml
Expand Up @@ -22,17 +22,17 @@ external call : Module.t -> string -> t list -> Type.t -> t
= "caml_binaryen_call"
(** Module, function name, params, return type. *)

external call_indirect : Module.t -> t -> t list -> Type.t -> Type.t -> t
= "caml_binaryen_call_indirect"
(** Module, function value, params, params type, return type. *)
external call_indirect : Module.t -> string -> t -> t list -> Type.t -> Type.t -> t
= "caml_binaryen_call_indirect__bytecode" "caml_binaryen_call_indirect"
(** Module, table, function value, params, params type, return type. *)

external return_call : Module.t -> string -> t list -> Type.t -> t
= "caml_binaryen_return_call"
(** Module, function name, params, return type. *)

external return_call_indirect : Module.t -> t -> t list -> Type.t -> Type.t -> t
= "caml_binaryen_return_call_indirect"
(** Module, function value, params, params type, return type. *)
external return_call_indirect : Module.t -> string -> t -> t list -> Type.t -> Type.t -> t
= "caml_binaryen_return_call_indirect__bytecode" "caml_binaryen_return_call_indirect"
(** Module, table, function value, params, params type, return type. *)

external local_get : Module.t -> int -> Type.t -> t = "caml_binaryen_local_get"
(** Module, slot, type. *)
Expand Down

0 comments on commit d59f5f9

Please sign in to comment.