diff --git a/src/lib_scoru_wasm/init_encodings.ml b/src/lib_scoru_wasm/init_encodings.ml index f8b40b971a24ccf65e471f6371f15dfc9cacbb4e..0850840afb792c61fded1ddbda14285173018a94 100644 --- a/src/lib_scoru_wasm/init_encodings.ml +++ b/src/lib_scoru_wasm/init_encodings.ml @@ -61,6 +61,16 @@ let concat_kont_encoding enc_a = (scope ["res"] enc_a) (value ["offset"] Data_encoding.int32) +let fold_left_kont_encoding enc_a enc_acc = + conv + (fun (origin, acc, offset) -> {origin; acc; offset}) + (fun {origin; acc; offset} -> (origin, acc, offset)) + @@ tup3 + ~flatten:true + (scope ["origin"] enc_a) + (scope ["acc"] enc_acc) + (value ["offset"] Data_encoding.int32) + let lazy_vec_encoding enc = int32_lazy_vector (value [] Data_encoding.int32) enc type (_, _) eq = Eq : ('a, 'a) eq @@ -169,6 +179,18 @@ let init_kont_encoding = (value [] Interpreter_encodings.Ast.memory_encoding) Wasm_encoding.memory_encoding @ [ + case + "IK_Exports" + (tup2 + ~flatten:true + (scope ["module"] Wasm_encoding.module_instance_encoding) + (scope ["kont"] + @@ fold_left_kont_encoding + (lazy_vec_encoding + Parser.(no_region_encoding Export.export_encoding)) + Wasm_encoding.extern_map_encoding)) + (function IK_Exports (inst, fold) -> Some (inst, fold) | _ -> None) + (function inst, fold -> IK_Exports (inst, fold)); case "IK_Remaining" Wasm_encoding.module_instance_encoding diff --git a/src/lib_scoru_wasm/wasm_encoding.ml b/src/lib_scoru_wasm/wasm_encoding.ml index 348935283176c0596e623e91a4c61c385edae78e..44b1522a65ff2d424bb1e0dfe9ba124ad9b3a6ef 100644 --- a/src/lib_scoru_wasm/wasm_encoding.ml +++ b/src/lib_scoru_wasm/wasm_encoding.ml @@ -535,6 +535,8 @@ let value_encoding = let values_encoding = list_encoding value_encoding +let name_encoding key = lazy_vector_encoding key (value [] Data_encoding.int31) + let memory_encoding = conv (fun (min, max, chunks) -> Memory.of_chunks (MemoryType {min; max}) chunks) @@ -620,6 +622,9 @@ let extern_encoding = (fun x -> Instance.ExternGlobal x); ] +let export_instance_encoding = + tup2 ~flatten:false (name_encoding "name") (scope ["extern"] extern_encoding) + let extern_map_encoding = NameMap.lazy_map extern_encoding let value_ref_vector_vector_encoding = diff --git a/src/lib_scoru_wasm/wasm_encoding.mli b/src/lib_scoru_wasm/wasm_encoding.mli index d9d2792e35a010edb33584463973d541698f05bd..4cea6efaae5ecab512c4733ff0c21e560651d0ff 100644 --- a/src/lib_scoru_wasm/wasm_encoding.mli +++ b/src/lib_scoru_wasm/wasm_encoding.mli @@ -47,6 +47,8 @@ val table_encoding : Partial_table.table Tree_encoding.t val global_encoding : Global.global Tree_encoding.t +val export_instance_encoding : Instance.export_inst Tree_encoding.t + val memory_instance_encoding : Partial_memory.memory Instance.Vector.t Tree_encoding.t diff --git a/src/lib_webassembly/exec/eval.ml b/src/lib_webassembly/exec/eval.ml index a7f9e5f159c4e3266fd25be850179c3944036e54..e9b287b72781b59930de66d520eda27caf13a7dc 100644 --- a/src/lib_webassembly/exec/eval.ml +++ b/src/lib_webassembly/exec/eval.ml @@ -1092,6 +1092,19 @@ let concat_completed {lv; rv; offset; _} = let rv_len = Vector.num_elements rv in Int32.add lv_len rv_len <= offset +type ('a, 'b) fold_left_kont = {origin : 'a Vector.t; acc : 'b; offset : int32} + +let fold_left_kont origin acc = {origin; acc; offset = 0l} + +let fold_left_completed {origin; offset; _} = + offset = Vector.num_elements origin + +let fold_left_s_step {origin; acc; offset} f = + let open Lwt.Syntax in + let* x = Vector.get offset origin in + let+ acc = f acc x in + {origin; acc; offset = Int32.succ offset} + type (_, _) init_section = | Func : (func, func_inst) init_section | Global : (global, global_inst) init_section @@ -1126,6 +1139,7 @@ type init_kont = | IK_Aggregate_concat : module_inst * ('a, 'b) init_section * 'b concat_kont -> init_kont + | IK_Exports of module_inst * (export, extern NameMap.t) fold_left_kont | IK_Remaining of module_inst | IK_Stop of module_inst @@ -1136,7 +1150,7 @@ let section_next_init_kont : | Func -> IK_Aggregate (inst0, Global, map_kont m.it.globals) | Global -> IK_Aggregate (inst0, Table, map_kont m.it.tables) | Table -> IK_Aggregate (inst0, Memory, map_kont m.it.memories) - | Memory -> IK_Remaining inst0 + | Memory -> IK_Exports (inst0, fold_left_kont m.it.exports (NameMap.create ())) let section_step : type a b. @@ -1200,35 +1214,33 @@ let init_step ~module_reg ~self host_funcs (m : module_) (exts : extern list) = | IK_Aggregate_concat (inst0, sec, tick) -> let+ tick = concat_step tick in 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) + | IK_Exports (inst0, tick) -> + let+ tick = + fold_left_s_step tick (fun map export -> + let* k, v = create_export inst0 export in + let+ k = Instance.Vector.to_list k in + NameMap.set k v map) + in + IK_Exports (inst0, tick) | IK_Remaining inst2 -> - let {exports; elems; datas; start; _} = m.it in + let {elems; 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* exports = Vector.to_list exports in - let* new_exports = TzStdLib.List.map_s (create_export inst2) exports 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* exports = - (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 - [new_exports]/[exports] should be lazy structures. *) - TzStdLib.List.fold_left_s - (fun exports (k, v) -> - let+ k = Instance.Vector.to_list k in - NameMap.set k v exports) - (NameMap.create ~produce_value:(fun _ -> Lwt.fail Not_found) ()) - new_exports - in let inst = { inst2 with - exports; elems = (* TODO: https://gitlab.com/tezos/tezos/-/issues/3076 [new_elems]/[elems] should be lazy structures. *) diff --git a/src/lib_webassembly/exec/eval.mli b/src/lib_webassembly/exec/eval.mli index 989ec1467079aa488475dbe3381b0a0d74875307..83b68075f7a354e35b180a2e64de03e5a3d3b491 100644 --- a/src/lib_webassembly/exec/eval.mli +++ b/src/lib_webassembly/exec/eval.mli @@ -29,6 +29,8 @@ type 'a concat_kont = { offset : int32; } +type ('a, 'b) fold_left_kont = {origin : 'a Vector.t; acc : 'b; offset : int32} + type (_, _) init_section = | Func : (Ast.func, func_inst) init_section | Global : (Ast.global, global_inst) init_section @@ -45,6 +47,7 @@ type init_kont = | IK_Aggregate_concat : 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_Remaining of module_inst | IK_Stop of module_inst (** Witness that there is no more tick to execute to complete