package wax-lib
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
Libraries for Wax, a Rust-like syntax for WebAssembly
Install
dune-project
Dependency
Authors
Maintainers
Sources
wax-0.1.0.tbz
sha256=41b580846af8d41bdf6c3f005f62e38feda3e60fe2e9e4aa440db34ce515a153
sha512=4b3a181fcc7d743194a8647260870fb5190770066a197bcc48104c2b77fd40c643228b795c2bcd6b29a120820e969eb42a37a9bcec98b3f608d13f152d9f6579
doc/src/wax-lib.wasm/ast_utils.ml.html
Source file ast_utils.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64open Ast open Ast.Text (* The canonical pre-order walk of an instruction tree: visit [i], then recurse into every nested instruction it carries. Keeping this in one place means a new instruction that nests others (or a missed case, as [Hinted] once was) is handled for every traversal at once. *) let rec fold_instr f acc (i : 'info instr) = let acc = f acc i in match i.desc with | Block { block; _ } | Loop { block; _ } | TryTable { block; _ } -> fold_instrs f acc block.desc | If { if_block; else_block; _ } -> fold_instrs f (fold_instrs f acc if_block.desc) else_block.desc | Try { block; catches; catch_all; _ } -> let acc = fold_instrs f acc block.desc in let acc = List.fold_left (fun acc (_, is) -> fold_instrs f acc is.desc) acc catches in Option.fold ~none:acc ~some:(fun b -> fold_instrs f acc b.desc) catch_all | Folded (h, is) -> fold_instrs f (fold_instr f acc h) is | Hinted (_, inner) -> fold_instr f acc inner (* The remaining variants carry no nested instruction. *) | _ -> acc and fold_instrs f acc l = List.fold_left (fold_instr f) acc l let iter_instr f i = fold_instr (fun () i -> f i) () i (* compact-import-section: expand an [Import_group1]/[Import_group2] field into the individual [Import] fields it stands for (carrying the group's location); any other field is returned unchanged as a singleton. Passes that only need to see individual imports flatten a field list with [List.concat_map expand_import_group]. *) let expand_import_group f = match f.desc with | Import_group1 { module_; items } -> List.map (fun (name, id, desc) -> { f with desc = Import { module_; name; id; desc; exports = [] } }) items | Import_group2 { module_; desc; items } -> List.map (fun (name, id) -> { f with desc = Import { module_; name; id; desc; exports = [] } }) items | _ -> [ f ] (* Flatten binary import-section entries back into the individual imports they denote, for the passes that only need the flat import list (index counting). *) let flatten_binary_imports (entries : Ast.Binary.import_entry list) : Ast.Binary.import list = List.concat_map (function | Ast.Binary.Single i -> [ i ] | Group1 { module_; items } -> List.map (fun (name, desc) -> { Ast.Binary.module_; name; desc }) items | Group2 { module_; desc; names } -> List.map (fun name -> { Ast.Binary.module_; name; desc }) names) entries
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>