diff --git a/src/lib_scoru_wasm/init_encodings.ml b/src/lib_scoru_wasm/init_encodings.ml index 2b88faecceb8ebe1e36979e539f7131820560d9d..d061f328f8ea871bf5a3b51107c8f35e0f736fdb 100644 --- a/src/lib_scoru_wasm/init_encodings.ml +++ b/src/lib_scoru_wasm/init_encodings.ml @@ -168,7 +168,7 @@ let map_concat_kont_encoding enc_a enc_b = (fun j -> MC_Join j); ] -let init_kont_encoding = +let init_kont_encoding ~host_funcs = tagged_union tag_encoding @@ [ case @@ -290,20 +290,23 @@ let init_kont_encoding = | _ -> None) (function inst, map, es_elem -> IK_Es_datas (inst, map, es_elem)); case - "IK_Remaining" - (tup3 + "IK_Join_admin" + (tup2 ~flatten:true (scope ["module"] Wasm_encoding.module_instance_encoding) (scope - ["es_elem"] - (lazy_vec_encoding Wasm_encoding.admin_instr_encoding)) - (scope - ["es_data"] - (lazy_vec_encoding Wasm_encoding.admin_instr_encoding))) - (function - | IK_Remaining (m, admin, admin') -> Some (m, admin, admin') - | _ -> None) - (function m, admin, admin' -> IK_Remaining (m, admin, admin')); + ["kont"] + (join_kont_encoding Wasm_encoding.admin_instr_encoding))) + (function IK_Join_admin (m, admin) -> Some (m, admin) | _ -> None) + (function m, admin -> IK_Join_admin (m, admin)); + case + "IK_Eval" + (tup2 + ~flatten:true + (scope ["module"] Wasm_encoding.module_instance_encoding) + (scope ["config"] (Wasm_encoding.config_encoding ~host_funcs))) + (function IK_Eval (m, config) -> Some (m, config) | _ -> None) + (function m, config -> IK_Eval (m, config)); case "IK_Stop" Wasm_encoding.module_instance_encoding diff --git a/src/lib_scoru_wasm/init_encodings.mli b/src/lib_scoru_wasm/init_encodings.mli index df0b4f67401be020d694fdccea5d3502d6447f61..5118e5e633ffe75bdb7816cc380cad24549158f6 100644 --- a/src/lib_scoru_wasm/init_encodings.mli +++ b/src/lib_scoru_wasm/init_encodings.mli @@ -25,4 +25,5 @@ (** [init_kont_encoding] tree-encoder for [init_kont] values. *) val init_kont_encoding : + host_funcs:Tezos_webassembly_interpreter.Host_funcs.registry -> Tezos_webassembly_interpreter.Eval.init_kont Tree_encoding.t diff --git a/src/lib_scoru_wasm/wasm_pvm.ml b/src/lib_scoru_wasm/wasm_pvm.ml index edcadb14ea93fb784537d4605bfb023fecb677cf..f00c07e707d9b16841bbeed04afe34cb3dc4f716 100644 --- a/src/lib_scoru_wasm/wasm_pvm.ml +++ b/src/lib_scoru_wasm/wasm_pvm.ml @@ -88,7 +88,9 @@ module Make (T : Tree_encoding.Runner.TREE) : (scope ["self"] Wasm_encoding.module_key_encoding) (scope ["ast_module"] @@ Parsing.(no_region_encoding Module.module_encoding)) - (scope ["init_kont"] Init_encodings.init_kont_encoding)) + (scope + ["init_kont"] + (Init_encodings.init_kont_encoding ~host_funcs))) (function | Init {self; ast_module; init_kont} -> Some (self, ast_module, init_kont) diff --git a/src/lib_webassembly/exec/eval.ml b/src/lib_webassembly/exec/eval.ml index 086c2eca8a1148dbf4601247021e011249ca4146..eb1f1d22c248aa609abf031621e183c387e44678 100644 --- a/src/lib_webassembly/exec/eval.ml +++ b/src/lib_webassembly/exec/eval.ml @@ -1030,7 +1030,7 @@ let run_data (inst : module_inst) i data = ] | Declarative -> assert false -let run_start start = List.map plain [Call start.it.sfunc @@ start.at] +let run_start start = [plain (Call start.it.sfunc @@ start.at)] type ('a, 'b, 'acc) fold_right2_kont = { acc : 'acc; @@ -1233,7 +1233,8 @@ type init_kont = module_inst * (data_segment, admin_instr) map_concat_kont * admin_instr Vector.t - | IK_Remaining of module_inst * admin_instr Vector.t * admin_instr Vector.t + | IK_Join_admin of module_inst * admin_instr join_kont + | IK_Eval of module_inst * config | IK_Stop of module_inst let section_next_init_kont : @@ -1345,7 +1346,13 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = IK_Es_elems (inst0, tick)) | IK_Es_datas (inst0, tick, es_elem) -> ( match map_concat_completed tick with - | Some es_data -> Lwt.return (IK_Remaining (inst0, es_elem, es_data)) + | Some es_data -> + let es_start = + Vector.of_list + (Lib.Option.get (Lib.Option.map run_start m.it.start) []) + in + let v = Vector.of_list [es_elem; es_data; es_start] in + Lwt.return (IK_Join_admin (inst0, join_kont v)) | None -> let+ tick = map_concat_step @@ -1358,21 +1365,20 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = tick in IK_Es_datas (inst0, tick, es_elem)) - | IK_Remaining (inst, es_elem, es_data) -> + | IK_Join_admin (inst0, tick) -> ( + match join_completed tick with + | Some res -> + (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 + [config] should use lazy vector, not lists *) + let+ res = Vector.to_list res in + IK_Eval (inst0, config host_funcs self [] res) + | None -> + let+ tick = join_step tick in + IK_Join_admin (inst0, tick)) + | IK_Eval (inst, config) -> (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 - These transformations should be refactored and abadoned during the - tickification, to avoid the roundtrip vector -> list -> vector. *) - let* es_elem = Vector.to_list es_elem in - let* es_data = Vector.to_list es_data in - - let es_start = Lib.Option.get (Lib.Option.map run_start m.it.start) [] in - - let+ (_ : Values.value stack) = - eval - module_reg - (config host_funcs self [] (es_elem @ es_data @ es_start)) - in - + The call to [eval] should be tickify. *) + let+ (_ : Values.value stack) = eval module_reg config in IK_Stop inst | IK_Stop _ -> raise (Invalid_argument "init_step") diff --git a/src/lib_webassembly/exec/eval.mli b/src/lib_webassembly/exec/eval.mli index b4bd5845e29779d8343b299d21058ddecc13bcd7..2e8e09da9915c932419f3fb76a9c6033da9db5aa 100644 --- a/src/lib_webassembly/exec/eval.mli +++ b/src/lib_webassembly/exec/eval.mli @@ -26,6 +26,15 @@ and admin_instr' = | Label of int32 * Ast.instr list * code | Frame of int32 * frame * code +type config = { + frame : frame; + input : input_inst; + output : output_inst; + code : code; + host_funcs : Host_funcs.registry; + budget : int; (* to model stack overflow *) +} + type ('a, 'b, 'acc) fold_right2_kont = { acc : 'acc; lv : 'a Vector.t; @@ -81,7 +90,8 @@ type init_kont = module_inst * (Ast.data_segment, admin_instr) map_concat_kont * admin_instr Vector.t - | IK_Remaining of module_inst * admin_instr Vector.t * admin_instr Vector.t + | IK_Join_admin of module_inst * admin_instr join_kont + | IK_Eval of module_inst * config | IK_Stop of module_inst (** Witness that there is no more tick to execute to complete the [init] process. *) @@ -117,15 +127,6 @@ val invoke : value list -> value list Lwt.t (* raises Trap *) -type config = { - frame : frame; - input : input_inst; - output : output_inst; - code : code; - host_funcs : Host_funcs.registry; - budget : int; (* to model stack overflow *) -} - val step : module_reg -> config -> config Lwt.t val config :