Skip to content

Commit 67de034

Browse files
committed
Turn on strict submodule coercion optimization
1 parent 7a01e8b commit 67de034

14 files changed

+253
-279
lines changed

jscomp/core/lam.ml

+15-10
Original file line numberDiff line numberDiff line change
@@ -646,30 +646,35 @@ let prim ~primitive:(prim : Lam_primitive.t) ~args loc : t =
646646
end
647647
| _ -> default ()
648648
end
649-
650649
| _ ->
651-
652-
#if 0 then
653650
match prim with
654651
| Pmakeblock(size,Blk_module fields,_)->
655-
let rec aux fields args (var : Ident.t) =
652+
let rec aux fields args (var : Ident.t) i =
656653
match fields, args with
657654
| [], [] -> true
658-
| f :: fields, Lprim {primitive = Pfield (_, Fld_module f1); args = [Lglobal_module v1 | Lvar v1]} :: args
659-
-> f = f1 && Ident.same var v1 && aux fields args var
655+
| f :: fields, Lprim {primitive = Pfield (pos, Fld_module f1); args = [Lglobal_module v1 | Lvar v1]} :: args
656+
->
657+
pos = i &&
658+
f = f1 &&
659+
Ident.same var v1 && aux fields args var (i + 1)
660660
| _, _ -> false in
661661
begin match fields, args with
662662
| field1 :: rest,
663-
Lprim{primitive = Pfield (_, Fld_module f1); args = [Lglobal_module v1 | Lvar v1 as lam]} :: args1
663+
Lprim{primitive = Pfield (pos, Fld_module f1); args = [Lglobal_module v1 | Lvar v1 as lam]} :: args1
664664
->
665-
if field1 = f1 && aux rest args1 v1 then
665+
if pos = 0 && field1 = f1 && aux rest args1 v1 1 then
666666
lam
667667
else
668668
default ()
669669
| _ -> default ()
670-
end
670+
end
671+
(* In this level, include is already expanded, so that
672+
{[
673+
{ x0 : y0 ; x1 : y1 }
674+
]}
675+
such module x can indeed be replaced by module y
676+
*)
671677
| _ ->
672-
#end
673678
default ()
674679

675680
let not_ loc x : t =

jscomp/test/defunctor_make_test.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ function getcompare(x) {
88
}
99

1010
function Make(M) {
11-
return {
12-
compare: M.compare
13-
};
11+
return M;
1412
}
1513

