Skip to content

Commit 91ee65b

Browse files
committed
Compiler: small refactoring
1 parent 73e5476 commit 91ee65b

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

compiler/lib/stdlib.ml

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,7 @@ let failwith_ fmt =
8585
let raise_ exn =
8686
if !fail then raise exn else Format.eprintf "%s@." (Printexc.to_string exn)
8787

88-
let int_num_bits =
89-
let size = ref 0 in
90-
let i = ref (-1) in
91-
while !i <> 0 do
92-
i := !i lsl 1;
93-
incr size
94-
done;
95-
!size
88+
let int_num_bits = Sys.int_size
9689

9790
module List = struct
9891
include ListLabels
@@ -1054,20 +1047,26 @@ end = struct
10541047
let arr = t.arr in
10551048
let idx = i / int_num_bits in
10561049
let off = i mod int_num_bits in
1057-
idx < Array.length arr && Array.unsafe_get arr idx land (1 lsl off) <> 0
1050+
idx < Array.length arr
1051+
&&
1052+
let x = Array.unsafe_get arr idx in
1053+
x <> 0 && x land (1 lsl off) <> 0
1054+
1055+
let[@ocaml.inline never] resize t idx =
1056+
let size = Array.length t.arr in
1057+
let size_ref = ref size in
1058+
while idx >= !size_ref do
1059+
size_ref := !size_ref * 2
1060+
done;
1061+
let a = Array.make !size_ref 0 in
1062+
Array.blit t.arr 0 a 0 size;
1063+
t.arr <- a
10581064

10591065
let set t i =
10601066
let idx = i / int_num_bits in
10611067
let off = i mod int_num_bits in
1062-
let size = ref (Array.length t.arr) in
1063-
while idx >= !size do
1064-
size := !size * 2
1065-
done;
1066-
if !size <> Array.length t.arr
1067-
then (
1068-
let a = Array.make !size 0 in
1069-
Array.blit t.arr 0 a 0 (Array.length t.arr);
1070-
t.arr <- a);
1068+
let size = Array.length t.arr in
1069+
if idx >= size then resize t idx;
10711070
Array.unsafe_set t.arr idx (Array.unsafe_get t.arr idx lor (1 lsl off))
10721071

10731072
let unset t i =
@@ -1076,8 +1075,10 @@ end = struct
10761075
let size = Array.length t.arr in
10771076
if idx >= size
10781077
then ()
1079-
else if Array.unsafe_get t.arr idx land (1 lsl off) <> 0
1080-
then Array.unsafe_set t.arr idx (Array.unsafe_get t.arr idx lxor (1 lsl off))
1078+
else
1079+
let b = Array.unsafe_get t.arr idx in
1080+
let mask = 1 lsl off in
1081+
if b <> 0 && b land mask <> 0 then Array.unsafe_set t.arr idx (b lxor mask)
10811082

10821083
let next_free t i =
10831084
let x = ref i in

0 commit comments

Comments
 (0)