From aaf5c3cf397e4383cd3c19643bf0e856a7bbe473 Mon Sep 17 00:00:00 2001 From: Spotandjake Date: Sat, 13 Dec 2025 13:56:37 -0500 Subject: [PATCH 1/2] fix: `Memory.get_segment_byte_offset` on Passive data sections --- src/memory.c | 6 +++++- test/test.ml | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/memory.c b/src/memory.c index 6e8f8990..b4e9971d 100644 --- a/src/memory.c +++ b/src/memory.c @@ -121,7 +121,11 @@ caml_binaryen_get_memory_segment_byte_offset(value _module, value _name) { CAMLparam2(_module, _name); BinaryenModuleRef module = BinaryenModuleRef_val(_module); char* name = Safe_String_val(_name); - CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, name))); + if (BinaryenGetMemorySegmentPassive(module, name)) { + CAMLreturn(Val_int(-1)); + } else { + CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, name))); + } } CAMLprim value diff --git a/test/test.ml b/test/test.ml index a5ef4e90..07bdf174 100644 --- a/test/test.ml +++ b/test/test.ml @@ -248,6 +248,9 @@ let _ = Memory.set_memory max_memory_wasm_mod 1 2 "memory" [] false false "0" let _ = assert (Memory.has_max max_memory_wasm_mod "0" = true) let _ = assert (Memory.get_max max_memory_wasm_mod "0" = 2) +(* Memory.get_segment_byte_offset Passive *) +let _ = assert (Memory.get_segment_byte_offset wasm_mod "world" = -1) + let _ = assert ( Bytes.equal From 51801e8db8c321b53e37fcf1ad62a1e96843302b Mon Sep 17 00:00:00 2001 From: Spotandjake Date: Sun, 21 Dec 2025 15:45:51 -0500 Subject: [PATCH 2/2] feat: Use option instead --- src/memory.c | 5 +++-- src/memory.js | 4 ++-- src/memory.ml | 2 +- src/memory.mli | 2 +- test/test.ml | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/memory.c b/src/memory.c index b4e9971d..0feeeabc 100644 --- a/src/memory.c +++ b/src/memory.c @@ -122,9 +122,10 @@ caml_binaryen_get_memory_segment_byte_offset(value _module, value _name) { BinaryenModuleRef module = BinaryenModuleRef_val(_module); char* name = Safe_String_val(_name); if (BinaryenGetMemorySegmentPassive(module, name)) { - CAMLreturn(Val_int(-1)); + CAMLreturn(Val_none); } else { - CAMLreturn(Val_int(BinaryenGetMemorySegmentByteOffset(module, name))); + int offset = BinaryenGetMemorySegmentByteOffset(module, name); + CAMLreturn(caml_alloc_some(Val_int(offset))); } } diff --git a/src/memory.js b/src/memory.js index 43a12b77..006a9680 100644 --- a/src/memory.js +++ b/src/memory.js @@ -112,10 +112,10 @@ function caml_binaryen_get_num_memory_segments(wasm_mod) { } //Provides: caml_binaryen_get_memory_segment_byte_offset -//Requires: caml_jsstring_of_string +//Requires: caml_jsstring_of_string, to_option function caml_binaryen_get_memory_segment_byte_offset(wasm_mod, name) { var info = wasm_mod.getMemorySegmentInfo(caml_jsstring_of_string(name)); - return info.offset; + return to_option(info.offset); } //Provides: caml_binaryen_get_memory_segment_passive diff --git a/src/memory.ml b/src/memory.ml index 5f224b32..5e00286b 100644 --- a/src/memory.ml +++ b/src/memory.ml @@ -71,7 +71,7 @@ let unlimited = -1 external get_num_segments : Module.t -> int = "caml_binaryen_get_num_memory_segments" -external get_segment_byte_offset : Module.t -> string -> int +external get_segment_byte_offset : Module.t -> string -> int option = "caml_binaryen_get_memory_segment_byte_offset" external get_segment_passive : Module.t -> string -> bool diff --git a/src/memory.mli b/src/memory.mli index 6ecf64d8..1c99ecc1 100644 --- a/src/memory.mli +++ b/src/memory.mli @@ -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 -> string -> int +val get_segment_byte_offset : Module.t -> string -> int option val get_segment_passive : Module.t -> string -> bool val get_segment_data : Module.t -> string -> bytes diff --git a/test/test.ml b/test/test.ml index 07bdf174..f1e6aa02 100644 --- a/test/test.ml +++ b/test/test.ml @@ -249,7 +249,7 @@ let _ = assert (Memory.has_max max_memory_wasm_mod "0" = true) let _ = assert (Memory.get_max max_memory_wasm_mod "0" = 2) (* Memory.get_segment_byte_offset Passive *) -let _ = assert (Memory.get_segment_byte_offset wasm_mod "world" = -1) +let _ = assert (Memory.get_segment_byte_offset wasm_mod "world" = None) let _ = assert (