Skip to content

Commit 64be639

Browse files
authored
Merge pull request #4914 from rescript-lang/better_visistor_pattern
optimize the generated code, introducing iter visitor
2 parents 8b15094 + 8d20d89 commit 64be639

26 files changed

+2124
-1737
lines changed

jscomp/core/j.ml

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,38 +39,38 @@
3939
*)
4040

4141

42+
type mutable_flag = Js_op.mutable_flag
4243

43-
type label = string
44+
type binop = Js_op.binop
4445

45-
and binop = Js_op.binop
46+
type int_op = Js_op.int_op
4647

47-
and int_op = Js_op.int_op
48-
49-
and kind = Js_op.kind
48+
type kind = Js_op.kind
5049

51-
and property = Js_op.property
50+
type property = Js_op.property
5251

53-
and number = Js_op.number
52+
type number = Js_op.number
5453

55-
and mutable_flag = Js_op.mutable_flag
54+
type ident_info = Js_op.ident_info
5655

57-
and ident_info = Js_op.ident_info
56+
type exports = Js_op.exports
5857

59-
and exports = Js_op.exports
58+
type tag_info = Js_op.tag_info
6059

61-
and tag_info = Js_op.tag_info
60+
type property_name = Js_op.property_name
61+
62+
type label = string
6263

6364
and required_modules = module_id list
6465

65-
66-
66+
and ident = Ident.t (* we override `method ident` *)
6767

6868
(** object literal, if key is ident, in this case, it might be renamed by
6969
Google Closure optimizer,
7070
currently we always use quote
7171
*)
72-
and property_name = Js_op.property_name
73-
and ident = Ident.t
72+
73+
7474
and module_id = {
7575
id : ident; kind : Js_op.kind
7676
}
@@ -350,3 +350,4 @@ and deps_program =
350350
modules : required_modules ;
351351
side_effect : string option (* None: no, Some reason *)
352352
}
353+
[@@deriving]

jscomp/core/js_analyzer.ml

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,21 @@ let add_defined_idents (x : idents_stats) ident =
4444
Note such shaking is done in the toplevel, so that it requires us to
4545
flatten the statement first
4646
*)
47-
let free_variables (stats : idents_stats) : Js_fold.fold =
47+
let free_variables (stats : idents_stats) : Js_iter.iter =
4848
object (self)
49-
inherit Js_fold.fold as super
49+
inherit Js_iter.iter as super
5050
method! variable_declaration st =
5151
add_defined_idents stats st.ident;
5252
match st.value with
5353
| None
54-
-> self
54+
-> ()
5555
| Some v
5656
->
5757
self # expression v
5858
method! ident id =
5959
(if not (Set_ident.mem stats.defined_idents id )then
60-
stats.used_idents <- Set_ident.add stats.used_idents id);
61-
self
60+
stats.used_idents <- Set_ident.add stats.used_idents id)
61+
6262
method! expression exp =
6363
match exp.expression_desc with
6464
| Fun(_, _,_, env)
@@ -67,8 +67,8 @@ let free_variables (stats : idents_stats) : Js_fold.fold =
6767
*)
6868
->
6969
stats.used_idents <-
70-
Set_ident.union (Js_fun_env.get_unbounded env) stats.used_idents;
71-
self
70+
Set_ident.union (Js_fun_env.get_unbounded env) stats.used_idents
71+
7272

7373
| _
7474
->
@@ -139,32 +139,31 @@ and no_side_effect (x : J.expression) =
139139

140140
let no_side_effect_expression (x : J.expression) = no_side_effect x
141141

142-
let no_side_effect clean : Js_fold.fold =
142+
let no_side_effect clean : Js_iter.iter =
143143
object (self)
144-
inherit Js_fold.fold as super
144+
inherit Js_iter.iter as super
145145
method! statement s =
146-
if not !clean then self else
146+
if !clean then
147147
match s.statement_desc with
148148
| Throw _
149149
| Debugger
150150
| Break
151151
| Variable _
152152
| Continue _ ->
153-
clean := false ; self
153+
clean := false
154154
| Exp e -> self#expression e
155155
| Int_switch _ | String_switch _ | ForRange _
156156
| If _ | While _ | Block _ | Return _ | Try _ -> super#statement s
157157
method! list f x =
158-
if not !clean then self else super#list f x
158+
if !clean then super#list f x
159159
method! expression s =
160-
(if !clean then
161-
clean := no_side_effect_expression s);
162-
self
163-
(** only expression would cause side effec *)
160+
if !clean then
161+
clean := no_side_effect_expression s
162+
(** only expression would cause side effec *)
164163
end
165164
let no_side_effect_statement st =
166165
let clean = ref true in
167-
let _ : Js_fold.fold = ((no_side_effect clean)#statement st) in
166+
(no_side_effect clean)#statement st;
168167
!clean
169168

170169
(* TODO: generate [fold2]

0 commit comments

Comments
 (0)