Skip to content

Commit 007874b

Browse files
committed
Simplifications for string and number constants.
1 parent f28cbd6 commit 007874b

File tree

2 files changed

+72
-17
lines changed

2 files changed

+72
-17
lines changed

compiler/core/js_exp_make.ml

Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -711,16 +711,20 @@ let rec push_negation (e : t) : t option =
711711
712712
Type check optimizations:
713713
- [(typeof x === "boolean") && (x === true/false)] -> [x === true/false]
714-
- [(typeof x ==="boolean" | "string" | "number") && (x === boolean/null/undefined)] -> [false]
715-
- [(Array.isArray(x)) && (x === boolean/null/undefined)] -> [false]
714+
- [(typeof x === "string") && (x === "abc")] -> [x === "abc"]
715+
- [(typeof x === "number") && (x === 123)] -> [x === 123]
716+
- [(typeof x === "boolean" | "string" | "number") && (x === boolean/null/undefined/123/"hello")] -> [false]
717+
- [(Array.isArray(x)) && (x === boolean/null/undefined/123/"hello")] -> [false]
716718
717719
- [(typeof x === "boolean") && (x !== true/false)] -> unchanged
718-
- [(typeof x === "boolean" | "string" | "number") && (x !== boolean/null/undefined)] -> [typeof x === ...]
719-
- [(Array.isArray(x)) && (x !== boolean/null/undefined)] -> [Array.isArray(x)]
720+
- [(typeof x === "string") && (x !== "abc")] -> unchanged
721+
- [(typeof x === "number") && (x !== 123)] -> unchanged
722+
- [(typeof x === "boolean" | "string" | "number") && (x !== boolean/null/undefined/123/"hello")] -> [typeof x === ...]
723+
- [(Array.isArray(x)) && (x !== boolean/null/undefined/123/"hello")] -> [Array.isArray(x)]
720724
721725
Equality optimizations:
722726
- [e && e] -> [e]
723-
- [(x === boolean/null/undefined) && (x === boolean/null/undefined)] -> [false] (when not equal)
727+
- [(x === boolean/null/undefined/123/"hello") && (x === boolean/null/undefined/123/"hello")] -> [false] (when not equal)
724728
725729
Note: The function preserves the semantics of the original expression while
726730
attempting to reduce it to a simpler form. If no simplification is possible,
@@ -778,24 +782,51 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
778782
{expression_desc = Str {txt = "boolean"}} ) )
779783
when Js_op_util.same_vident ia ib ->
780784
Some {expression_desc = b; comment = None}
785+
| ( Bin
786+
( EqEqEq,
787+
{expression_desc = Typeof {expression_desc = Var ia}},
788+
{expression_desc = Str {txt = "string"}} ),
789+
(Bin (EqEqEq, {expression_desc = Var ib}, {expression_desc = Str _}) as s)
790+
)
791+
| ( (Bin (EqEqEq, {expression_desc = Var ib}, {expression_desc = Str _}) as s),
792+
Bin
793+
( EqEqEq,
794+
{expression_desc = Typeof {expression_desc = Var ia}},
795+
{expression_desc = Str {txt = "string"}} ) )
796+
when Js_op_util.same_vident ia ib ->
797+
Some {expression_desc = s; comment = None}
798+
| ( Bin
799+
( EqEqEq,
800+
{expression_desc = Typeof {expression_desc = Var ia}},
801+
{expression_desc = Str {txt = "number"}} ),
802+
(Bin (EqEqEq, {expression_desc = Var ib}, {expression_desc = Number _}) as
803+
i) )
804+
| ( (Bin (EqEqEq, {expression_desc = Var ib}, {expression_desc = Number _}) as
805+
i),
806+
Bin
807+
( EqEqEq,
808+
{expression_desc = Typeof {expression_desc = Var ia}},
809+
{expression_desc = Str {txt = "number"}} ) )
810+
when Js_op_util.same_vident ia ib ->
811+
Some {expression_desc = i; comment = None}
781812
| ( Bin
782813
( EqEqEq,
783814
{expression_desc = Typeof {expression_desc = Var ia}},
784815
{expression_desc = Str {txt = "boolean" | "string" | "number"}} ),
785816
Bin
786817
( EqEqEq,
787818
{expression_desc = Var ib},
788-
{expression_desc = Bool _ | Null | Undefined _} ) )
819+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ) )
789820
| ( Bin
790821
( EqEqEq,
791822
{expression_desc = Var ib},
792-
{expression_desc = Bool _ | Null | Undefined _} ),
823+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ),
793824
Bin
794825
( EqEqEq,
795826
{expression_desc = Typeof {expression_desc = Var ia}},
796827
{expression_desc = Str {txt = "boolean" | "string" | "number"}} ) )
797828
when Js_op_util.same_vident ia ib ->
798-
(* Note: case boolean / Bool _ is handled above *)
829+
(* Note: cases boolean / Bool _, number / Number _, string / Str _ are handled above *)
799830
Some false_
800831
| ( Call
801832
( {expression_desc = Str {txt = "Array.isArray"}},
@@ -804,11 +835,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
804835
Bin
805836
( EqEqEq,
806837
{expression_desc = Var ib},
807-
{expression_desc = Bool _ | Null | Undefined _} ) )
838+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ) )
808839
| ( Bin
809840
( EqEqEq,
810841
{expression_desc = Var ib},
811-
{expression_desc = Bool _ | Null | Undefined _} ),
842+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ),
812843
Call
813844
( {expression_desc = Str {txt = "Array.isArray"}},
814845
[{expression_desc = Var ia}],
@@ -827,6 +858,30 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
827858
{expression_desc = Str {txt = "boolean"}} ) )
828859
when Js_op_util.same_vident ia ib ->
829860
None
861+
| ( Bin
862+
( EqEqEq,
863+
{expression_desc = Typeof {expression_desc = Var ia}},
864+
{expression_desc = Str {txt = "string"}} ),
865+
Bin (NotEqEq, {expression_desc = Var ib}, {expression_desc = Str _}) )
866+
| ( Bin (NotEqEq, {expression_desc = Var ib}, {expression_desc = Str _}),
867+
Bin
868+
( EqEqEq,
869+
{expression_desc = Typeof {expression_desc = Var ia}},
870+
{expression_desc = Str {txt = "string"}} ) )
871+
when Js_op_util.same_vident ia ib ->
872+
None
873+
| ( Bin
874+
( EqEqEq,
875+
{expression_desc = Typeof {expression_desc = Var ia}},
876+
{expression_desc = Str {txt = "number"}} ),
877+
Bin (NotEqEq, {expression_desc = Var ib}, {expression_desc = Number _}) )
878+
| ( Bin (NotEqEq, {expression_desc = Var ib}, {expression_desc = Number _}),
879+
Bin
880+
( EqEqEq,
881+
{expression_desc = Typeof {expression_desc = Var ia}},
882+
{expression_desc = Str {txt = "number"}} ) )
883+
when Js_op_util.same_vident ia ib ->
884+
None
830885
| ( (Bin
831886
( EqEqEq,
832887
{expression_desc = Typeof {expression_desc = Var ia}},
@@ -835,7 +890,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
835890
Bin
836891
( NotEqEq,
837892
{expression_desc = Var ib},
838-
{expression_desc = Bool _ | Null | Undefined _} ) )
893+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ) )
839894
| ( Bin
840895
( NotEqEq,
841896
{expression_desc = Var ib},
@@ -846,7 +901,7 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
846901
{expression_desc = Str {txt = "boolean" | "string" | "number"}} ) as
847902
typeof) )
848903
when Js_op_util.same_vident ia ib ->
849-
(* Note: case boolean / Bool _ is handled above *)
904+
(* Note: cases boolean / Bool _, number / Number _, string / Str _ are handled above *)
850905
Some {expression_desc = typeof; comment = None}
851906
| ( (Call
852907
( {expression_desc = Str {txt = "Array.isArray"}},
@@ -855,11 +910,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
855910
Bin
856911
( NotEqEq,
857912
{expression_desc = Var ib},
858-
{expression_desc = Bool _ | Null | Undefined _} ) )
913+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ) )
859914
| ( Bin
860915
( NotEqEq,
861916
{expression_desc = Var ib},
862-
{expression_desc = Bool _ | Null | Undefined _} ),
917+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ),
863918
(Call
864919
( {expression_desc = Str {txt = "Array.isArray"}},
865920
[{expression_desc = Var ia}],
@@ -870,11 +925,11 @@ let rec simplify_and (e1 : t) (e2 : t) : t option =
870925
| ( Bin
871926
( EqEqEq,
872927
{expression_desc = Var ia},
873-
{expression_desc = Bool _ | Null | Undefined _} ),
928+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ),
874929
Bin
875930
( EqEqEq,
876931
{expression_desc = Var ib},
877-
{expression_desc = Bool _ | Null | Undefined _} ) )
932+
{expression_desc = Bool _ | Null | Undefined _ | Number _ | Str _} ) )
878933
when Js_op_util.same_vident ia ib ->
879934
(* Note: case x = y is handled above *)
880935
Some false_

tests/tests/src/UntaggedVariants.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ function check$1(s) {
404404
console.log("Nope...");
405405
return;
406406
}
407-
if (typeof match$3 === "string" && match$3 === "My name is") {
407+
if (match$3 === "My name is") {
408408
let match$4 = match$2[1];
409409
if (match$4 === undefined || match$4 === null || match$4 === false || match$4 === true) {
410410
console.log("Nope...");

0 commit comments

Comments
 (0)