package js_of_ocaml-compiler
Compiler from OCaml bytecode to JavaScript
Install
Dune Dependency
Authors
Maintainers
Sources
js_of_ocaml-5.1.0.tbz
sha256=c17ad150772df43fc4e63ce1b9419f23c64169695a4cc4160eedcbc8f4d4c047
sha512=a13d02b9dba9105c19852e69aeaa516f4cdd1efb1354b01b612e144c35df3cfc7dc432ab291568ed419bad1a9388339a528c2d799dcc45ccc761de48ae18b790
doc/src/js_of_ocaml-compiler/phisimpl.ml.html
Source file phisimpl.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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
(* Js_of_ocaml compiler * http://www.ocsigen.org/js_of_ocaml/ * Copyright (C) 2010 Jérôme Vouillon * Laboratoire PPS - CNRS Université Paris Diderot * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, with linking exception; * either version 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *) open! Stdlib let times = Debug.find "times" open Code (****) let add_var = Var.ISet.add let add_def vars defs x y = add_var vars x; let idx = Var.idx x in defs.(idx) <- Var.Set.add y defs.(idx) let add_dep deps x y = let idx = Var.idx y in deps.(idx) <- Var.Set.add x deps.(idx) let rec arg_deps vars deps defs params args = match params, args with | x :: params, y :: args -> add_dep deps x y; add_def vars defs x y; arg_deps vars deps defs params args | _ -> () let cont_deps blocks vars deps defs (pc, args) = let block = Addr.Map.find pc blocks in arg_deps vars deps defs block.params args let expr_deps blocks vars deps defs x e = match e with | Constant _ | Apply _ | Prim _ -> () | Closure (_, cont) -> cont_deps blocks vars deps defs cont | Block (_, a, _) -> Array.iter a ~f:(fun y -> add_dep deps x y) | Field (y, _) -> add_dep deps x y let program_deps { blocks; _ } = let nv = Var.count () in let vars = Var.ISet.empty () in let deps = Array.make nv Var.Set.empty in let defs = Array.make nv Var.Set.empty in Addr.Map.iter (fun _pc block -> List.iter block.body ~f:(fun (i, _loc) -> match i with | Let (x, e) -> add_var vars x; expr_deps blocks vars deps defs x e | Assign (x, y) -> add_dep deps x y; add_def vars defs x y | Set_field _ | Array_set _ | Offset_ref _ -> ()); match fst block.branch with | Return _ | Raise _ | Stop -> () | Branch cont -> cont_deps blocks vars deps defs cont | Cond (_, cont1, cont2) -> cont_deps blocks vars deps defs cont1; cont_deps blocks vars deps defs cont2 | Switch (_, a1, a2) -> Array.iter a1 ~f:(fun cont -> cont_deps blocks vars deps defs cont); Array.iter a2 ~f:(fun cont -> cont_deps blocks vars deps defs cont) | Pushtrap (cont, _, cont_h, _) -> cont_deps blocks vars deps defs cont_h; cont_deps blocks vars deps defs cont | Poptrap cont -> cont_deps blocks vars deps defs cont) blocks; vars, deps, defs let rec repr' reprs x acc = let idx = Var.idx x in match reprs.(idx) with | None -> x, acc | Some y -> repr' reprs y (x :: acc) let repr reprs x = let last, l = repr' reprs x [] in List.iter l ~f:(fun v -> reprs.(Var.idx v) <- Some last); last let replace deps reprs x y = let yidx = Var.idx y in let xidx = Var.idx x in deps.(yidx) <- Var.Set.union deps.(yidx) deps.(xidx); reprs.(xidx) <- Some y; true let propagate1 deps defs reprs st x = let prev = Var.Tbl.get st x in if prev then prev else let idx = Var.idx x in let s = Var.Set.fold (fun x s -> Var.Set.add (repr reprs x) s) defs.(idx) Var.Set.empty in defs.(idx) <- s; match Var.Set.cardinal s with | 1 -> replace deps reprs x (Var.Set.choose s) | 2 -> ( match Var.Set.elements s with | [ y; z ] when Var.compare x y = 0 -> replace deps reprs x z | [ z; y ] when Var.compare x y = 0 -> replace deps reprs x z | _ -> false) | _ -> false module G = Dgraph.Make_Imperative (Var) (Var.ISet) (Var.Tbl) module Domain1 = struct type t = bool let equal = Bool.equal let bot = false end module Solver1 = G.Solver (Domain1) let solver1 vars deps defs = let nv = Var.count () in let reprs = Array.make nv None in let g = { G.domain = vars; G.iter_children = (fun f x -> Var.Set.iter f deps.(Var.idx x)) } in ignore (Solver1.f () g (propagate1 deps defs reprs)); Array.mapi reprs ~f:(fun idx y -> match y with | Some y -> let y = repr reprs y in if Var.idx y = idx then None else Some y | None -> None) let f p = let t = Timer.make () in let t' = Timer.make () in let vars, deps, defs = program_deps p in if times () then Format.eprintf " phi-simpl. 1: %a@." Timer.print t'; let t' = Timer.make () in let subst = solver1 vars deps defs in if times () then Format.eprintf " phi-simpl. 2: %a@." Timer.print t'; Array.iteri subst ~f:(fun idx y -> match y with | None -> () | Some y -> Code.Var.propagate_name (Var.of_idx idx) y); let p = Subst.program (Subst.from_array subst) p in if times () then Format.eprintf " phi-simpl.: %a@." Timer.print t; p
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>