-
Notifications
You must be signed in to change notification settings - Fork 125
/
pass_ConstantSharing.mli
69 lines (54 loc) · 2.05 KB
/
pass_ConstantSharing.mli
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
(*
Copyright © 2011 MLstate
This file is part of Opa.
Opa is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License, version 3, as published by
the Free Software Foundation.
Opa 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 Affero General Public License for
more details.
You should have received a copy of the GNU Affero General Public License
along with Opa. If not, see <http://www.gnu.org/licenses/>.
*)
(**
Pass to share constants, simple records and records with only constant fields.
@author Esther Baruk
@author Mathieu Barbin
*)
(**
This pass defines for each constant (string, float and records) used in the QML code a toplevel
definition.
We define a subset of QML ast to work only on the part of the ast which we are interested in.
Then it replaces every occurrence of the constant by the corresponding
toplevel identifier just defined.
Example :
{[
_ = %%bslpervasives.print_endline%% "hello"
_ = %%bslpervasives.print_endline%% (%%bslpervasives.string_of_float%% 2.)
c = 2.
_ = %%bslpervasives.print_endline%% "hello"
is rewritten in
{[
v0_const = "hello"
v1_const = 2.
_ = %%bslpervasives.print_endline%% v0_const
_ = %%bslpervasives.print_endline%% (string_of_int v1_const)
c = v1_const
_ = %%bslpervasives.print_endline%% v0_const
]}
The constants ["hello"] and [2.] are now shared thanks to the
declaration of two variables at the beginnning of the code.
For debuging, and choosing what kind of constant to share,
cf constant_sharing_* debug variables.
*)
(**
Beware, part of the env is mutable, which does not allow
to use this module as purelly functionnal with diverge.
*)
val process_code :
side:[`client | `server] ->
typed:bool ->
QmlTypes.gamma ->
QmlAst.annotmap ->
QmlAst.code -> (QmlTypes.gamma * QmlAst.annotmap) * QmlAst.code