diff --git a/src/bin_wasm_debugger/main_wasm_debugger.ml b/src/bin_wasm_debugger/main_wasm_debugger.ml index bceb829a41f861e097c3610d8e5d649385007674..2cef99a9a08dfdbdfa7738551168a9a28bbc251a 100644 --- a/src/bin_wasm_debugger/main_wasm_debugger.ml +++ b/src/bin_wasm_debugger/main_wasm_debugger.ml @@ -37,9 +37,12 @@ let typecheck_module module_ = Repl_helpers.trap_exn (fun () -> Tezos_webassembly_interpreter.Valid.check_module module_) -(* [import_pvm_host_functions ()] registers the host functions of the PVM. *) -let import_pvm_host_functions () = - let lookup name = Lwt.return (Tezos_scoru_wasm.Host_funcs.lookup name) in +(* [import_pvm_host_functions ~version ()] registers the host + functions of the PVM. *) +let import_pvm_host_functions ~version () = + let lookup name = + Lwt.return (Tezos_scoru_wasm.Host_funcs.lookup ~version name) + in Repl_helpers.trap_exn (fun () -> Lwt.return (Tezos_webassembly_interpreter.Import.register @@ -64,7 +67,7 @@ let handle_module version binary name module_ = else Lwt.return (parse_module module_)) in let* () = typecheck_module ast in - let* () = import_pvm_host_functions () in + let* () = import_pvm_host_functions ~version () in let* _ = link ast in let*! tree = initial_tree diff --git a/src/lib_scoru_wasm/host_funcs.ml b/src/lib_scoru_wasm/host_funcs.ml index 1f520e6d26371a27578ce80821332762600f41fb..0d37a4526f70004524b75a9d2aa91a52162e6d91 100644 --- a/src/lib_scoru_wasm/host_funcs.ml +++ b/src/lib_scoru_wasm/host_funcs.ml @@ -1142,7 +1142,7 @@ let store_write = store_write_ticks key_length num_bytes code ) | _ -> raise Bad_input) -let lookup_opt name = +let lookup_opt ~version:_ name = match name with | "read_input" -> Some (ExternFunc (HostFunc (read_input_type, read_input_name))) @@ -1175,8 +1175,8 @@ let lookup_opt name = Some (ExternFunc (HostFunc (store_write_type, store_write_name))) | _ -> None -let lookup name = - match lookup_opt name with Some f -> f | None -> raise Not_found +let lookup ~version name = + match lookup_opt ~version name with Some f -> f | None -> raise Not_found let base = List.fold_left diff --git a/src/lib_scoru_wasm/host_funcs.mli b/src/lib_scoru_wasm/host_funcs.mli index 1bb2ec8c5ac9bd86652a91b90260d4075ff4426b..75f92d39c26251a8eec9dfdc34a8869fc7128859 100644 --- a/src/lib_scoru_wasm/host_funcs.mli +++ b/src/lib_scoru_wasm/host_funcs.mli @@ -23,17 +23,19 @@ (* *) (*****************************************************************************) -(** [lookup name] retrieves or instantiates a host function by the given [name]. - Currently dispatches [read_input] to {!read_input} using host function global - names as registered by {!register_host_funcs}. +(** [lookup ~version name] retrieves or instantiates a host function + by the given [name]. + Used to plug host function wrappers in the WASN interpreter linker. *) val lookup : + version:Wasm_pvm_state.version -> Tezos_webassembly_interpreter.Ast.name -> Tezos_webassembly_interpreter.Instance.extern -(** [lookup_opt name] is exactly [lookup name] but returns an option instead of +(** [lookup_opt ~version name] is exactly [lookup name] but returns an option instead of raising `Not_found`. *) val lookup_opt : + version:Wasm_pvm_state.version -> Tezos_webassembly_interpreter.Ast.name -> Tezos_webassembly_interpreter.Instance.extern option diff --git a/src/lib_scoru_wasm/wasm_vm.ml b/src/lib_scoru_wasm/wasm_vm.ml index 9a2a1ca1f9b9be1fed39df9ebb9d719f24dcef2e..a12d92712c5650a0f9fb22d7f96517b90fc8a52f 100644 --- a/src/lib_scoru_wasm/wasm_vm.ml +++ b/src/lib_scoru_wasm/wasm_vm.ml @@ -127,7 +127,7 @@ let save_fallback_kernel durable = Constants.kernel_fallback_key else Lwt.return durable -let unsafe_next_tick_state ~stack_size_limit host_funcs +let unsafe_next_tick_state ~version ~stack_size_limit host_funcs ({buffers; durable; tick_state; _} as pvm_state) = let open Lwt_syntax in let return ?(status = Running) ?(durable = durable) state = @@ -204,7 +204,7 @@ let unsafe_next_tick_state ~stack_size_limit host_funcs Wasm.Ast.Vector.get imports_offset ast_module.it.imports in if module_name = Constants.wasm_host_funcs_virual_module then - match Host_funcs.lookup_opt item_name with + match Host_funcs.lookup_opt ~version item_name with | Some extern -> let externs, _ = Wasm.Ast.Vector.append extern externs in return @@ -320,11 +320,16 @@ let exn_to_stuck pvm_state exn = in Lwt.return (Stuck wasm_error) -let next_tick_state ~stack_size_limit host_function_registry pvm_state = +let next_tick_state ~version ~stack_size_limit host_function_registry pvm_state + = let open Lwt_syntax in Lwt.catch (fun () -> - unsafe_next_tick_state ~stack_size_limit host_function_registry pvm_state) + unsafe_next_tick_state + ~version + ~stack_size_limit + host_function_registry + pvm_state) (fun exn -> let+ tick_state = exn_to_stuck pvm_state exn in (pvm_state.durable, tick_state, Failing)) @@ -409,11 +414,12 @@ let clean_up_input_buffer buffers = (** [compute_step pvm_state] does one computation step on [pvm_state]. Returns the new state. *) -let compute_step_with_host_functions ~stack_size_limit registry pvm_state = +let compute_step_with_host_functions ~version ~stack_size_limit registry + pvm_state = let open Lwt_syntax in (* Calculate the next tick state. *) let* durable, tick_state, status = - next_tick_state ~stack_size_limit registry pvm_state + next_tick_state ~version ~stack_size_limit registry pvm_state in let current_tick = Z.succ pvm_state.current_tick in let last_top_level_call = next_last_top_level_call pvm_state status in @@ -439,6 +445,7 @@ let compute_step pvm_state = let* version = get_wasm_version pvm_state in let stack_size_limit = stack_size_limit version in compute_step_with_host_functions + ~version ~stack_size_limit (Host_funcs.all ~version) pvm_state @@ -452,6 +459,7 @@ let compute_step_with_debug ~write_debug pvm_state = | Noop -> Host_funcs.all ~version in compute_step_with_host_functions + ~version ~stack_size_limit:(stack_size_limit version) registry pvm_state @@ -547,11 +555,13 @@ let compute_step_many_until ?(max_steps = 1L) ?reveal_builtins reveal_step (Bytes.of_string res) pvm_state | _ -> compute_step_with_host_functions + ~version ~stack_size_limit host_function_registry pvm_state) | None -> compute_step_with_host_functions + ~version ~stack_size_limit host_function_registry in @@ -583,6 +593,7 @@ let compute_step_many_until ?(max_steps = 1L) ?reveal_builtins we were asked to perform at least 1. *) let* pvm_state = compute_step_with_host_functions + ~version ~stack_size_limit host_function_registry pvm_state