From 8d736e506f161255433eeaca956d7e5150cb05bd Mon Sep 17 00:00:00 2001 From: Thomas Letan Date: Wed, 24 Aug 2022 17:03:26 +0200 Subject: [PATCH] WASM: Tickify 'Eval.init' es_datas --- src/lib_scoru_wasm/init_encodings.ml | 28 ++++++++++++++++++--- src/lib_webassembly/exec/eval.ml | 37 +++++++++++++++++++++++----- src/lib_webassembly/exec/eval.mli | 6 ++++- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/lib_scoru_wasm/init_encodings.ml b/src/lib_scoru_wasm/init_encodings.ml index 9ac907ca14ba..2b88faecceb8 100644 --- a/src/lib_scoru_wasm/init_encodings.ml +++ b/src/lib_scoru_wasm/init_encodings.ml @@ -272,16 +272,38 @@ let init_kont_encoding = Wasm_encoding.admin_instr_encoding))) (function IK_Es_elems (inst, map) -> Some (inst, map) | _ -> None) (function inst, map -> IK_Es_elems (inst, map)); + case + "IK_Es_data" + (tup3 + ~flatten:true + (scope ["module"] Wasm_encoding.module_instance_encoding) + (scope + ["kont"] + (map_concat_kont_encoding + Parser.(no_region_encoding Data.data_segment_encoding) + Wasm_encoding.admin_instr_encoding)) + (scope + ["es_elem"] + (lazy_vec_encoding Wasm_encoding.admin_instr_encoding))) + (function + | IK_Es_datas (inst, map, es_elem) -> Some (inst, map, es_elem) + | _ -> None) + (function inst, map, es_elem -> IK_Es_datas (inst, map, es_elem)); case "IK_Remaining" - (tup2 + (tup3 ~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) -> Some (m, admin) | _ -> None) - (function m, admin -> IK_Remaining (m, admin)); + (function + | IK_Remaining (m, admin, admin') -> Some (m, admin, admin') + | _ -> None) + (function m, admin, admin' -> IK_Remaining (m, admin, admin')); case "IK_Stop" Wasm_encoding.module_instance_encoding diff --git a/src/lib_webassembly/exec/eval.ml b/src/lib_webassembly/exec/eval.ml index 9ec30a7c5c10..460ef5ca4531 100644 --- a/src/lib_webassembly/exec/eval.ml +++ b/src/lib_webassembly/exec/eval.ml @@ -1070,6 +1070,13 @@ let map_s_step {origin; destination; offset} f = let destination = Vector.set offset y destination in {origin; destination; offset = Int32.succ offset} +let map_i_s_step {origin; destination; offset} f = + let open Lwt.Syntax in + let* x = Vector.get offset origin in + let+ y = f offset x in + let destination = Vector.set offset y destination in + {origin; destination; offset = Int32.succ offset} + type 'a concat_kont = { lv : 'a Vector.t; rv : 'a Vector.t; @@ -1209,7 +1216,11 @@ type init_kont = | IK_Elems of module_inst * (elem_segment, elem_inst) map_kont | IK_Datas of module_inst * (data_segment, data_inst) map_kont | IK_Es_elems of module_inst * (elem_segment, admin_instr) map_concat_kont - | IK_Remaining of module_inst * admin_instr Vector.t + | IK_Es_datas of + 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_Stop of module_inst let section_next_init_kont : @@ -1309,7 +1320,8 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = IK_Datas (inst0, tick) | IK_Es_elems (inst0, tick) -> ( match map_concat_completed tick with - | Some es_elem -> Lwt.return (IK_Remaining (inst0, es_elem)) + | Some es_elem -> + Lwt.return (IK_Es_datas (inst0, map_concat_kont m.it.datas, es_elem)) | None -> let+ tick = map_concat_step @@ -1318,15 +1330,28 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = tick in IK_Es_elems (inst0, tick)) - | IK_Remaining (inst, es_elem) -> + | 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)) + | None -> + let+ tick = + map_concat_step + (fun tick -> + map_i_s_step tick (fun i x -> + (* [of_list] is safe, because [run_elem] always + produce lists of length 0 or 5. *) + let+ x = run_data inst0 i x in + Vector.of_list x)) + tick + in + IK_Es_datas (inst0, tick, es_elem)) + | IK_Remaining (inst, es_elem, es_data) -> (* 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* datas = Vector.to_list m.it.datas in - let* datas = Lib.List32.mapi_s (run_data inst) datas in - let es_data = TzStdLib.List.concat datas in let es_start = Lib.Option.get (Lib.Option.map run_start m.it.start) [] in let+ (_ : Values.value stack) = diff --git a/src/lib_webassembly/exec/eval.mli b/src/lib_webassembly/exec/eval.mli index 04f4a0a1f83d..251efcc959b6 100644 --- a/src/lib_webassembly/exec/eval.mli +++ b/src/lib_webassembly/exec/eval.mli @@ -77,7 +77,11 @@ type init_kont = | IK_Elems of module_inst * (Ast.elem_segment, elem_inst) map_kont | IK_Datas of module_inst * (Ast.data_segment, data_inst) map_kont | IK_Es_elems of module_inst * (Ast.elem_segment, admin_instr) map_concat_kont - | IK_Remaining of module_inst * admin_instr Vector.t + | IK_Es_datas of + 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_Stop of module_inst (** Witness that there is no more tick to execute to complete the [init] process. *) -- GitLab