Skip to content

Commit 2608ffb

Browse files
author
Meghana Gupta
committed
[MERGE #5931 @meg-gupta] StrictEqual C++ code reorg for ChakraCore
Merge pull request #5931 from meg-gupta:sereorg Removed checks for ExternalType, HostDispatch.
2 parents 5210a36 + 8fca9f3 commit 2608ffb

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

lib/Runtime/Language/JavascriptOperators.cpp

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,144 @@ using namespace Js;
838838
JIT_HELPER_END(Op_StrictEqualEmptyString);
839839
}
840840

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
841979
BOOL JavascriptOperators::StrictEqual(Var aLeft, Var aRight, ScriptContext* requestContext)
842980
{
843981
JIT_HELPER_REENTRANT_HEADER(Op_StrictEqual);
@@ -1016,6 +1154,7 @@ using namespace Js;
10161154
return aLeft == aRight;
10171155
JIT_HELPER_END(Op_StrictEqual);
10181156
}
1157+
#endif
10191158

10201159
BOOL JavascriptOperators::HasOwnProperty(
10211160
Var instance,

lib/Runtime/Language/JavascriptOperators.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ namespace Js
164164
static BOOL StrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
165165
static BOOL StrictEqualString(Var aLeft, JavascriptString* aRight);
166166
static BOOL StrictEqualEmptyString(Var aLeft);
167+
#ifdef _CHAKRACOREBUILD
168+
static BOOL StrictEqualNumberType(Var aLeft, Var aRight, TypeId leftType, TypeId rightType, ScriptContext *requestContext);
169+
#endif
167170
static BOOL NotStrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
168171

169172
static BOOL HasOwnProperty(Var instance, PropertyId propertyId, _In_ ScriptContext * requestContext, _In_opt_ PropertyString * propString);

0 commit comments

Comments
 (0)