From 559341d13a7ba5abb8521f6d0d982d4f25b86ce0 Mon Sep 17 00:00:00 2001 From: Oscar Spencer Date: Fri, 8 Apr 2022 13:37:50 -0400 Subject: [PATCH] fix!: Expression.Return.get_value can be null (#149) * fix!: Expression.Return.get_value can be null * Add test --- src/binaryen_stubs_expressions.c | 7 ++++++- src/binaryen_stubs_expressions.js | 3 ++- src/expression.ml | 2 +- src/expression.mli | 2 +- test/test.ml | 14 ++++++++++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/binaryen_stubs_expressions.c b/src/binaryen_stubs_expressions.c index cfb2cc6a..791bedd1 100644 --- a/src/binaryen_stubs_expressions.c +++ b/src/binaryen_stubs_expressions.c @@ -1534,7 +1534,12 @@ CAMLprim value caml_binaryen_return_get_value(value _exp) { CAMLparam1(_exp); BinaryenExpressionRef exp = BinaryenExpressionRef_val(_exp); - CAMLreturn(alloc_BinaryenExpressionRef(BinaryenReturnGetValue(exp))); + BinaryenExpressionRef val = BinaryenReturnGetValue(exp); + if (val == NULL) { + CAMLreturn(Val_none); + } else { + CAMLreturn(caml_alloc_some(alloc_BinaryenExpressionRef(val))); + } } CAMLprim value diff --git a/src/binaryen_stubs_expressions.js b/src/binaryen_stubs_expressions.js index 58a471f8..08537805 100644 --- a/src/binaryen_stubs_expressions.js +++ b/src/binaryen_stubs_expressions.js @@ -1273,8 +1273,9 @@ function caml_binaryen_drop_set_value(exp, value) { //Provides: caml_binaryen_return_get_value //Requires: binaryen +//Requires: to_option function caml_binaryen_return_get_value(exp) { - return binaryen.Return.getValue(exp); + return to_option(binaryen.Return.getValue(exp)); } //Provides: caml_binaryen_return_set_value diff --git a/src/expression.ml b/src/expression.ml index 7220bfad..339076fd 100644 --- a/src/expression.ml +++ b/src/expression.ml @@ -693,7 +693,7 @@ end module Return = struct external make : Module.t -> t -> t = "caml_binaryen_return" - external get_value : t -> t = "caml_binaryen_return_get_value" + external get_value : t -> t option = "caml_binaryen_return_get_value" external set_value : t -> t -> unit = "caml_binaryen_return_set_value" end diff --git a/src/expression.mli b/src/expression.mli index acf8a2a7..1430228c 100644 --- a/src/expression.mli +++ b/src/expression.mli @@ -241,7 +241,7 @@ end module Return : sig val make : Module.t -> t -> t - val get_value : t -> t + val get_value : t -> t option val set_value : t -> t -> unit end diff --git a/test/test.ml b/test/test.ml index d4167e9b..3c641742 100644 --- a/test/test.ml +++ b/test/test.ml @@ -20,6 +20,20 @@ let _ = Settings.set_low_memory_unused false let wasm_mod = Module.create () let _ = Module.set_features wasm_mod [ Module.Feature.all ] +(* Testing Return.get_value *) +let _ = + assert ( + Option.is_some + (Expression.Return.get_value + (Expression.Return.make wasm_mod + (Expression.Const.make wasm_mod (Literal.int32 0l))))) + +let _ = + assert ( + Option.is_none + (Expression.Return.get_value + (Expression.Return.make wasm_mod (Expression.Null.make ())))) + (* Create function type for i32 (i32, i32) *) let params () = Type.create [| Type.int32; Type.int32 |] let results = Type.int32