Skip to content

Commit

Permalink
Revert "Simplify handling of bound errors and division by zero"
Browse files Browse the repository at this point in the history
This reverts commit fc651d6352b70822017b888e97158ec144fac73e.
  • Loading branch information
vouillon committed Jan 13, 2025
1 parent c042af6 commit bb3b65c
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 51 deletions.
16 changes: 9 additions & 7 deletions compiler/lib-wasm/generate.ml
Original file line number Diff line number Diff line change
Expand Up @@ -816,7 +816,11 @@ module Generate (Target : Target_sig.S) = struct
{ params = []; result = [] }
(body ~result_typ:[] ~fall_through:(`Block pc) ~context:(`Block pc :: context))
in
handler
if List.is_empty result_typ
then handler
else
let* () = handler in
instr (W.Return (Some (RefI31 (Const (I32 0l)))))
else body ~result_typ ~fall_through ~context

let wrap_with_handlers p pc ~result_typ ~fall_through ~context body =
Expand All @@ -825,20 +829,18 @@ module Generate (Target : Target_sig.S) = struct
need_bound_error_handler
bound_error_pc
(let* f =
register_import
~name:"caml_bound_error"
(Fun { params = []; result = [ Value.value ] })
register_import ~name:"caml_bound_error" (Fun { params = []; result = [] })
in
instr (Return_call (f, [])))
instr (CallInstr (f, [])))
(wrap_with_handler
need_zero_divide_handler
zero_divide_pc
(let* f =
register_import
~name:"caml_raise_zero_divide"
(Fun { params = []; result = [ Value.value ] })
(Fun { params = []; result = [] })
in
instr (Return_call (f, [])))
instr (CallInstr (f, [])))
body)
~result_typ
~fall_through
Expand Down
46 changes: 23 additions & 23 deletions runtime/wasm/bigarray.wat
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
(func $ta_blit_to_string
(param (ref extern)) (param i32) (param (ref $string)) (param i32)
(param i32)))
(import "fail" "caml_bound_error" (func $caml_bound_error (result (ref eq))))
(import "fail" "caml_bound_error" (func $caml_bound_error))
(import "fail" "caml_raise_out_of_memory" (func $caml_raise_out_of_memory))
(import "fail" "caml_invalid_argument"
(func $caml_invalid_argument (param (ref eq))))
Expand Down Expand Up @@ -974,7 +974,7 @@
(if (i32.ge_u (local.get $i)
(array.get $int_array (struct.get $bigarray 2 (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(return_call $caml_ba_get_at_offset (local.get $ba) (local.get $i)))

(func (export "caml_ba_set_1")
Expand All @@ -988,7 +988,7 @@
(if (i32.ge_u (local.get $i)
(array.get $int_array (struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(call $caml_ba_set_at_offset
(local.get $ba) (local.get $i) (local.get $v))
(ref.i31 (i32.const 0)))
Expand Down Expand Up @@ -1026,7 +1026,7 @@
(i32.ge_u (local.get $j)
(array.get $int_array (local.get $dim) (i32.const 1))))
(then
(return_call $caml_bound_error)))
(call $caml_bound_error)))
(return_call $caml_ba_get_at_offset (local.get $ba) (local.get $offset)))

(func (export "caml_ba_set_2")
Expand Down Expand Up @@ -1062,7 +1062,7 @@
(i32.ge_u (local.get $j)
(array.get $int_array (local.get $dim) (i32.const 1))))
(then
(return_call $caml_bound_error)))
(call $caml_bound_error)))
(call $caml_ba_set_at_offset
(local.get $ba) (local.get $offset) (local.get $v))
(ref.i31 (i32.const 0)))
Expand Down Expand Up @@ -1120,7 +1120,7 @@
(i32.ge_u (local.get $k)
(array.get $int_array (local.get $dim) (i32.const 2)))))
(then
(return_call $caml_bound_error)))
(call $caml_bound_error)))
(return_call $caml_ba_get_at_offset (local.get $ba) (local.get $offset)))

(func (export "caml_ba_set_3")
Expand Down Expand Up @@ -1173,7 +1173,7 @@
(i32.ge_u (local.get $k)
(array.get $int_array (local.get $dim) (i32.const 2)))))
(then
(return_call $caml_bound_error)))
(call $caml_bound_error)))
(call $caml_ba_set_at_offset
(local.get $ba) (local.get $offset) (local.get $v))
(ref.i31 (i32.const 0)))
Expand Down Expand Up @@ -1204,7 +1204,7 @@
(array.get $int_array (local.get $dim) (local.get $i)))
(if (i32.ge_u (local.get $idx) (local.get $l))
(then
(drop (call $caml_bound_error))))
(call $caml_bound_error)))
(local.set $offset
(i32.add (i32.mul (local.get $offset) (local.get $l))
(local.get $idx)))
Expand All @@ -1222,7 +1222,7 @@
(array.get $int_array (local.get $dim) (local.get $i)))
(if (i32.ge_u (local.get $idx) (local.get $l))
(then
(drop (call $caml_bound_error))))
(call $caml_bound_error)))
(local.set $offset
(i32.add (i32.mul (local.get $offset) (local.get $l))
(local.get $idx)))
Expand Down Expand Up @@ -1255,7 +1255,7 @@
(array.get $int_array (local.get $dim) (local.get $i)))
(if (i32.ge_u (local.get $idx) (local.get $l))
(then
(drop (call $caml_bound_error))))
(call $caml_bound_error)))
(local.set $offset
(i32.add (i32.mul (local.get $offset) (local.get $l))
(local.get $idx)))
Expand All @@ -1276,7 +1276,7 @@
(array.get $int_array (local.get $dim) (local.get $i)))
(if (i32.ge_u (local.get $idx) (local.get $l))
(then
(drop (call $caml_bound_error))))
(call $caml_bound_error)))
(local.set $offset
(i32.add (i32.mul (local.get $offset) (local.get $l))
(local.get $idx)))
Expand Down Expand Up @@ -1910,12 +1910,12 @@
(local.set $data (struct.get $bigarray $ba_data (local.get $ba)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 1))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(ref.i31 (call $ta_get16_ui8 (local.get $data) (local.get $p))))