1614
var Comparable = {

jscomp/test/global_module_alias_test.js

+4-216
Original file line numberDiff line numberDiff line change
@@ -38,60 +38,7 @@ function Make(U) {
3838
v.contents = v.contents + 1 | 0;
3939
v.contents = v.contents + 1 | 0;
4040
v.contents = v.contents + 1 | 0;
41-
return {
42-
length: U.length,
43-
compare_lengths: U.compare_lengths,
44-
compare_length_with: U.compare_length_with,
45-
cons: U.cons,
46-
hd: U.hd,
47-
tl: U.tl,
48-
nth: U.nth,
49-
nth_opt: U.nth_opt,
50-
rev: U.rev,
51-
init: U.init,
52-
append: U.append,
53-
rev_append: U.rev_append,
54-
concat: U.concat,
55-
flatten: U.flatten,
56-
iter: U.iter,
57-
iteri: U.iteri,
58-
map: U.map,
59-
mapi: U.mapi,
60-
rev_map: U.rev_map,
61-
fold_left: U.fold_left,
62-
fold_right: U.fold_right,
63-
iter2: U.iter2,
64-
map2: U.map2,
65-
rev_map2: U.rev_map2,
66-
fold_left2: U.fold_left2,
67-
fold_right2: U.fold_right2,
68-
for_all: U.for_all,
69-
exists: U.exists,
70-
for_all2: U.for_all2,
71-
exists2: U.exists2,
72-
mem: U.mem,
73-
memq: U.memq,
74-
find: U.find,
75-
find_opt: U.find_opt,
76-
filter: U.filter,
77-
find_all: U.find_all,
78-
partition: U.partition,
79-
assoc: U.assoc,
80-
assoc_opt: U.assoc_opt,
81-
assq: U.assq,
82-
assq_opt: U.assq_opt,
83-
mem_assoc: U.mem_assoc,
84-
mem_assq: U.mem_assq,
85-
remove_assoc: U.remove_assoc,
86-
remove_assq: U.remove_assq,
87-
split: U.split,
88-
combine: U.combine,
89-
sort: U.sort,
90-
stable_sort: U.stable_sort,
91-
fast_sort: U.fast_sort,
92-
sort_uniq: U.sort_uniq,
93-
merge: U.merge
94-
};
41+
return U;
9542
}
9643

9744
function f(param) {
@@ -101,60 +48,7 @@ function f(param) {
10148
v.contents = v.contents + 1 | 0;
10249
v.contents = v.contents + 1 | 0;
10350
v.contents = v.contents + 1 | 0;
104-
return {
105-
length: List.length,
106-
compare_lengths: List.compare_lengths,
107-
compare_length_with: List.compare_length_with,
108-
cons: List.cons,
109-
hd: List.hd,
110-
tl: List.tl,
111-
nth: List.nth,
112-
nth_opt: List.nth_opt,
113-
rev: List.rev,
114-
init: List.init,
115-
append: List.append,
116-
rev_append: List.rev_append,
117-
concat: List.concat,
118-
flatten: List.flatten,
119-
iter: List.iter,
120-
iteri: List.iteri,
121-
map: List.map,
122-
mapi: List.mapi,
123-
rev_map: List.rev_map,
124-
fold_left: List.fold_left,
125-
fold_right: List.fold_right,
126-
iter2: List.iter2,
127-
map2: List.map2,
128-
rev_map2: List.rev_map2,
129-
fold_left2: List.fold_left2,
130-
fold_right2: List.fold_right2,
131-
for_all: List.for_all,
132-
exists: List.exists,
133-
for_all2: List.for_all2,
134-
exists2: List.exists2,
135-
mem: List.mem,
136-
memq: List.memq,
137-
find: List.find,
138-
find_opt: List.find_opt,
139-
filter: List.filter,
140-
find_all: List.find_all,
141-
partition: List.partition,
142-
assoc: List.assoc,
143-
assoc_opt: List.assoc_opt,
144-
assq: List.assq,
145-
assq_opt: List.assq_opt,
146-
mem_assoc: List.mem_assoc,
147-
mem_assq: List.mem_assq,
148-
remove_assoc: List.remove_assoc,
149-
remove_assq: List.remove_assq,
150-
split: List.split,
151-
combine: List.combine,
152-
sort: List.sort,
153-
stable_sort: List.stable_sort,
154-
fast_sort: List.fast_sort,
155-
sort_uniq: List.sort_uniq,
156-
merge: List.merge
157-
};
51+
return List;
15852
}
15953

16054
eq("File \"global_module_alias_test.ml\", line 51, characters 5-12", List.length(/* :: */[
@@ -189,60 +83,7 @@ v.contents = v.contents + 1 | 0;
18983

19084
v.contents = v.contents + 1 | 0;
19185

192-
var H = {
193-
length: List.length,
194-
compare_lengths: List.compare_lengths,
195-
compare_length_with: List.compare_length_with,
196-
cons: List.cons,
197-
hd: List.hd,
198-
tl: List.tl,
199-
nth: List.nth,
200-
nth_opt: List.nth_opt,
201-
rev: List.rev,
202-
init: List.init,
203-
append: List.append,
204-
rev_append: List.rev_append,
205-
concat: List.concat,
206-
flatten: List.flatten,
207-
iter: List.iter,
208-
iteri: List.iteri,
209-
map: List.map,
210-
mapi: List.mapi,
211-
rev_map: List.rev_map,
212-
fold_left: List.fold_left,
213-
fold_right: List.fold_right,
214-
iter2: List.iter2,
215-
map2: List.map2,
216-
rev_map2: List.rev_map2,
217-
fold_left2: List.fold_left2,
218-
fold_right2: List.fold_right2,
219-
for_all: List.for_all,
220-
exists: List.exists,
221-
for_all2: List.for_all2,
222-
exists2: List.exists2,
223-
mem: List.mem,
224-
memq: List.memq,
225-
find: List.find,
226-
find_opt: List.find_opt,
227-
filter: List.filter,
228-
find_all: List.find_all,
229-
partition: List.partition,
230-
assoc: List.assoc,
231-
assoc_opt: List.assoc_opt,
232-
assq: List.assq,
233-
assq_opt: List.assq_opt,
234-
mem_assoc: List.mem_assoc,
235-
mem_assq: List.mem_assq,
236-
remove_assoc: List.remove_assoc,
237-
remove_assq: List.remove_assq,
238-
split: List.split,
239-
combine: List.combine,
240-
sort: List.sort,
241-
stable_sort: List.stable_sort,
242-
fast_sort: List.fast_sort,
243-
sort_uniq: List.sort_uniq,
244-
merge: List.merge
245-
};
86+
var H = List;
24687

24788
eq("File \"global_module_alias_test.ml\", line 57, characters 5-12", v.contents, 12);
24889

@@ -266,60 +107,7 @@ function xx(param) {
266107
v.contents = v.contents + 1 | 0;
267108
v.contents = v.contents + 1 | 0;
268109
v.contents = v.contents + 1 | 0;
269-
return {
270-
length: List.length,
271-
compare_lengths: List.compare_lengths,
272-
compare_length_with: List.compare_length_with,
273-
cons: List.cons,
274-
hd: List.hd,
275-
tl: List.tl,
276-
nth: List.nth,
277-
nth_opt: List.nth_opt,
278-
rev: List.rev,
279-
init: List.init,
280-
append: List.append,
281-
rev_append: List.rev_append,
282-
concat: List.concat,
283-
flatten: List.flatten,
284-
iter: List.iter,
285-
iteri: List.iteri,
286-
map: List.map,
287-
mapi: List.mapi,
288-
rev_map: List.rev_map,
289-
fold_left: List.fold_left,
290-
fold_right: List.fold_right,
291-
iter2: List.iter2,
292-
map2: List.map2,
293-
rev_map2: List.rev_map2,
294-
fold_left2: List.fold_left2,
295-
fold_right2: List.fold_right2,
296-
for_all: List.for_all,
297-
exists: List.exists,
298-
for_all2: List.for_all2,
299-
exists2: List.exists2,
300-
mem: List.mem,
301-
memq: List.memq,
302-
find: List.find,
303-
find_opt: List.find_opt,
304-
filter: List.filter,
305-
find_all: List.find_all,
306-
partition: List.partition,
307-
assoc: List.assoc,
308-
assoc_opt: List.assoc_opt,
309-
assq: List.assq,
310-
assq_opt: List.assq_opt,
311-
mem_assoc: List.mem_assoc,
312-
mem_assq: List.mem_assq,
313-
remove_assoc: List.remove_assoc,
314-
remove_assq: List.remove_assq,
315-
split: List.split,
316-
combine: List.combine,
317-
sort: List.sort,
318-
stable_sort: List.stable_sort,
319-
fast_sort: List.fast_sort,
320-
sort_uniq: List.sort_uniq,
321-
merge: List.merge
322-
};
110+
return List;
323111
}
324112

325113
eq("File \"global_module_alias_test.ml\", line 86, characters 5-12", g(/* () */0), 4);

jscomp/test/gpr_3865.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
var Gpr_3865_foo = require("./gpr_3865_foo.js");
44

5-
var B = {
6-
$$return: Gpr_3865_foo.$$return
7-
};
5+
var B = Gpr_3865_foo;
86

97
console.log(Gpr_3865_foo.$$return);
108

jscomp/test/gpr_3865_bar.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33

44
function Make(M) {
5-
return {
6-
$$return: M.$$return
7-
};
5+
return M;
86
}
97

108
exports.Make = Make;

0 commit comments

Comments
 (0)