diff --git a/src/lib_scoru_wasm/test/test_wasm_pvm_encodings.ml b/src/lib_scoru_wasm/test/test_wasm_pvm_encodings.ml index 76ec21331815e3d2ad4afb65560101b68553e3fd..54d2f620e7d6511a2d0c2b5b5cf5a81774e2629b 100644 --- a/src/lib_scoru_wasm/test/test_wasm_pvm_encodings.ml +++ b/src/lib_scoru_wasm/test/test_wasm_pvm_encodings.ml @@ -149,20 +149,31 @@ let exn_gen = ] let error_state_gen = + (* The generator produces only known interpreter errors. *) + let extract_error = function + | `Interpreter e -> e + | `Unknown _ -> assert false + in let open QCheck2.Gen in let decode_error = let+ exn = exn_gen in - let error = Wasm_pvm_errors.refine_error exn in + let error = + Wasm_pvm_errors.extract_interpreter_error exn |> extract_error + in Wasm_pvm_errors.Decode_error error in let init_error = let+ exn = exn_gen in - let error = Wasm_pvm_errors.refine_error exn in + let error = + Wasm_pvm_errors.extract_interpreter_error exn |> extract_error + in Wasm_pvm_errors.Init_error error in let eval_error = let+ exn = exn_gen in - let error = Wasm_pvm_errors.refine_error exn in + let error = + Wasm_pvm_errors.extract_interpreter_error exn |> extract_error + in Wasm_pvm_errors.Eval_error error in let unknown_error = diff --git a/src/lib_scoru_wasm/wasm_pvm.ml b/src/lib_scoru_wasm/wasm_pvm.ml index df9ec1e218584f38e50ce4875fab927a069271fe..be33dbea6152ac70490f647811afb37ff9dca6ce 100644 --- a/src/lib_scoru_wasm/wasm_pvm.ml +++ b/src/lib_scoru_wasm/wasm_pvm.ml @@ -255,15 +255,16 @@ struct let next_tick_state pvm_state = let to_stuck exn = - let error = Wasm_pvm_errors.refine_error exn in + let error = Wasm_pvm_errors.extract_interpreter_error exn in let wasm_error = - if Wasm_pvm_errors.is_interpreter_error exn then - match pvm_state.tick_state with - | Decode _ -> Wasm_pvm_errors.Decode_error error - | Init _ -> Init_error error - | Eval _ -> Eval_error error - | Stuck _ -> Unknown_error error.raw_exception - else Unknown_error error.raw_exception + match error with + | `Interpreter error -> ( + match pvm_state.tick_state with + | Decode _ -> Wasm_pvm_errors.Decode_error error + | Init _ -> Init_error error + | Eval _ -> Eval_error error + | Stuck _ -> Unknown_error error.raw_exception) + | `Unknown raw_exception -> Unknown_error raw_exception in Lwt.return (Stuck wasm_error) in diff --git a/src/lib_scoru_wasm/wasm_pvm_errors.ml b/src/lib_scoru_wasm/wasm_pvm_errors.ml index 1215f0ff0b258089d0980c3de34eafe2ddc820c9..ac2bb777745bbd3ed793b1b8badaaa1cbf8a0cc3 100644 --- a/src/lib_scoru_wasm/wasm_pvm_errors.ml +++ b/src/lib_scoru_wasm/wasm_pvm_errors.ml @@ -34,41 +34,6 @@ type t = | Invalid_state of string | Unknown_error of string -let is_interpreter_error = - let open Lazy_containers in - function - (* Decoder errors. *) - | Values.TypeError _ | Binary_exn.EOS | Binary_exn.Utf8 - | Binary_exn.Decode_error.Error _ | Binary_exn.Encode_error.Error _ - | Decode.Step_error _ - (* Lazy_containers errors: these should've already been wrapped by - the decoder or the memory, but we consider them as interpreter - errors nonetheless. *) - | Lazy_map.UnexpectedAccess | Lazy_vector.Bounds | Lazy_vector.SizeOverflow - | Chunked_byte_vector.Bounds | Chunked_byte_vector.SizeOverflow - (* Validator errors: should not happen at all, but some usages of - the validator happens in the parser. *) - | Valid.Invalid _ - (* Table errors. *) - | Table.Type | Table.SizeLimit | Table.OutOfMemory | Table.Bounds - | Table.SizeOverflow - (* Memory errors. *) - | Memory.Type | Memory.SizeLimit | Memory.OutOfMemory | Memory.Bounds - | Memory.SizeOverflow - (* Globals errors. *) - | Global.Type | Global.NotMutable - (* Evaluation errors. *) - | Eval.Link _ | Eval.Trap _ | Eval.Crash _ | Eval.Exhaustion _ | Ixx.Overflow - | Eval.Init_step_error _ | Ixx.DivideByZero | Ixx.InvalidConversion - (* Inputs errors. *) - | Input_buffer.Bounds | Input_buffer.SizeOverflow - | Input_buffer.Cannot_store_an_earlier_message - | Input_buffer.Dequeue_from_empty_queue | Import.Unknown _ - (* Init errors. *) - | Eval.Missing_memory_0_export -> - true - | _ -> false - let decode_state_to_string = function | Decode.Byte_vector_step -> "Byte_vector_step" | Instr_step -> "Instr_step" @@ -90,7 +55,7 @@ let eval_state_to_string = function | Join_step -> "Join_step" | Section_step -> "Section_step" -let refine_error exn = +let extract_interpreter_error exn = let open Lazy_containers in let raw_exception = Printexc.to_string exn in match exn with @@ -103,7 +68,7 @@ let refine_error exn = | Eval.Crash (_, explanation) | Eval.Exhaustion (_, explanation) | Import.Unknown (_, explanation) -> - {raw_exception; explanation = Some explanation} + `Interpreter {raw_exception; explanation = Some explanation} | Values.TypeError _ | Binary_exn.EOS | Binary_exn.Utf8 | Lazy_map.UnexpectedAccess | Lazy_vector.Bounds | Lazy_vector.SizeOverflow | Chunked_byte_vector.Bounds | Chunked_byte_vector.SizeOverflow | Table.Type @@ -113,14 +78,17 @@ let refine_error exn = | Ixx.DivideByZero | Ixx.InvalidConversion | Input_buffer.Bounds | Input_buffer.SizeOverflow | Input_buffer.Cannot_store_an_earlier_message | Input_buffer.Dequeue_from_empty_queue -> - {raw_exception; explanation = None} + `Interpreter {raw_exception; explanation = None} | Decode.Step_error state -> - {raw_exception; explanation = Some (decode_state_to_string state)} + `Interpreter + {raw_exception; explanation = Some (decode_state_to_string state)} | Eval.Init_step_error state -> - {raw_exception; explanation = Some (eval_state_to_string state)} + `Interpreter + {raw_exception; explanation = Some (eval_state_to_string state)} | Eval.Missing_memory_0_export -> - {raw_exception; explanation = Some "Module must export memory 0"} - | _ -> {raw_exception; explanation = None} + `Interpreter + {raw_exception; explanation = Some "Module must export memory 0"} + | _ -> `Unknown raw_exception let encoding = let open Data_encoding in diff --git a/src/lib_scoru_wasm/wasm_pvm_errors.mli b/src/lib_scoru_wasm/wasm_pvm_errors.mli index f7e0a7f2eb2cf85e60d4748b883385a5c7174e79..f738ce0b0e907c41dca5a27c401e3ce6935edab6 100644 --- a/src/lib_scoru_wasm/wasm_pvm_errors.mli +++ b/src/lib_scoru_wasm/wasm_pvm_errors.mli @@ -49,11 +49,9 @@ type t = | Unknown_error of raw_exception (** Wraps unexpected exceptions raised by the interpreter. *) -(** [is_interpreter_error exn] returns true if the exception comes - from the interpreter. *) - -val is_interpreter_error : exn -> bool - -val refine_error : exn -> interpreter_error +(** [extract_interpreter_error exn] returns the source of the exception (either + a known interpreter error or an unknown one) and its encodable representation. *) +val extract_interpreter_error : + exn -> [`Interpreter of interpreter_error | `Unknown of raw_exception] val encoding : t Data_encoding.t