diff --git a/src/lib_scoru_wasm/init_encodings.ml b/src/lib_scoru_wasm/init_encodings.ml index bc378e6a5f163146b0e1d873f8197f19ff1bf22e..f1a5a2d5f69282604d993274cdecb4f77e93aac0 100644 --- a/src/lib_scoru_wasm/init_encodings.ml +++ b/src/lib_scoru_wasm/init_encodings.ml @@ -205,6 +205,19 @@ let init_kont_encoding = (conv ref ( ! ) Wasm_encoding.value_ref_vector_encoding))))) (function IK_Elems (inst, map) -> Some (inst, map) | _ -> None) (function inst, map -> IK_Elems (inst, map)); + case + "IK_Datas" + (tup2 + ~flatten:true + (scope ["module"] Wasm_encoding.module_instance_encoding) + (scope + ["kont"] + (map_kont_encoding + (lazy_vec_encoding + Parser.(no_region_encoding Data.data_segment_encoding)) + (lazy_vec_encoding Wasm_encoding.data_label_ref_encoding)))) + (function IK_Datas (inst, map) -> Some (inst, map) | _ -> None) + (function inst, map -> IK_Datas (inst, map)); case "IK_Remaining" Wasm_encoding.module_instance_encoding diff --git a/src/lib_webassembly/exec/eval.ml b/src/lib_webassembly/exec/eval.ml index b5992e6d7ae243ed8133f07689390e0db1260397..9ef1021e36ad5b5e4e8e68671814ed6dedbcff45 100644 --- a/src/lib_webassembly/exec/eval.ml +++ b/src/lib_webassembly/exec/eval.ml @@ -1141,6 +1141,7 @@ type init_kont = -> init_kont | IK_Exports of module_inst * (export, extern NameMap.t) fold_left_kont | IK_Elems of module_inst * (elem_segment, elem_inst) map_kont + | IK_Datas of module_inst * (data_segment, data_inst) map_kont | IK_Remaining of module_inst | IK_Stop of module_inst @@ -1228,35 +1229,27 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = IK_Exports (inst0, tick) | IK_Elems (inst0, tick) when map_completed tick -> let inst0 = {inst0 with elems = tick.destination} in - Lwt.return (IK_Remaining inst0) + Lwt.return (IK_Datas (inst0, map_kont m.it.datas)) | IK_Elems (inst0, tick) -> let+ tick = map_s_step tick (create_elem module_reg self) in IK_Elems (inst0, tick) - | IK_Remaining inst2 -> - let {datas; start; _} = m.it in - + | IK_Datas (inst0, tick) when map_completed tick -> + let inst = {inst0 with datas = tick.destination} in + update_module_ref module_reg self inst ; + Lwt.return (IK_Remaining inst) + | IK_Datas (inst0, tick) -> + let+ tick = map_step tick create_data in + IK_Datas (inst0, tick) + | IK_Remaining inst -> (* 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* datas = Vector.to_list datas in - - let new_datas = List.map create_data datas in - let inst = - { - inst2 with - datas = - (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 - [new_data]/[datas] should be lazy structures. *) - Vector.of_list new_datas; - } - in - update_module_ref module_reg self inst ; - + let* datas = Vector.to_list m.it.datas in let* elems = Vector.to_list m.it.elems in let es_elem = List.concat (Lib.List32.mapi run_elem elems) 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 start) [] in + let es_start = Lib.Option.get (Lib.Option.map run_start m.it.start) [] in let+ (_ : Values.value stack) = eval module_reg diff --git a/src/lib_webassembly/exec/eval.mli b/src/lib_webassembly/exec/eval.mli index d6ae9ceba4aef282e3ae7161fd453c80c6630dce..07b86f2c0bd376016c9578225cc88a3700698b47 100644 --- a/src/lib_webassembly/exec/eval.mli +++ b/src/lib_webassembly/exec/eval.mli @@ -49,6 +49,7 @@ type init_kont = -> init_kont | IK_Exports of module_inst * (Ast.export, extern NameMap.t) fold_left_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_Remaining of module_inst | IK_Stop of module_inst (** Witness that there is no more tick to execute to complete