@@ -838,6 +838,144 @@ using namespace Js;
838
838
JIT_HELPER_END(Op_StrictEqualEmptyString);
839
839
}
840
840
841
+ #ifdef _CHAKRACOREBUILD
842
+ BOOL JavascriptOperators::StrictEqualNumberType(Var aLeft, Var aRight, TypeId leftType, TypeId rightType, ScriptContext *requestContext)
843
+ {
844
+ double dblLeft, dblRight;
845
+
846
+ switch (leftType)
847
+ {
848
+ case TypeIds_Integer:
849
+ switch (rightType)
850
+ {
851
+ case TypeIds_Integer:
852
+ return aLeft == aRight;
853
+ // we don't need to worry about int64: it cannot equal as we create
854
+ // JavascriptInt64Number only in overflow scenarios.
855
+ case TypeIds_Number:
856
+ dblLeft = TaggedInt::ToDouble(aLeft);
857
+ dblRight = JavascriptNumber::GetValue(aRight);
858
+ goto CommonNumber;
859
+ }
860
+ return FALSE;
861
+
862
+ case TypeIds_Int64Number:
863
+ switch (rightType)
864
+ {
865
+ case TypeIds_Int64Number:
866
+ {
867
+ __int64 leftValue = UnsafeVarTo<JavascriptInt64Number>(aLeft)->GetValue();
868
+ __int64 rightValue = UnsafeVarTo<JavascriptInt64Number>(aRight)->GetValue();
869
+ return leftValue == rightValue;
870
+ }
871
+ case TypeIds_UInt64Number:
872
+ {
873
+ __int64 leftValue = UnsafeVarTo<JavascriptInt64Number>(aLeft)->GetValue();
874
+ unsigned __int64 rightValue = VarTo<JavascriptUInt64Number>(aRight)->GetValue();
875
+ return ((unsigned __int64)leftValue == rightValue);
876
+ }
877
+ case TypeIds_Number:
878
+ dblLeft = (double)UnsafeVarTo<JavascriptInt64Number>(aLeft)->GetValue();
879
+ dblRight = JavascriptNumber::GetValue(aRight);
880
+ goto CommonNumber;
881
+ }
882
+ return FALSE;
883
+
884
+ case TypeIds_UInt64Number:
885
+ switch (rightType)
886
+ {
887
+ case TypeIds_Int64Number:
888
+ {
889
+ unsigned __int64 leftValue = UnsafeVarTo<JavascriptUInt64Number>(aLeft)->GetValue();
890
+ __int64 rightValue = UnsafeVarTo<JavascriptInt64Number>(aRight)->GetValue();
891
+ return (leftValue == (unsigned __int64)rightValue);
892
+ }
893
+ case TypeIds_UInt64Number:
894
+ {
895
+ unsigned __int64 leftValue = UnsafeVarTo<JavascriptUInt64Number>(aLeft)->GetValue();
896
+ unsigned __int64 rightValue = VarTo<JavascriptUInt64Number>(aRight)->GetValue();
897
+ return leftValue == rightValue;
898
+ }
899
+ case TypeIds_Number:
900
+ dblLeft = (double)UnsafeVarTo<JavascriptUInt64Number>(aLeft)->GetValue();
901
+ dblRight = JavascriptNumber::GetValue(aRight);
902
+ goto CommonNumber;
903
+ }
904
+ return FALSE;
905
+
906
+ case TypeIds_Number:
907
+ switch (rightType)
908
+ {
909
+ case TypeIds_Integer:
910
+ dblLeft = JavascriptNumber::GetValue(aLeft);
911
+ dblRight = TaggedInt::ToDouble(aRight);
912
+ goto CommonNumber;
913
+ case TypeIds_Int64Number:
914
+ dblLeft = JavascriptNumber::GetValue(aLeft);
915
+ dblRight = (double)VarTo<JavascriptInt64Number>(aRight)->GetValue();
916
+ goto CommonNumber;
917
+ case TypeIds_UInt64Number:
918
+ dblLeft = JavascriptNumber::GetValue(aLeft);
919
+ dblRight = (double)UnsafeVarTo<JavascriptUInt64Number>(aRight)->GetValue();
920
+ goto CommonNumber;
921
+ case TypeIds_Number:
922
+ dblLeft = JavascriptNumber::GetValue(aLeft);
923
+ dblRight = JavascriptNumber::GetValue(aRight);
924
+ CommonNumber:
925
+ return FEqualDbl(dblLeft, dblRight);
926
+ }
927
+ return FALSE;
928
+ }
929
+
930
+ Assert(0 && "Unreachable Code");
931
+ return FALSE;
932
+ }
933
+
934
+ BOOL JavascriptOperators::StrictEqual(Var aLeft, Var aRight, ScriptContext* requestContext)
935
+ {
936
+ JIT_HELPER_REENTRANT_HEADER(Op_StrictEqual);
937
+ TypeId rightType, leftType;
938
+ leftType = JavascriptOperators::GetTypeId(aLeft);
939
+
940
+ // Because NaN !== NaN, we may not return TRUE when typeId is Number
941
+ if (aLeft == aRight && leftType != TypeIds_Number) return TRUE;
942
+
943
+ rightType = JavascriptOperators::GetTypeId(aRight);
944
+
945
+ if (leftType == TypeIds_String)
946
+ {
947
+ if (rightType == TypeIds_String)
948
+ {
949
+ return JavascriptString::Equals(UnsafeVarTo<JavascriptString>(aLeft), UnsafeVarTo<JavascriptString>(aRight));
950
+ }
951
+ return FALSE;
952
+ }
953
+ else if (leftType >= TypeIds_Integer && leftType <= TypeIds_UInt64Number)
954
+ {
955
+ return JavascriptOperators::StrictEqualNumberType(aLeft, aRight, leftType, rightType, requestContext);
956
+ }
957
+ else if (leftType == TypeIds_GlobalObject)
958
+ {
959
+ BOOL result;
960
+ if (UnsafeVarTo<RecyclableObject>(aLeft)->StrictEquals(aRight, &result, requestContext))
961
+ {
962
+ return result;
963
+ }
964
+ return false;
965
+ }
966
+ else if (leftType == TypeIds_BigInt)
967
+ {
968
+ if (rightType == TypeIds_BigInt)
969
+ {
970
+ return JavascriptBigInt::Equals(aLeft, aRight);
971
+ }
972
+ return FALSE;
973
+ }
974
+
975
+ return aLeft == aRight;
976
+ JIT_HELPER_END(Op_StrictEqual);
977
+ }
978
+ #else
841
979
BOOL JavascriptOperators::StrictEqual(Var aLeft, Var aRight, ScriptContext* requestContext)
842
980
{
843
981
JIT_HELPER_REENTRANT_HEADER(Op_StrictEqual);
@@ -1016,6 +1154,7 @@ using namespace Js;
1016
1154
return aLeft == aRight;
1017
1155
JIT_HELPER_END(Op_StrictEqual);
1018
1156
}
1157
+ #endif
1019
1158
1020
1159
BOOL JavascriptOperators::HasOwnProperty(
1021
1160
Var instance,
0 commit comments