Skip to content

Commit 33def14

Browse files
committed
remove unsafeCoerce internal
1 parent a03fe5d commit 33def14

File tree

3 files changed

+48
-33
lines changed

3 files changed

+48
-33
lines changed

Diff for: jscomp/others/belt_internalAVLset.ml

+40-29
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222
* You should have received a copy of the GNU Lesser General Public License
2323
* along with this program; if not, write to the Free Software
2424
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
25-
26-
25+
[@@@bs.config {flags = [|"-bs-noassertfalse" |] }]
2726
type 'value node = {
2827
mutable value : 'value;
2928
mutable height : int;
@@ -36,9 +35,6 @@ and 'value t = 'value node option
3635
module A = Belt_Array
3736
module S = Belt_SortArray
3837

39-
40-
external unsafeCoerce : 'a option -> 'a = "%identity"
41-
4238
type ('a, 'b) cmp = ('a, 'b) Belt_Id.cmp
4339

4440
(* Sets are represented by balanced binary trees (the heights of the
@@ -85,22 +81,26 @@ let bal l v r =
8581
let hr = match r with None -> 0 | Some n -> n.height in
8682
if hl > hr + 2 then begin
8783
(* [l] could not be None *)
88-
let {left = ll; value = lv; right = lr} = l |. unsafeCoerce in
84+
match l with None -> assert false
85+
| Some {left = ll; value = lv; right = lr} ->
8986
if heightGe ll lr then
9087
create ll lv (create lr v r)
9188
else begin
9289
(* [lr] could not be None*)
93-
let lr = lr |. unsafeCoerce in
90+
match lr with None -> assert false
91+
| Some lr ->
9492
create (create ll lv lr.left) lr.value (create lr.right v r)
9593
end
9694
end else if hr > hl + 2 then begin
9795
(* [r] could not be None *)
98-
let {left = rl; value = rv; right = rr} = r |. unsafeCoerce in
96+
match r with None -> assert false
97+
| Some {left = rl; value = rv; right = rr} ->
9998
if heightGe rr rl then
10099
create (create l v rl) rv rr
101100
else begin
102101
(* [rl] could not be None *)
103-
let rl = rl |. unsafeCoerce in
102+
match rl with None -> assert false
103+
| Some rl ->
104104
create (create l v rl.left) rl.value (create rl.right rv rr)
105105
end
106106
end else
@@ -553,20 +553,23 @@ let rec getExn (n : _ t) x ~cmp =
553553
L rotation, Some root node
554554
*)
555555
let rotateWithLeftChild k2 =
556-
let k1 = k2 .left|. unsafeCoerce in
557-
k2 .left <- (k1 .right);
558-
k1 .right <- Some k2 ;
559-
let hlk2, hrk2 = k2 .left|. treeHeight , k2 .right |. treeHeight in
560-
k2 .height <- (Pervasives.max hlk2 hrk2 + 1);
561-
let hlk1, hk2 = k1 .left|. treeHeight , k2 .height in
562-
k1 .height <- (Pervasives.max hlk1 hk2 + 1);
563-
k1
556+
match k2 .left with
557+
| None -> assert false
558+
| Some k1 ->
559+
k2 .left <- k1 .right;
560+
k1 .right <- Some k2 ;
561+
let hlk2, hrk2 = k2 .left|. treeHeight , k2 .right |. treeHeight in
562+
k2 .height <- (Pervasives.max hlk2 hrk2 + 1);
563+
let hlk1, hk2 = k1 .left|. treeHeight , k2 .height in
564+
k1 .height <- (Pervasives.max hlk1 hk2 + 1);
565+
k1
564566
(* right rotation *)
565567
let rotateWithRightChild k1 =
566-
let k2 = k1 .right |. unsafeCoerce in
567-
k1 .right <- (k2 .left);
568+
match k1 .right with None -> assert false
569+
| Some k2 ->
570+
k1 .right <- k2 .left;
568571
k2 .left <- Some k1;
569-
let hlk1, hrk1 = k1 .left|. treeHeight, k1 .right |. treeHeight in
572+
let hlk1, hrk1 = k1.left |. treeHeight, k1 .right |. treeHeight in
570573
k1 .height <- (Pervasives.max hlk1 hrk1 + 1);
571574
let hrk2, hk1 = k2 .right |. treeHeight, k1 .height in
572575
k2 .height <- (Pervasives.max hrk2 hk1 + 1);
@@ -576,15 +579,21 @@ let rotateWithRightChild k1 =
576579
double l rotation
577580
*)
578581
let doubleWithLeftChild k3 =
579-
let v = k3 .left|. unsafeCoerce |. rotateWithRightChild |. Some in
580-
k3 .left <- v;
581-
k3 |. rotateWithLeftChild
582-
(** *)
582+
match k3.left with
583+
| None -> assert false
584+
| Some k3l ->
585+
let v = k3l |. rotateWithRightChild |. Some in
586+
k3 .left <- v;
587+
k3 |. rotateWithLeftChild
588+
(** *)
583589

