Skip to content

Commit e8ff14a

Browse files
committed
feat!: Upgrade to Binaryen v117
1 parent 3e1261e commit e8ff14a

File tree

11 files changed

+119
-116
lines changed

11 files changed

+119
-116
lines changed

binaryen.opam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ depends: [
1616
"dune" {>= "3.0.0"}
1717
"dune-configurator" {>= "3.0.0"}
1818
"js_of_ocaml-compiler" {>= "4.1.0" < "6.0.0"}
19-
"libbinaryen" {>= "116.0.0" < "117.0.0"}
19+
"libbinaryen" {>= "117.0.0" < "118.0.0"}
2020
]

esy.lock/index.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"license": "Apache-2.0",
77
"dependencies": {
88
"ocaml": ">= 4.13.0 < 5.0.0",
9-
"@grain/libbinaryen": ">= 116.0.0 < 117.0.0",
9+
"@grain/libbinaryen": ">= 117.0.0 < 118.0.0",
1010
"@opam/dune": ">= 3.0.0",
1111
"@opam/dune-configurator": ">= 3.0.0"
1212
},

src/expression.ml

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -706,22 +706,9 @@ module Memory_init = struct
706706
external make : Module.t -> string -> t -> t -> t -> string -> t
707707
= "caml_binaryen_memory_init__bytecode" "caml_binaryen_memory_init"
708708
(** Module, segment, destination, offset, size, memory_name *)
709-
710-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
711-
let make wasm_mod segment dest offset size memory_name =
712-
make wasm_mod (string_of_int segment) dest offset size memory_name
713-
714709
external get_segment : t -> string = "caml_binaryen_memory_init_get_segment"
715-
716-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
717-
let get_segment expr = int_of_string (get_segment expr)
718-
719710
external set_segment : t -> string -> unit
720711
= "caml_binaryen_memory_init_set_segment"
721-
722-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
723-
let set_segment expr segment = set_segment expr (string_of_int segment)
724-
725712
external get_dest : t -> t = "caml_binaryen_memory_init_get_dest"
726713
external set_dest : t -> t -> unit = "caml_binaryen_memory_init_set_dest"
727714
external get_offset : t -> t = "caml_binaryen_memory_init_get_offset"
@@ -733,20 +720,9 @@ end
733720
module Data_drop = struct
734721
external make : Module.t -> string -> t = "caml_binaryen_data_drop"
735722
(** Module, segment. *)
736-
737-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
738-
let make wasm_mod segment = make wasm_mod (string_of_int segment)
739-
740723
external get_segment : t -> string = "caml_binaryen_data_drop_get_segment"
741-
742-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
743-
let get_segment expr = int_of_string (get_segment expr)
744-
745724
external set_segment : t -> string -> unit
746725
= "caml_binaryen_data_drop_set_segment"
747-
748-
(* Binaryen v113 still uses indexes for data segements, so we only want to change the binding itself, not our interface *)
749-
let set_segment expr segment = set_segment expr (string_of_int segment)
750726
end
751727

752728
module Memory_copy = struct

src/expression.mli

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,9 @@ module Memory_grow : sig
256256
end
257257

258258
module Memory_init : sig
259-
val make : Module.t -> int -> t -> t -> t -> string -> t
260-
val get_segment : t -> int
261-
val set_segment : t -> int -> unit
259+
val make : Module.t -> string -> t -> t -> t -> string -> t
260+
val get_segment : t -> string
261+
val set_segment : t -> string -> unit
262262
val get_dest : t -> t
263263
val set_dest : t -> t -> unit
264264
val get_offset : t -> t
@@ -268,9 +268,9 @@ module Memory_init : sig
268268
end
269269

270270
module Data_drop : sig
271-
val make : Module.t -> int -> t
272-
val get_segment : t -> int
273-
val set_segment : t -> int -> unit
271+
val make : Module.t -> string -> t
272+
val get_segment : t -> string
273+
val set_segment : t -> string -> unit
274274
end
275275

276276
module Memory_copy : sig

src/memory.c

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@
88

99

