@@ -44,36 +44,34 @@ type effect = string option
44
44
let single_na = Single Lam_arity. na
45
45
(* * we don't force people to use package *)
46
46
type cmj_case = Ext_namespace .file_kind
47
-
47
+
48
+ type keyed_cmj_value = { name : string ; arity : arity ; persistent_closed_lambda : Lam .t option }
48
49
type keyed_cmj_values
49
- = ( string * cmj_value ) array
50
+ = keyed_cmj_value array
50
51
51
52
type t = {
52
53
values : keyed_cmj_values ;
53
54
pure : bool ;
54
55
npm_package_path : Js_packages_info .t ;
55
56
cmj_case : cmj_case ;
56
57
}
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 =
59
60
{
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
+ });
61
66
pure = effect = None ;
62
67
npm_package_path;
63
68
cmj_case
64
69
}
65
70
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 *)
73
71
74
72
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
77
75
Ext_fmt. failwithf ~loc: __LOC__
78
76
" cmj files have incompatible versions, please rebuilt using the new compiler : %s"
79
77
__LOC__
@@ -98,21 +96,20 @@ let from_file_with_digest name : t * Digest.t =
98
96
99
97
100
98
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
104
102
else
105
103
Ext_fmt. failwithf ~loc: __LOC__
106
104
" cmj files have incompatible versions, please rebuilt using the new compiler : %s"
107
105
__LOC__
108
106
109
- let fixed_length = cmj_magic_number_length + digest_length
110
107
111
108
let for_sure_not_changed (name : string ) (header : string ) =
112
109
if Sys. file_exists name then
113
110
let ic = open_in_bin name in
114
111
let holder =
115
- really_input_string ic fixed_length in
112
+ really_input_string ic Ext_cmj_magic. header_length in
116
113
close_in ic;
117
114
holder = header
118
115
else false
@@ -123,23 +120,24 @@ let for_sure_not_changed (name : string) (header : string) =
123
120
let to_file name ~check_exists (v : t ) =
124
121
let s = Marshal. to_string v [] in
125
122
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
127
124
if not (check_exists && for_sure_not_changed name header) then
128
125
let oc = open_out_bin name in
129
126
output_string oc header;
130
127
output_string oc s;
131
128
close_out oc
132
129
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
135
132
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 }
142
134
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
+
143
141
let rec binarySearchAux arr lo hi (key : string ) =
144
142
let mid = (lo + hi)/ 2 in
145
143
let midVal = Array. unsafe_get arr mid in
@@ -149,34 +147,34 @@ let rec binarySearchAux arr lo hi (key : string) =
149
147
else if c < 0 then (* a[lo] =< key < a[mid] <= a[hi] *)
150
148
if hi = mid then
151
149
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
154
152
else binarySearchAux arr lo mid key
155
153
else (* a[lo] =< a[mid] < key <= a[hi] *)
156
154
if lo = mid then
157
155
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
160
158
else binarySearchAux arr mid hi key
161
159
162
- let binarySearch (sorted : keyed_cmj_values ) (key : string ) =
160
+ let binarySearch (sorted : keyed_cmj_values ) (key : string ) : keyed_cmj_value =
163
161
let len = Array. length sorted in
164
- if len = 0 then not_found
162
+ if len = 0 then not_found key
165
163
else
166
164
let lo = Array. unsafe_get sorted 0 in
167
165
let c = keyComp key lo in
168
- if c < 0 then not_found
166
+ if c < 0 then not_found key
169
167
else
170
168
let hi = Array. unsafe_get sorted (len - 1 ) in
171
169
let c2 = keyComp key hi in
172
- if c2 > 0 then not_found
170
+ if c2 > 0 then not_found key
173
171
else binarySearchAux sorted 0 (len - 1 ) key
174
172
175
173
176
174
(* FIXME: better error message when ocamldep
177
175
get self-cycle
178
176
*)
179
- let query_by_name (cmj_table : t ) name =
177
+ let query_by_name (cmj_table : t ) name : keyed_cmj_value =
180
178
let values = cmj_table.values in
181
179
binarySearch values name
182
180
@@ -215,7 +213,7 @@ let pp_cmj
215
213
f " effect: %s\n "
216
214
(if pure then " pure" else " not pure" );
217
215
Ext_array. iter values
218
- (fun (k , { arity; persistent_closed_lambda} ) ->
216
+ (fun ({ name = k ; arity; persistent_closed_lambda} ) ->
219
217
match arity with
220
218
| Single arity ->
221
219
f " %s: %s\n " k (Format. asprintf " %a" Lam_arity. print arity);
@@ -248,5 +246,10 @@ let pp_cmj
248
246
type path = string
249
247
type cmj_load_info = {
250
248
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
+ *)
252
255
}
0 commit comments