diff --git a/src/lib_scoru_wasm/init_encodings.ml b/src/lib_scoru_wasm/init_encodings.ml index 0850840afb792c61fded1ddbda14285173018a94..bc378e6a5f163146b0e1d873f8197f19ff1bf22e 100644 --- a/src/lib_scoru_wasm/init_encodings.ml +++ b/src/lib_scoru_wasm/init_encodings.ml @@ -191,6 +191,20 @@ let init_kont_encoding = Wasm_encoding.extern_map_encoding)) (function IK_Exports (inst, fold) -> Some (inst, fold) | _ -> None) (function inst, fold -> IK_Exports (inst, fold)); + case + "IK_Elems" + (tup2 + ~flatten:true + (scope ["module"] Wasm_encoding.module_instance_encoding) + (scope + ["kont"] + (map_kont_encoding + (lazy_vec_encoding + Parser.(no_region_encoding Elem.elem_encoding)) + (lazy_vec_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_Remaining" Wasm_encoding.module_instance_encoding diff --git a/src/lib_webassembly/exec/eval.ml b/src/lib_webassembly/exec/eval.ml index e9b287b72781b59930de66d520eda27caf13a7dc..b5992e6d7ae243ed8133f07689390e0db1260397 100644 --- a/src/lib_webassembly/exec/eval.ml +++ b/src/lib_webassembly/exec/eval.ml @@ -1140,6 +1140,7 @@ type init_kont = module_inst * ('a, 'b) init_section * 'b concat_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_Remaining of module_inst | IK_Stop of module_inst @@ -1216,7 +1217,7 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = IK_Aggregate_concat (inst0, sec, tick) | IK_Exports (inst0, tick) when fold_left_completed tick -> let inst0 = {inst0 with exports = tick.acc} in - Lwt.return (IK_Remaining inst0) + Lwt.return (IK_Elems (inst0, map_kont m.it.elems)) | IK_Exports (inst0, tick) -> let+ tick = fold_left_s_step tick (fun map export -> @@ -1225,26 +1226,24 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = NameMap.set k v map) in 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) + | IK_Elems (inst0, tick) -> + let+ tick = map_s_step tick (create_elem module_reg self) in + IK_Elems (inst0, tick) | IK_Remaining inst2 -> - let {elems; datas; start; _} = m.it in + let {datas; start; _} = m.it in (* 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* elems = Vector.to_list elems in let* datas = Vector.to_list datas in - let* new_elems = - TzStdLib.List.map_s (create_elem module_reg self) elems - in let new_datas = List.map create_data datas in let inst = { inst2 with - elems = - (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 - [new_elems]/[elems] should be lazy structures. *) - Vector.of_list new_elems; datas = (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 [new_data]/[datas] should be lazy structures. *) @@ -1253,6 +1252,7 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = in update_module_ref module_reg self inst ; + 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 diff --git a/src/lib_webassembly/exec/eval.mli b/src/lib_webassembly/exec/eval.mli index 83b68075f7a354e35b180a2e64de03e5a3d3b491..d6ae9ceba4aef282e3ae7161fd453c80c6630dce 100644 --- a/src/lib_webassembly/exec/eval.mli +++ b/src/lib_webassembly/exec/eval.mli @@ -48,6 +48,7 @@ type init_kont = module_inst * ('a, 'b) init_section * 'b concat_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_Remaining of module_inst | IK_Stop of module_inst (** Witness that there is no more tick to execute to complete