1010
CAMLprim value
11-
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) {
12-
CAMLparam5(_module, _initial, _maximum, _exportName, _segments);
13-
CAMLxparam5(_segmentPassive, _segmentOffsets, _segmentSizes, _shared, _memory64);
14-
CAMLxparam1(_memoryName);
11+
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) {
12+
CAMLparam5(_module, _initial, _maximum, _exportName, _segment_names);
13+
CAMLxparam5(_segment_data, _segmentPassive, _segmentOffsets, _segmentSizes, _shared);
14+
CAMLxparam2(_memory64, _memoryName);
1515
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
1616
BinaryenIndex initial = Int_val(_initial);
1717
BinaryenIndex maximum = Int_val(_maximum);
1818
char* exportName = Safe_String_val(_exportName);
19-
_segments = array_of_list(_segments);
20-
int segmentsLen = array_length(_segments);
21-
const char* segments[segmentsLen];
22-
for (int i = 0; i < segmentsLen; i++) {
23-
segments[i] = Safe_String_val(Field(_segments, i));
19+
_segment_names = array_of_list(_segment_names);
20+
int segmentNamesLen = array_length(_segment_names);
21+
const char* segment_names[segmentNamesLen];
22+
for (int i = 0; i < segmentNamesLen; i++) {
23+
segment_names[i] = Safe_String_val(Field(_segment_names, i));
24+
}
25+
_segment_data = array_of_list(_segment_data);
26+
int segmentDataLen = array_length(_segment_data);
27+
const char* segment_data[segmentDataLen];
28+
for (int i = 0; i < segmentDataLen; i++) {
29+
segment_data[i] = Safe_String_val(Field(_segment_data, i));
2430
}
2531
_segmentPassive = array_of_list(_segmentPassive);
2632
int segmentPassiveLen = array_length(_segmentPassive);
@@ -43,12 +49,12 @@ caml_binaryen_set_memory(value _module, value _initial, value _maximum, value _e
4349
bool shared = Bool_val(_shared);
4450
bool memory64 = Bool_val(_memory64);
4551
char* memoryName = Safe_String_val(_memoryName);
46-
BinaryenSetMemory(module, initial, maximum, exportName, segments, segmentPassive, segmentOffsets, segmentSizes, segmentsLen, shared, memory64, memoryName);
52+
BinaryenSetMemory(module, initial, maximum, exportName, segment_names, segment_data, segmentPassive, segmentOffsets, segmentSizes, segmentNamesLen, shared, memory64, memoryName);
4753
CAMLreturn(Val_unit);
4854
}
4955
CAMLprim value
5056
caml_binaryen_set_memory__bytecode(value * argv) {
51-
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]);
57+
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]);
5258
}
5359

5460
CAMLprim value
@@ -111,28 +117,28 @@ caml_binaryen_get_num_memory_segments(value _module) {
111117
}
112118

113119
CAMLprim value
114-
caml_binaryen_get_memory_segment_byte_offset(value _module, value _id) {
115-
CAMLparam2(_module, _id);
120+
caml_binaryen_get_memory_segment_byte_offset(value _module, value _name) {
121+
CAMLparam2(_module, _name);
116122
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
117-
BinaryenIndex id = Int_val(_id);
118-
CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, id)));
123+
char* name = Safe_String_val(_name);
124+
CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, name)));
119125
}
120126