(func (export "caml_ba_uint8_get32")
Expand All @@ -1927,12 +1927,12 @@
(local.set $data (struct.get $bigarray $ba_data (local.get $ba)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 3))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(return_call $ta_get32_ui8 (local.get $data) (local.get $p)))

(func (export "caml_ba_uint8_get64")
Expand All @@ -1944,12 +1944,12 @@
(local.set $data (struct.get $bigarray $ba_data (local.get $ba)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 7))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(i64.or
(i64.extend_i32_u
(call $ta_get32_ui8 (local.get $data) (local.get $p)))
Expand All @@ -1969,12 +1969,12 @@
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(local.set $d (ref.cast (ref i31) (local.get $v)))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 1))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(call $ta_set16_ui8 (local.get $data) (local.get $p) (local.get $d))
(ref.i31 (i32.const 0)))

Expand All @@ -1988,12 +1988,12 @@
(local.set $data (struct.get $bigarray $ba_data (local.get $ba)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 3))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(call $ta_set32_ui8 (local.get $data) (local.get $p) (local.get $d))
(ref.i31 (i32.const 0)))

Expand All @@ -2007,12 +2007,12 @@
(local.set $data (struct.get $bigarray $ba_data (local.get $ba)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 7))
(array.get $int_array
(struct.get $bigarray $ba_dim (local.get $ba))
(i32.const 0)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(call $ta_set32_ui8 (local.get $data) (local.get $p)
(i32.wrap_i64 (local.get $d)))
(call $ta_set32_ui8 (local.get $data)
Expand Down
14 changes: 6 additions & 8 deletions runtime/wasm/fail.wat
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,10 @@

(data $index_out_of_bounds "index out of bounds")

(func (export "caml_bound_error") (result (ref eq))
(call $caml_invalid_argument
(func (export "caml_bound_error")
(return_call $caml_invalid_argument
(array.new_data $string $index_out_of_bounds
(i32.const 0) (i32.const 19)))
(ref.i31 (i32.const 0)))
(i32.const 0) (i32.const 19))))

(global $END_OF_FILE_EXN i32 (i32.const 4))

Expand All @@ -88,11 +87,10 @@

(global $ZERO_DIVIDE_EXN i32 (i32.const 5))

(func (export "caml_raise_zero_divide") (result (ref eq))
(call $caml_raise_constant
(func (export "caml_raise_zero_divide")
(return_call $caml_raise_constant
(array.get $block (global.get $caml_global_data)
(global.get $ZERO_DIVIDE_EXN)))
(ref.i31 (i32.const 0)))
(global.get $ZERO_DIVIDE_EXN))))

(global $NOT_FOUND_EXN i32 (i32.const 6))

Expand Down
26 changes: 13 additions & 13 deletions runtime/wasm/string.wat
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

(module
(import "fail" "caml_bound_error" (func $caml_bound_error (result (ref eq))))
(import "fail" "caml_bound_error" (func $caml_bound_error))
(import "fail" "caml_invalid_argument"
(func $caml_invalid_argument (param $arg (ref eq))))

Expand Down Expand Up @@ -162,10 +162,10 @@
(local.set $s (ref.cast (ref $string) (local.get $v)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 1))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(ref.i31 (i32.or
(array.get_u $string (local.get $s) (local.get $p))
(i32.shl (array.get_u $string (local.get $s)
Expand All @@ -179,10 +179,10 @@
(local.set $s (ref.cast (ref $string) (local.get $v)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 3))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(i32.or
(i32.or
(array.get_u $string (local.get $s) (local.get $p))
Expand All @@ -204,10 +204,10 @@
(local.set $s (ref.cast (ref $string) (local.get $v)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get $i))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 7))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(i64.or
(i64.or
(i64.or
Expand Down Expand Up @@ -253,10 +253,10 @@
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get 1))))
(local.set $v (i31.get_s (ref.cast (ref i31) (local.get 2))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 1))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(array.set $string (local.get $s) (local.get $p) (local.get $v))
(array.set $string (local.get $s)
(i32.add (local.get $p) (i32.const 1))
Expand All @@ -269,10 +269,10 @@
(local.set $s (ref.cast (ref $string) (local.get 0)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get 1))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 3))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(array.set $string (local.get $s) (local.get $p) (local.get $v))
(array.set $string (local.get $s)
(i32.add (local.get $p) (i32.const 1))
Expand All @@ -291,10 +291,10 @@
(local.set $s (ref.cast (ref $string) (local.get 0)))
(local.set $p (i31.get_s (ref.cast (ref i31) (local.get 1))))
(if (i32.lt_s (local.get $p) (i32.const 0))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(if (i32.ge_u (i32.add (local.get $p) (i32.const 7))
(array.len (local.get $s)))
(then (return_call $caml_bound_error)))
(then (call $caml_bound_error)))
(array.set $string (local.get $s) (local.get $p)
(i32.wrap_i64 (local.get $v)))
(array.set $string (local.get $s)
Expand Down

0 comments on commit bb3b65c

Please sign in to comment.