584590
let doubleWithRightChild k2 =
585-
let v = k2 .right |. unsafeCoerce |. rotateWithLeftChild |. Some in
586-
k2 .right <- v;
587-
rotateWithRightChild k2
591+
match k2.right with
592+
| None -> assert false
593+
| Some k2r ->
594+
let v = k2r |. rotateWithLeftChild |. Some in
595+
k2 .right <- v;
596+
rotateWithRightChild k2
588597

589598
let heightUpdateMutate t =
590599
let hlt, hrt = t .left|. treeHeight, t .right |. treeHeight in
@@ -595,15 +604,17 @@ let balMutate nt =
595604
let {left = l; right = r} = nt in
596605
let hl, hr = (treeHeight l, treeHeight r) in
597606
if hl > 2 + hr then
598-
let {left = ll; right = lr} = l |. unsafeCoerce in
607+
match l with None -> assert false
608+
| Some {left = ll; right = lr} ->
599609
(if heightGe ll lr then
600610
heightUpdateMutate (rotateWithLeftChild nt)
601611
else
602612
heightUpdateMutate (doubleWithLeftChild nt)
603613
)
604614
else
605615
if hr > 2 + hl then
606-
let {left = rl; right = rr} = r |. unsafeCoerce in
616+
match r with None -> assert false
617+
| Some {left = rl; right = rr} ->
607618
(if heightGe rr rl then
608619
heightUpdateMutate (rotateWithRightChild nt)
609620
else

Diff for: lib/es6/belt_internalAVLset.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -770,13 +770,15 @@ function rotateWithRightChild(k1) {
770770
}
771771

772772
function doubleWithLeftChild(k3) {
773-
var v = rotateWithRightChild(k3.left);
773+
var k3l = k3.left;
774+
var v = rotateWithRightChild(k3l);
774775
k3.left = v;
775776
return rotateWithLeftChild(k3);
776777
}
777778

778779
function doubleWithRightChild(k2) {
779-
var v = rotateWithLeftChild(k2.right);
780+
var k2r = k2.right;
781+
var v = rotateWithLeftChild(k2r);
780782
k2.right = v;
781783
return rotateWithRightChild(k2);
782784
}

Diff for: lib/js/belt_internalAVLset.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -770,13 +770,15 @@ function rotateWithRightChild(k1) {
770770
}
771771

772772
function doubleWithLeftChild(k3) {
773-
var v = rotateWithRightChild(k3.left);
773+
var k3l = k3.left;
774+
var v = rotateWithRightChild(k3l);
774775
k3.left = v;
775776
return rotateWithLeftChild(k3);
776777
}
777778

778779
function doubleWithRightChild(k2) {
779-
var v = rotateWithLeftChild(k2.right);
780+
var k2r = k2.right;
781+
var v = rotateWithLeftChild(k2r);
780782
k2.right = v;
781783
return rotateWithRightChild(k2);
782784
}

0 commit comments

Comments
 (0)