Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion binaryen.opam
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ depends: [
"dune" {>= "3.0.0"}
"dune-configurator" {>= "3.0.0"}
"js_of_ocaml-compiler" {>= "6.0.0" < "7.0.0"}
"libbinaryen" {>= "116.0.0" < "117.0.0"}
"libbinaryen" {>= "117.0.0" < "118.0.0"}
]
12 changes: 6 additions & 6 deletions esy.lock/index.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"license": "Apache-2.0",
"dependencies": {
"ocaml": ">= 4.13.0 < 5.0.0",
"@grain/libbinaryen": ">= 116.0.0 < 117.0.0",
"@grain/libbinaryen": ">= 117.0.0 < 118.0.0",
"@opam/dune": ">= 3.0.0",
"@opam/dune-configurator": ">= 3.0.0"
},
Expand Down
24 changes: 0 additions & 24 deletions src/expression.ml
Original file line number Diff line number Diff line change
Expand Up @@ -706,22 +706,9 @@ module Memory_init = struct
external make : Module.t -> string -> t -> t -> t -> string -> t
= "caml_binaryen_memory_init__bytecode" "caml_binaryen_memory_init"
(** Module, segment, destination, offset, size, memory_name *)

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let make wasm_mod segment dest offset size memory_name =
make wasm_mod (string_of_int segment) dest offset size memory_name

external get_segment : t -> string = "caml_binaryen_memory_init_get_segment"

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let get_segment expr = int_of_string (get_segment expr)

external set_segment : t -> string -> unit
= "caml_binaryen_memory_init_set_segment"

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let set_segment expr segment = set_segment expr (string_of_int segment)

external get_dest : t -> t = "caml_binaryen_memory_init_get_dest"
external set_dest : t -> t -> unit = "caml_binaryen_memory_init_set_dest"
external get_offset : t -> t = "caml_binaryen_memory_init_get_offset"
Expand All @@ -733,20 +720,9 @@ end
module Data_drop = struct
external make : Module.t -> string -> t = "caml_binaryen_data_drop"
(** Module, segment. *)

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let make wasm_mod segment = make wasm_mod (string_of_int segment)

external get_segment : t -> string = "caml_binaryen_data_drop_get_segment"

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let get_segment expr = int_of_string (get_segment expr)

external set_segment : t -> string -> unit
= "caml_binaryen_data_drop_set_segment"

