@@ -85,14 +85,7 @@ let failwith_ fmt =
8585let 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
9790module 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