forked from rescript-lang/rescript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlam_stats.ml
90 lines (63 loc) · 2.83 KB
/
lam_stats.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
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
*
* 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.
*
* In addition to the permissions granted to you by the LGPL, you may combine
* or link a "work that uses the Library" with a publicly distributed version
* of this file to produce a combined library or application, then distribute
* that combined work under the terms of your choosing, with no requirement
* to comply with the obligations normally placed on you by section 4 of the
* LGPL version 3 (or the corresponding section of a later version of the LGPL
* should you choose to use a 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. *)
(* It can be useful for common sub expression elimination ?
if two lambdas are not equal, it should return false, other wise,
it might return true , this is only used as a way of optimizaton
Use case :
1. switch case -- common fall through
*)
(* lambda pass for alpha conversion
and alias
we need think about the order of the pass, might be the alias pass can be done
in the beginning, when we do alpha conversion, we can instrument the table
*)
type alias_tbl = Ident.t Ident_hashtbl.t
type ident_tbl = Lam_id_kind.t Ident_hashtbl.t
type t = {
env : Env.t;
filename : string ;
export_idents : Ident_set.t ;
exports : Ident.t list ; (*It is kept since order matters? *)
alias_tbl : alias_tbl;
ident_tbl : ident_tbl;
(** we don't need count arities for all identifiers, for identifiers
for sure it's not a function, there is no need to count them
*)
}
let pp = Format.fprintf
let pp_alias_tbl fmt (tbl : alias_tbl) =
Ident_hashtbl.iter (fun k v -> pp fmt "@[%a -> %a@]@." Ident.print k Ident.print v)
tbl
let pp_ident_tbl fmt (ident_tbl : ident_tbl) =
Ident_hashtbl.iter (fun k v -> pp fmt "@[%a -> %a@]@."
Ident.print k Lam_id_kind.print v)
ident_tbl
let print fmt (v : t) =
pp fmt "@[Alias table:@ @[%a@]@]" pp_alias_tbl v.alias_tbl ;
pp fmt "@[Ident table:@ @[%a@]@]" pp_ident_tbl v.ident_tbl ;
pp fmt "@[exports:@ @[%a@]@]"
(Format.pp_print_list
~pp_sep:(fun fmt () -> pp fmt "@ ;")
Ident.print
) v.exports