(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
let set_segment expr segment = set_segment expr (string_of_int segment)
end

module Memory_copy = struct
Expand Down
12 changes: 6 additions & 6 deletions src/expression.mli
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,9 @@ module Memory_grow : sig
end

module Memory_init : sig
val make : Module.t -> int -> t -> t -> t -> string -> t
val get_segment : t -> int
val set_segment : t -> int -> unit
val make : Module.t -> string -> t -> t -> t -> string -> t
val get_segment : t -> string
val set_segment : t -> string -> unit
val get_dest : t -> t
val set_dest : t -> t -> unit
val get_offset : t -> t
Expand All @@ -268,9 +268,9 @@ module Memory_init : sig
end

module Data_drop : sig
val make : Module.t -> int -> t
val get_segment : t -> int
val set_segment : t -> int -> unit
val make : Module.t -> string -> t
val get_segment : t -> string
val set_segment : t -> string -> unit
end

module Memory_copy : sig
Expand Down
54 changes: 30 additions & 24 deletions src/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,25 @@


CAMLprim value
caml_binaryen_set_memory(value _module, value _initial, value _maximum, value _exportName, value _segments, value _segmentPassive, value _segmentOffsets, value _segmentSizes, value _shared, value _memory64, value _memoryName) {
CAMLparam5(_module, _initial, _maximum, _exportName, _segments);
CAMLxparam5(_segmentPassive, _segmentOffsets, _segmentSizes, _shared, _memory64);
CAMLxparam1(_memoryName);
caml_binaryen_set_memory(value _module, value _initial, value _maximum, value _exportName, value _segment_names, value _segment_data, value _segmentPassive, value _segmentOffsets, value _segmentSizes, value _shared, value _memory64, value _memoryName) {
CAMLparam5(_module, _initial, _maximum, _exportName, _segment_names);
CAMLxparam5(_segment_data, _segmentPassive, _segmentOffsets, _segmentSizes, _shared);
CAMLxparam2(_memory64, _memoryName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
BinaryenIndex initial = Int_val(_initial);
BinaryenIndex maximum = Int_val(_maximum);
char* exportName = Safe_String_val(_exportName);
_segments = array_of_list(_segments);
int segmentsLen = array_length(_segments);
const char* segments[segmentsLen];
for (int i = 0; i < segmentsLen; i++) {
segments[i] = Safe_String_val(Field(_segments, i));
_segment_names = array_of_list(_segment_names);
int segmentNamesLen = array_length(_segment_names);
const char* segment_names[segmentNamesLen];
for (int i = 0; i < segmentNamesLen; i++) {
segment_names[i] = Safe_String_val(Field(_segment_names, i));
}
_segment_data = array_of_list(_segment_data);
int segmentDataLen = array_length(_segment_data);
const char* segment_data[segmentDataLen];
for (int i = 0; i < segmentDataLen; i++) {
segment_data[i] = Safe_String_val(Field(_segment_data, i));
}
_segmentPassive = array_of_list(_segmentPassive);
int segmentPassiveLen = array_length(_segmentPassive);
Expand All @@ -43,12 +49,12 @@ caml_binaryen_set_memory(value _module, value _initial, value _maximum, value _e
bool shared = Bool_val(_shared);
bool memory64 = Bool_val(_memory64);
char* memoryName = Safe_String_val(_memoryName);
BinaryenSetMemory(module, initial, maximum, exportName, segments, segmentPassive, segmentOffsets, segmentSizes, segmentsLen, shared, memory64, memoryName);
BinaryenSetMemory(module, initial, maximum, exportName, segment_names, segment_data, segmentPassive, segmentOffsets, segmentSizes, segmentNamesLen, shared, memory64, memoryName);
CAMLreturn(Val_unit);
}
CAMLprim value
caml_binaryen_set_memory__bytecode(value * argv) {
return caml_binaryen_set_memory(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
return caml_binaryen_set_memory(argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
}

CAMLprim value
Expand Down Expand Up @@ -111,28 +117,28 @@ caml_binaryen_get_num_memory_segments(value _module) {
}

CAMLprim value
caml_binaryen_get_memory_segment_byte_offset(value _module, value _id) {
CAMLparam2(_module, _id);
caml_binaryen_get_memory_segment_byte_offset(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
BinaryenIndex id = Int_val(_id);
CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, id)));
char* name = Safe_String_val(_name);
CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, name)));
}

CAMLprim value
caml_binaryen_get_memory_segment_passive(value _module, value _id) {
CAMLparam2(_module, _id);
caml_binaryen_get_memory_segment_passive(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
BinaryenIndex id = Int_val(_id);
CAMLreturn(Val_bool(BinaryenGetMemorySegmentPassive(module, id)));
char* name = Safe_String_val(_name);
CAMLreturn(Val_bool(BinaryenGetMemorySegmentPassive(module, name)));
}

CAMLprim value
caml_binaryen_get_memory_segment_data(value _module, value _id) {
CAMLparam2(_module, _id);
caml_binaryen_get_memory_segment_data(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
BinaryenIndex id = Int_val(_id);
size_t size = BinaryenGetMemorySegmentByteLength(module, id);
char* name = Safe_String_val(_name);
size_t size = BinaryenGetMemorySegmentByteLength(module, name);
CAMLprim value bytes = caml_alloc_string(size);
BinaryenCopyMemorySegmentData(module, id, (char*)Bytes_val(bytes));
BinaryenCopyMemorySegmentData(module, name, (char*)Bytes_val(bytes));
CAMLreturn(bytes);
}
28 changes: 17 additions & 11 deletions src/memory.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,22 @@ function caml_binaryen_set_memory(
initial,
maximum,
exportName,
segments,
segmentNames,
segmentData,
segmentPassives,
segmentOffsets,
segmentSizes,
shared,
memory64,
memoryName
) {
var datas = caml_list_to_js_array(segmentData);
var passives = caml_list_to_js_array(segmentPassives);
var offsets = caml_list_to_js_array(segmentOffsets);
var segs = caml_list_to_js_array(segments).map(function (segment, idx) {
var segs = caml_list_to_js_array(segmentNames).map(function (name, idx) {
return {
data: caml_convert_bytes_to_array(segment),
name: caml_jsstring_of_string(name),
data: caml_convert_bytes_to_array(datas[idx]),
passive: caml_js_from_bool(passives[idx]),
offset: offsets[idx],
};
Expand Down Expand Up @@ -48,7 +51,8 @@ function caml_binaryen_set_memory__bytecode() {
arguments[7],
arguments[8],
arguments[9],
arguments[10]
arguments[10],
arguments[11]
);
}

Expand Down Expand Up @@ -108,20 +112,22 @@ function caml_binaryen_get_num_memory_segments(wasm_mod) {
}

//Provides: caml_binaryen_get_memory_segment_byte_offset
function caml_binaryen_get_memory_segment_byte_offset(wasm_mod, idx) {
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
//Requires: caml_jsstring_of_string
function caml_binaryen_get_memory_segment_byte_offset(wasm_mod, name) {
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
return info.offset;
}

//Provides: caml_binaryen_get_memory_segment_passive
function caml_binaryen_get_memory_segment_passive(wasm_mod, idx) {
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
//Requires: caml_jsstring_of_string
function caml_binaryen_get_memory_segment_passive(wasm_mod, name) {
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
return info.passive;
}

//Provides: caml_binaryen_get_memory_segment_data
//Requires: caml_bytes_of_array
function caml_binaryen_get_memory_segment_data(wasm_mod, idx) {
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
//Requires: caml_bytes_of_array, caml_jsstring_of_string
function caml_binaryen_get_memory_segment_data(wasm_mod, name) {
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
return caml_bytes_of_array(info.data);
}
35 changes: 23 additions & 12 deletions src/memory.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ external set_memory :
int ->
int ->
string ->
string list ->
bytes list ->
bool list ->
Expression.t list ->
Expand All @@ -12,34 +13,44 @@ external set_memory :
string ->
unit = "caml_binaryen_set_memory__bytecode" "caml_binaryen_set_memory"

type segment = { data : bytes; kind : segment_kind; size : int }
type segment = { name : string; data : bytes; kind : segment_kind; size : int }
and segment_kind = Passive | Active of { offset : Expression.t }

(** Module, initial size, maximum size, export name, segments, shared, memory64, moduleName . *)
let set_memory wasm_mod initial maximum export_name (segments : segment list)
shared memory64 moduleName =
let split_segments segments =
List.fold_right
(fun { data; kind; size }
(segment_data, segment_passive, segment_offsets, segment_sizes) ->
(fun { name; data; kind; size }
( segment_name,
segment_data,
segment_passive,
segment_offsets,
segment_sizes ) ->
match kind with
| Active { offset } ->
( data :: segment_data,
( name :: segment_name,
data :: segment_data,
false :: segment_passive,
offset :: segment_offsets,
size :: segment_sizes )
| Passive ->
( data :: segment_data,
( name :: segment_name,
data :: segment_data,
true :: segment_passive,
Expression.Null.make () :: segment_offsets,
size :: segment_sizes ))
segments ([], [], [], [])
segments ([], [], [], [], [])
in
let segment_data, segment_passive, segment_offsets, segment_sizes =
let ( segment_name,
segment_data,
segment_passive,
segment_offsets,
segment_sizes ) =
split_segments segments
in
set_memory wasm_mod initial maximum export_name segment_data segment_passive
segment_offsets segment_sizes shared memory64 moduleName
set_memory wasm_mod initial maximum export_name segment_name segment_data
segment_passive segment_offsets segment_sizes shared memory64 moduleName

external has_memory : Module.t -> bool = "caml_binaryen_has_memory"

Expand All @@ -59,11 +70,11 @@ let unlimited = -1
external get_num_segments : Module.t -> int
= "caml_binaryen_get_num_memory_segments"

external get_segment_byte_offset : Module.t -> int -> int
external get_segment_byte_offset : Module.t -> string -> int
= "caml_binaryen_get_memory_segment_byte_offset"

external get_segment_passive : Module.t -> int -> bool
external get_segment_passive : Module.t -> string -> bool
= "caml_binaryen_get_memory_segment_passive"

external get_segment_data : Module.t -> int -> bytes
external get_segment_data : Module.t -> string -> bytes
= "caml_binaryen_get_memory_segment_data"
8 changes: 4 additions & 4 deletions src/memory.mli
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
type segment = { data : bytes; kind : segment_kind; size : int }
type segment = { name : string; data : bytes; kind : segment_kind; size : int }
and segment_kind = Passive | Active of { offset : Expression.t }

val set_memory :
Expand All @@ -20,6 +20,6 @@ val is_shared : Module.t -> string -> bool
val is_64 : Module.t -> string -> bool
val unlimited : int
val get_num_segments : Module.t -> int
val get_segment_byte_offset : Module.t -> int -> int
val get_segment_passive : Module.t -> int -> bool
val get_segment_data : Module.t -> int -> bytes
val get_segment_byte_offset : Module.t -> string -> int
val get_segment_passive : Module.t -> string -> bool
val get_segment_data : Module.t -> string -> bytes
Loading
Loading