Skip to content

Commit 2355f59

Browse files
committed
binary search
1 parent 526a8e4 commit 2355f59

File tree

2 files changed

+96
-38
lines changed

2 files changed

+96
-38
lines changed

jscomp/core/js_cmj_format.ml

+48-23
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,11 @@ let single_na = Single Lam_arity.na
4545
(** we don't force people to use package *)
4646
type cmj_case = Ext_namespace.file_kind
4747

48+
type keyed_cmj_values
49+
= (string * cmj_value) array
50+
4851
type t = {
49-
values : (string * cmj_value) array ;
52+
values : keyed_cmj_values ;
5053
pure : bool;
5154
npm_package_path : Js_packages_info.t ;
5255
cmj_case : cmj_case;
@@ -139,33 +142,55 @@ let to_file name ~check_exists (v : t) =
139142
output_string oc s;
140143
close_out oc
141144

145+
let keyComp (a : string) (b,_) =
146+
String_map.compare_key a b
147+
148+
let not_found = single_na, None
149+
let get_result midVal =
150+
let (_,cmj_value) = midVal in
151+
cmj_value.arity,
152+
if Js_config.get_cross_module_inline () then cmj_value.persistent_closed_lambda
153+
else None
154+
155+
let rec binarySearchAux arr lo hi (key : string) =
156+
let mid = (lo + hi)/2 in
157+
let midVal = Array.unsafe_get arr mid in
158+
let c = keyComp key midVal in
159+
if c = 0 then
160+
get_result midVal
161+
else if c < 0 then (* a[lo] =< key < a[mid] <= a[hi] *)
162+
if hi = mid then
163+
let loVal = (Array.unsafe_get arr lo) in
164+
if fst loVal = key then get_result loVal
165+
else not_found
166+
else binarySearchAux arr lo mid key
167+
else (* a[lo] =< a[mid] < key <= a[hi] *)
168+
if lo = mid then
169+
let hiVal = (Array.unsafe_get arr hi) in
170+
if fst hiVal = key then get_result hiVal
171+
else not_found
172+
else binarySearchAux arr mid hi key
173+
174+
let binarySearch (sorted : keyed_cmj_values) (key : string) =
175+
let len = Array.length sorted in
176+
if len = 0 then not_found
177+
else
178+
let lo = Array.unsafe_get sorted 0 in
179+
let c = keyComp key lo in
180+
if c < 0 then not_found
181+
else
182+
let hi = Array.unsafe_get sorted (len - 1) in
183+
let c2 = keyComp key hi in
184+
if c2 > 0 then not_found
185+
else binarySearchAux sorted 0 (len - 1) key
186+
187+
142188
(* FIXME: better error message when ocamldep
143189
get self-cycle
144190
*)
145191
let query_by_name (cmj_table : t ) name =
146-
#if 1 then
147-
let rec aux arr offset len =
148-
if offset < len then
149-
let kv = Array.unsafe_get arr offset in
150-
if fst kv = name then
151-
let value = snd kv in
152-
value.arity,
153-
if Js_config.get_cross_module_inline () then
154-
value.persistent_closed_lambda
155-
else None
156-
else aux arr (offset + 1) len
157-
else single_na,None in
158192
let values = cmj_table.values in
159-
aux values 0 (Array.length values)
160-
#else
161-
match String_map.find_opt name cmj_table.values with
162-
| Some {arity; persistent_closed_lambda;_} ->
163-
arity,
164-
if Js_config.get_cross_module_inline () then
165-
persistent_closed_lambda
166-
else None
167-
| None -> single_na, None
168-
#end
193+
binarySearch values name
169194

170195
let is_pure (cmj_table : t ) =
171196
cmj_table.pure

lib/whole_compiler.ml

+48-15
Original file line numberDiff line numberDiff line change
@@ -69518,8 +69518,11 @@ let single_na = Single Lam_arity.na
6951869518
(** we don't force people to use package *)
6951969519
type cmj_case = Ext_namespace.file_kind
6952069520

69521+
type keyed_cmj_values
69522+
= (string * cmj_value) array
69523+
6952169524
type t = {
69522-
values : (string * cmj_value) array ;
69525+
values : keyed_cmj_values ;
6952369526
pure : bool;
6952469527
npm_package_path : Js_packages_info.t ;
6952569528
cmj_case : cmj_case;
@@ -69612,25 +69615,55 @@ let to_file name ~check_exists (v : t) =
6961269615
output_string oc s;
6961369616
close_out oc
6961469617

69618+
let keyComp (a : string) (b,_) =
69619+
String_map.compare_key a b
69620+
69621+
let not_found = single_na, None
69622+
let get_result midVal =
69623+
let (_,cmj_value) = midVal in
69624+
cmj_value.arity,
69625+
if Js_config.get_cross_module_inline () then cmj_value.persistent_closed_lambda
69626+
else None
69627+
69628+
let rec binarySearchAux arr lo hi (key : string) =
69629+
let mid = (lo + hi)/2 in
69630+
let midVal = Array.unsafe_get arr mid in
69631+
let c = keyComp key midVal in
69632+
if c = 0 then
69633+
get_result midVal
69634+
else if c < 0 then (* a[lo] =< key < a[mid] <= a[hi] *)
69635+
if hi = mid then
69636+
let loVal = (Array.unsafe_get arr lo) in
69637+
if fst loVal = key then get_result loVal
69638+
else not_found
69639+
else binarySearchAux arr lo mid key
69640+
else (* a[lo] =< a[mid] < key <= a[hi] *)
69641+
if lo = mid then
69642+
let hiVal = (Array.unsafe_get arr hi) in
69643+
if fst hiVal = key then get_result hiVal
69644+
else not_found
69645+
else binarySearchAux arr mid hi key
69646+
69647+
let binarySearch (sorted : keyed_cmj_values) (key : string) =
69648+
let len = Array.length sorted in
69649+
if len = 0 then not_found
69650+
else
69651+
let lo = Array.unsafe_get sorted 0 in
69652+
let c = keyComp key lo in
69653+
if c < 0 then not_found
69654+
else
69655+
let hi = Array.unsafe_get sorted (len - 1) in
69656+
let c2 = keyComp key hi in
69657+
if c2 > 0 then not_found
69658+
else binarySearchAux sorted 0 (len - 1) key
69659+
69660+
6961569661
(* FIXME: better error message when ocamldep
6961669662
get self-cycle
6961769663
*)
6961869664
let query_by_name (cmj_table : t ) name =
69619-
69620-
let rec aux arr offset len =
69621-
if offset < len then
69622-
let kv = Array.unsafe_get arr offset in
69623-
if fst kv = name then
69624-
let value = snd kv in
69625-
value.arity,
69626-
if Js_config.get_cross_module_inline () then
69627-
value.persistent_closed_lambda
69628-
else None
69629-
else aux arr (offset + 1) len
69630-
else single_na,None in
6963169665
let values = cmj_table.values in
69632-
aux values 0 (Array.length values)
69633-
69666+
binarySearch values name
6963469667

6963569668
let is_pure (cmj_table : t ) =
6963669669
cmj_table.pure

0 commit comments

Comments
 (0)