121127
CAMLprim value
122-
caml_binaryen_get_memory_segment_passive(value _module, value _id) {
123-
CAMLparam2(_module, _id);
128+
caml_binaryen_get_memory_segment_passive(value _module, value _name) {
129+
CAMLparam2(_module, _name);
124130
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
125-
BinaryenIndex id = Int_val(_id);
126-
CAMLreturn(Val_bool(BinaryenGetMemorySegmentPassive(module, id)));
131+
char* name = Safe_String_val(_name);
132+
CAMLreturn(Val_bool(BinaryenGetMemorySegmentPassive(module, name)));
127133
}
128134

129135
CAMLprim value
130-
caml_binaryen_get_memory_segment_data(value _module, value _id) {
131-
CAMLparam2(_module, _id);
136+
caml_binaryen_get_memory_segment_data(value _module, value _name) {
137+
CAMLparam2(_module, _name);
132138
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
133-
BinaryenIndex id = Int_val(_id);
134-
size_t size = BinaryenGetMemorySegmentByteLength(module, id);
139+
char* name = Safe_String_val(_name);
140+
size_t size = BinaryenGetMemorySegmentByteLength(module, name);
135141
CAMLprim value bytes = caml_alloc_string(size);
136-
BinaryenCopyMemorySegmentData(module, id, (char*)Bytes_val(bytes));
142+
BinaryenCopyMemorySegmentData(module, name, (char*)Bytes_val(bytes));
137143
CAMLreturn(bytes);
138144
}

src/memory.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@ function caml_binaryen_set_memory(
66
initial,
77
maximum,
88
exportName,
9-
segments,
9+
segmentNames,
10+
segmentData,
1011
segmentPassives,
1112
segmentOffsets,
1213
segmentSizes,
1314
shared,
1415
memory64,
1516
memoryName
1617
) {
18+
var datas = caml_list_to_js_array(segmentData);
1719
var passives = caml_list_to_js_array(segmentPassives);
1820
var offsets = caml_list_to_js_array(segmentOffsets);
19-
var segs = caml_list_to_js_array(segments).map(function (segment, idx) {
21+
var segs = caml_list_to_js_array(segmentNames).map(function (name, idx) {
2022
return {
21-
data: caml_convert_bytes_to_array(segment),
23+
name: caml_jsstring_of_string(name),
24+
data: caml_convert_bytes_to_array(datas[idx]),
2225
passive: caml_js_from_bool(passives[idx]),
2326
offset: offsets[idx],
2427
};
@@ -48,7 +51,8 @@ function caml_binaryen_set_memory__bytecode() {
4851
arguments[7],
4952
arguments[8],
5053
arguments[9],
51-
arguments[10]
54+
arguments[10],
55+
arguments[11]
5256
);
5357
}
5458

@@ -108,20 +112,22 @@ function caml_binaryen_get_num_memory_segments(wasm_mod) {
108112
}
109113

110114
//Provides: caml_binaryen_get_memory_segment_byte_offset
111-
function caml_binaryen_get_memory_segment_byte_offset(wasm_mod, idx) {
112-
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
115+
//Requires: caml_jsstring_of_string
116+
function caml_binaryen_get_memory_segment_byte_offset(wasm_mod, name) {
117+
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
113118
return info.offset;
114119
}
115120

116121
//Provides: caml_binaryen_get_memory_segment_passive
117-
function caml_binaryen_get_memory_segment_passive(wasm_mod, idx) {
118-
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
122+
//Requires: caml_jsstring_of_string
123+
function caml_binaryen_get_memory_segment_passive(wasm_mod, name) {
124+
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
119125
return info.passive;
120126
}
121127

122128
//Provides: caml_binaryen_get_memory_segment_data
123-
//Requires: caml_bytes_of_array
124-
function caml_binaryen_get_memory_segment_data(wasm_mod, idx) {
125-
var info = wasm_mod.getMemorySegmentInfoByIndex(idx);
129+
//Requires: caml_bytes_of_array, caml_jsstring_of_string
130+
function caml_binaryen_get_memory_segment_data(wasm_mod, name) {
131+
var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name));
126132
return caml_bytes_of_array(info.data);
127133
}

src/memory.ml

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ external set_memory :
33
int ->
44
int ->
55
string ->
6+
string list ->
67
bytes list ->
78
bool list ->
89
Expression.t list ->
@@ -12,34 +13,44 @@ external set_memory :
1213
string ->
1314
unit = "caml_binaryen_set_memory__bytecode" "caml_binaryen_set_memory"
1415

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

1819
(** Module, initial size, maximum size, export name, segments, shared, memory64, moduleName . *)
1920
let set_memory wasm_mod initial maximum export_name (segments : segment list)
2021
shared memory64 moduleName =
2122
let split_segments segments =
2223
List.fold_right
23-
(fun { data; kind; size }
24-
(segment_data, segment_passive, segment_offsets, segment_sizes) ->
24+
(fun { name; data; kind; size }
25+
( segment_name,
26+
segment_data,
27+
segment_passive,
28+
segment_offsets,
29+
segment_sizes ) ->
2530
match kind with
2631
| Active { offset } ->
27-
( data :: segment_data,
32+
( name :: segment_name,
33+
data :: segment_data,
2834
false :: segment_passive,
2935
offset :: segment_offsets,
3036
size :: segment_sizes )
3137
| Passive ->
32-
( data :: segment_data,
38+
( name :: segment_name,
39+
data :: segment_data,
3340
true :: segment_passive,
3441
Expression.Null.make () :: segment_offsets,
3542
size :: segment_sizes ))
36-
segments ([], [], [], [])
43+
segments ([], [], [], [], [])
3744
in
38-
let segment_data, segment_passive, segment_offsets, segment_sizes =
45+
let ( segment_name,
46+
segment_data,
47+
segment_passive,
48+
segment_offsets,
49+
segment_sizes ) =
3950
split_segments segments
4051
in
41-
set_memory wasm_mod initial maximum export_name segment_data segment_passive
42-
segment_offsets segment_sizes shared memory64 moduleName
52+
set_memory wasm_mod initial maximum export_name segment_name segment_data
53+
segment_passive segment_offsets segment_sizes shared memory64 moduleName
4354

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

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

62-
external get_segment_byte_offset : Module.t -> int -> int
73+
external get_segment_byte_offset : Module.t -> string -> int
6374
= "caml_binaryen_get_memory_segment_byte_offset"
6475

65-
external get_segment_passive : Module.t -> int -> bool
76+
external get_segment_passive : Module.t -> string -> bool
6677
= "caml_binaryen_get_memory_segment_passive"
6778

68-
external get_segment_data : Module.t -> int -> bytes
79+
external get_segment_data : Module.t -> string -> bytes
6980
= "caml_binaryen_get_memory_segment_data"

src/memory.mli

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
type segment = { data : bytes; kind : segment_kind; size : int }
1+
type segment = { name : string; data : bytes; kind : segment_kind; size : int }
22
and segment_kind = Passive | Active of { offset : Expression.t }
33

44
val set_memory :
@@ -20,6 +20,6 @@ val is_shared : Module.t -> string -> bool
2020
val is_64 : Module.t -> string -> bool
2121
val unlimited : int
2222
val get_num_segments : Module.t -> int
23-
val get_segment_byte_offset : Module.t -> int -> int
24-
val get_segment_passive : Module.t -> int -> bool
25-
val get_segment_data : Module.t -> int -> bytes
23+
val get_segment_byte_offset : Module.t -> string -> int
24+
val get_segment_passive : Module.t -> string -> bool
25+
val get_segment_data : Module.t -> string -> bytes

0 commit comments

Comments
 (0)