package mopsa
MOPSA: A Modular and Open Platform for Static Analysis using Abstract Interpretation
Install
Dune Dependency
Authors
Maintainers
Sources
mopsa-analyzer-v1.1.tar.gz
md5=fdee20e988343751de440b4f6b67c0f4
sha512=f5cbf1328785d3f5ce40155dada2d95e5de5cce4f084ea30cfb04d1ab10cc9403a26cfb3fa55d0f9da72244482130fdb89c286a9aed0d640bba46b7c00e09500
doc/src/core/marker.ml.html
Source file marker.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
(****************************************************************************) (* *) (* This file is part of MOPSA, a Modular Open Platform for Static Analysis. *) (* *) (* Copyright (C) 2017-2021 The MOPSA Project. *) (* *) (* 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, either version 3 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, see <http://www.gnu.org/licenses/>. *) (* *) (****************************************************************************) (** Trace markers *) open Ast.Stmt open Ast.Visitor open Mopsa_utils type marker = .. type marker_info = { marker_name : string; marker_print_name : (marker -> string) -> marker -> string; marker_print : (Format.formatter -> marker -> unit) -> Format.formatter -> marker -> unit; marker_compare : (marker -> marker -> int) -> marker -> marker -> int; } let compare_marker_chain = ref (fun m1 m2 -> Stdlib.compare m1 m2) let pp_marker_chain = ref (fun fmt mk -> Exceptions.panic "marker not registered") let name_marker_chain = ref (fun m -> Exceptions.panic "marker not registered") let compare_marker m1 m2 = !compare_marker_chain m1 m2 let pp_marker fmt m = !pp_marker_chain fmt m let get_marker_name m = !name_marker_chain m let all_markers = ref [] let register_marker info = pp_marker_chain := info.marker_print !pp_marker_chain; compare_marker_chain := info.marker_compare !compare_marker_chain; name_marker_chain := info.marker_print_name !name_marker_chain; all_markers := info.marker_name :: !all_markers type stmt_kind += | S_add_marker of marker let mk_add_marker m range = mk_stmt (S_add_marker m) range let opt_enabled_markers = ref [] let enable_marker name = opt_enabled_markers := name :: !opt_enabled_markers let disable_marker name = opt_enabled_markers := List.filter (fun name' -> name' <> name) !opt_enabled_markers let is_marker_enabled m = match !opt_enabled_markers with | [] -> true | l -> let name = get_marker_name m in List.exists (fun name' -> String.equal name name') !opt_enabled_markers let available_markers () = !all_markers let () = register_stmt_with_visitor { print = (fun next fmt stmt -> match skind stmt with | S_add_marker m -> Format.fprintf fmt "add-marker(%a)" pp_marker m | _ -> next fmt stmt ); compare = (fun next s1 s2 -> match skind s1, skind s2 with | S_add_marker m1, S_add_marker m2 -> compare_marker m1 m2 | _ -> next s1 s2 ); visit = (fun next stmt -> match skind stmt with | S_add_marker _ -> leaf stmt | _ -> next stmt ); }
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>