Skip to content

Commit d12998f

Browse files
authored
Merge pull request #4159 from BuckleScript/tweak_cmj_format
shrink the size of cm*
2 parents 407d24b + e10b252 commit d12998f

34 files changed

+1705
-1926
lines changed

jscomp/core/builtin_cmi_datasets.ml

Lines changed: 133 additions & 233 deletions
Large diffs are not rendered by default.

jscomp/core/builtin_cmi_datasets.mli

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
3+
4+
(* TODO: we can hide some
5+
more internal units
6+
*)
7+
val module_sets : string array
8+
val module_sets_cmi : Cmi_format.cmi_infos Lazy.t array

jscomp/core/builtin_cmj_datasets.ml

Lines changed: 143 additions & 223 deletions
Large diffs are not rendered by default.

jscomp/core/builtin_cmj_datasets.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
val module_sets : string array
2+
val module_sets_cmj : Js_cmj_format.t Lazy.t array
3+
val query_by_name : string -> Js_cmj_format.t option

jscomp/core/js_cmj_format.ml

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -44,36 +44,34 @@ type effect = string option
4444
let single_na = Single Lam_arity.na
4545
(** we don't force people to use package *)
4646
type cmj_case = Ext_namespace.file_kind
47-
47+
48+
type keyed_cmj_value = { name : string ; arity : arity ; persistent_closed_lambda : Lam.t option}
4849
type keyed_cmj_values
49-
= (string * cmj_value) array
50+
= keyed_cmj_value array
5051

5152
type t = {
5253
values : keyed_cmj_values ;
5354
pure : bool;
5455
npm_package_path : Js_packages_info.t ;
5556
cmj_case : cmj_case;
5657
}
57-
(* let empty_values = [||] *)
58-
let mk ~values ~effect ~npm_package_path ~cmj_case : t =
58+
59+
let make ~(values:cmj_value Map_string.t) ~effect ~npm_package_path ~cmj_case : t =
5960
{
60-
values = Map_string.to_sorted_array values;
61+
values = Map_string.to_sorted_array_with_f values (fun k v -> {
62+
name = k ;
63+
arity = v.arity;
64+
persistent_closed_lambda = v.persistent_closed_lambda
65+
});
6166
pure = effect = None ;
6267
npm_package_path;
6368
cmj_case
6469
}
6570

66-
let cmj_magic_number = "BUCKLE20171012"
67-
let cmj_magic_number_length =
68-
String.length cmj_magic_number
69-
70-
71-
72-
let digest_length = 16 (*16 chars *)
7371

7472
let verify_magic_in_beg ic =
75-
let buffer = really_input_string ic cmj_magic_number_length in
76-
if buffer <> cmj_magic_number then
73+
let buffer = really_input_string ic Ext_cmj_magic.cmj_magic_number_length in
74+
if buffer <> Ext_cmj_magic.cmj_magic_number then
7775
Ext_fmt.failwithf ~loc:__LOC__
7876
"cmj files have incompatible versions, please rebuilt using the new compiler : %s"
7977
__LOC__
@@ -98,21 +96,20 @@ let from_file_with_digest name : t * Digest.t =
9896

9997

10098
let from_string s : t =
101-
let magic_number = String.sub s 0 cmj_magic_number_length in
102-
if magic_number = cmj_magic_number then
103-
Marshal.from_string s (digest_length + cmj_magic_number_length)
99+
let magic_number = String.sub s 0 Ext_cmj_magic.cmj_magic_number_length in
100+
if magic_number = Ext_cmj_magic.cmj_magic_number then
101+
Marshal.from_string s Ext_cmj_magic.header_length
104102
else
105103
Ext_fmt.failwithf ~loc:__LOC__
106104
"cmj files have incompatible versions, please rebuilt using the new compiler : %s"
107105
__LOC__
108106

109-
let fixed_length = cmj_magic_number_length + digest_length
110107

111108
let for_sure_not_changed (name : string) (header : string) =
112109
if Sys.file_exists name then
113110
let ic = open_in_bin name in
114111
let holder =
115-
really_input_string ic fixed_length in
112+
really_input_string ic Ext_cmj_magic.header_length in
116113
close_in ic;
117114
holder = header
118115
else false
@@ -123,23 +120,24 @@ let for_sure_not_changed (name : string) (header : string) =
123120
let to_file name ~check_exists (v : t) =
124121
let s = Marshal.to_string v [] in
125122
let cur_digest = Digest.string s in
126-
let header = cmj_magic_number ^ cur_digest in
123+
let header = Ext_cmj_magic.cmj_magic_number ^ cur_digest in
127124
if not (check_exists && for_sure_not_changed name header) then
128125
let oc = open_out_bin name in
129126
output_string oc header;
130127
output_string oc s;
131128
close_out oc
132129

133-
let keyComp (a : string) (b,_) =
134-
Map_string.compare_key a b
130+
let keyComp (a : string) b =
131+
Map_string.compare_key a b.name
135132

136-
let not_found = single_na, None
137-
let get_result midVal =
138-
let (_,cmj_value) = midVal in
139-
cmj_value.arity,
140-
if Js_config.get_cross_module_inline () then cmj_value.persistent_closed_lambda
141-
else None
133+
let not_found key = {name = key; arity = single_na; persistent_closed_lambda = None }
142134

135+
136+
let get_result midVal =
137+
if midVal.persistent_closed_lambda = None ||
138+
Js_config.get_cross_module_inline () then midVal
139+
else {midVal with persistent_closed_lambda = None}
140+
143141
let rec binarySearchAux arr lo hi (key : string) =
144142
let mid = (lo + hi)/2 in
145143
let midVal = Array.unsafe_get arr mid in
@@ -149,34 +147,34 @@ let rec binarySearchAux arr lo hi (key : string) =
149147
else if c < 0 then (* a[lo] =< key < a[mid] <= a[hi] *)
150148
if hi = mid then
151149
let loVal = (Array.unsafe_get arr lo) in
152-
if fst loVal = key then get_result loVal
153-
else not_found
150+
if loVal.name = key then get_result loVal
151+
else not_found key
154152
else binarySearchAux arr lo mid key
155153
else (* a[lo] =< a[mid] < key <= a[hi] *)
156154
if lo = mid then
157155
let hiVal = (Array.unsafe_get arr hi) in
158-
if fst hiVal = key then get_result hiVal
159-
else not_found
156+
if hiVal.name = key then get_result hiVal
157+
else not_found key
160158
else binarySearchAux arr mid hi key
161159

162-
let binarySearch (sorted : keyed_cmj_values) (key : string) =
160+
let binarySearch (sorted : keyed_cmj_values) (key : string) : keyed_cmj_value =
163161
let len = Array.length sorted in
164-
if len = 0 then not_found
162+
if len = 0 then not_found key
165163
else
166164
let lo = Array.unsafe_get sorted 0 in
167165
let c = keyComp key lo in
168-
if c < 0 then not_found
166+
if c < 0 then not_found key
169167
else
170168
let hi = Array.unsafe_get sorted (len - 1) in
171169
let c2 = keyComp key hi in
172-
if c2 > 0 then not_found
170+
if c2 > 0 then not_found key
173171
else binarySearchAux sorted 0 (len - 1) key
174172

175173

176174
(* FIXME: better error message when ocamldep
177175
get self-cycle
178176
*)
179-
let query_by_name (cmj_table : t ) name =
177+
let query_by_name (cmj_table : t ) name : keyed_cmj_value =
180178
let values = cmj_table.values in
181179
binarySearch values name
182180

@@ -215,7 +213,7 @@ let pp_cmj
215213
f "effect: %s\n"
216214
(if pure then "pure" else "not pure");
217215
Ext_array.iter values
218-
(fun (k , {arity; persistent_closed_lambda}) ->
216+
(fun ({name = k ; arity; persistent_closed_lambda}) ->
219217
match arity with
220218
| Single arity ->
221219
f "%s: %s\n" k (Format.asprintf "%a" Lam_arity.print arity);
@@ -248,5 +246,10 @@ let pp_cmj
248246
type path = string
249247
type cmj_load_info = {
250248
cmj_table : t ;
251-
cmj_path : path ;
249+
package_path : path
250+
(*
251+
Note it is the package path we want
252+
for ES6_global module spec
253+
Maybe we can employ package map in the future
254+
*)
252255
}

jscomp/core/js_cmj_format.mli

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,21 @@ type cmj_case = Ext_namespace.file_kind
6969
type t
7070

7171

72-
val mk:
72+
val make:
7373
values: cmj_value Map_string.t ->
7474
effect: effect ->
7575
npm_package_path: Js_packages_info.t ->
7676
cmj_case:cmj_case ->
7777
t
78-
78+
79+
type keyed_cmj_value =
80+
{ name : string ;
81+
arity : arity ;
82+
persistent_closed_lambda : Lam.t option}
7983
val query_by_name :
8084
t ->
8185
string ->
82-
arity * Lam.t option
86+
keyed_cmj_value
8387

8488
val is_pure :
8589
t -> bool
@@ -114,5 +118,5 @@ val pp_cmj: t -> unit
114118
type path = string
115119
type cmj_load_info = {
116120
cmj_table : t ;
117-
cmj_path : path ;
121+
package_path : path ;
118122
}

jscomp/core/js_cmj_load.ml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ let find_cmj_exn file : Js_cmj_format.cmj_load_info =
3636
match Builtin_cmj_datasets.query_by_name target with
3737
| Some v
3838
->
39-
{cmj_path = "BROWSER"; cmj_table = v}
39+
{package_path = "BROWSER"; cmj_table = v}
4040
| None
4141
->
4242
Bs_exception.error (Cmj_not_found file)
@@ -45,7 +45,10 @@ let find_cmj_exn file : Js_cmj_format.cmj_load_info =
4545
match Config_util.find_opt file with
4646
| Some f
4747
->
48-
{cmj_path = f; cmj_table = Js_cmj_format.from_file f}
48+
{package_path =
49+
(** hacking relying on the convention of pkg/lib/ocaml/xx.cmj*)
50+
Filename.dirname (Filename.dirname (Filename.dirname f));
51+
cmj_table = Js_cmj_format.from_file f}
4952
| None ->
5053
(* ONLY read the stored cmj data in browser environment *)
5154
Bs_exception.error (Cmj_not_found file)

jscomp/core/js_name_of_module_id.ml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ let string_of_module_id
113113
module_system
114114
in
115115
match Lam_compile_env.get_package_path_from_cmj dep_module_id with
116-
| (cmj_path, dep_package_info, little) ->
116+
| (package_path, dep_package_info, little) ->
117117
let js_file = Ext_namespace.js_name_of_modulename dep_module_id.id.name little in
118118
let dep_info_query =
119119
Js_packages_info.query_package_infos dep_package_info module_system
@@ -159,12 +159,7 @@ let string_of_module_id
159159
#end
160160
(** Note we did a post-processing when working on Windows *)
161161
| Es6_global
162-
->
163-
(** lib/ocaml/xx.cmj --
164-
HACKING: FIXME
165-
maybe we can caching relative package path calculation or employ package map *)
166-
(* assert false *)
167-
162+
->
168163
begin
169164
Ext_path.rel_normalized_absolute_path
170165
~from:(
@@ -173,8 +168,7 @@ let string_of_module_id
173168
~package_dir:(Lazy.force Ext_path.package_dir)
174169
module_system
175170
)
176-
((Filename.dirname
177-
(Filename.dirname (Filename.dirname cmj_path))) // dep_pkg.rel_path // js_file)
171+
(package_path // dep_pkg.rel_path // js_file)
178172
end
179173
end
180174
| Package_script, Package_script

jscomp/core/lam_compile.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ let rec
180180
pos
181181
: Js_output.t =
182182
match Lam_compile_env.query_external_id_info id pos with
183-
| { closed_lambda = Some lam}
183+
| { persistent_closed_lambda = Some lam}
184184
when Lam_util.not_function lam
185185
->
186186
compile_lambda lamba_cxt lam
@@ -225,7 +225,7 @@ and compile_external_field_apply
225225
let ident_info =
226226
Lam_compile_env.query_external_id_info module_id field_name in
227227
let ap_args = appinfo.ap_args in
228-
match ident_info.closed_lambda with
228+
match ident_info.persistent_closed_lambda with
229229
| Some (Lfunction{ params; body; _})
230230
when Ext_list.same_length params ap_args ->
231231
(* TODO: serialize it when exporting to save compile time *)

0 commit comments

Comments
 (0)