Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index 5b5e050f511f0fc108e4f5993664febef7439e7e..47e8e8d45a92ceca266fdbfec0fbf8915dc8ede3 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -93,9 +93,8 @@ void InternalArrayNArgumentsConstructorStub::InitializeDescriptor( |
#define __ ACCESS_MASM(masm) |
-static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
- Label* slow, |
- Condition cc); |
+static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, |
+ Condition cc, bool strong); |
static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
Register lhs, |
Register rhs, |
@@ -276,9 +275,8 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { |
// Handle the case where the lhs and rhs are the same object. |
// Equality is almost reflexive (everything but NaN), so this is a test |
// for "identity and not NaN". |
-static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
- Label* slow, |
- Condition cc) { |
+static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, |
+ Condition cc, bool strong) { |
Label not_identical; |
Label heap_number, return_equal; |
Register exp_mask_reg = t5; |
@@ -293,14 +291,31 @@ static void EmitIdenticalObjectComparison(MacroAssembler* masm, |
// Smis. If it's not a heap number, then return equal. |
__ GetObjectType(a0, t4, t4); |
if (cc == less || cc == greater) { |
+ // Call runtime on identical JSObjects. |
__ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE)); |
+ // Call runtime on identical symbols since we need to throw a TypeError. |
__ Branch(slow, eq, t4, Operand(SYMBOL_TYPE)); |
+ if (strong) { |
+ // Call the runtime on anything that is converted in the semantics, since |
+ // we need to throw a TypeError. Smis have already been ruled out. |
+ __ Branch(&return_equal, eq, t4, Operand(HEAP_NUMBER_TYPE)); |
+ __ And(t4, t4, Operand(kIsNotStringMask)); |
+ __ Branch(slow, ne, t4, Operand(zero_reg)); |
+ } |
} else { |
__ Branch(&heap_number, eq, t4, Operand(HEAP_NUMBER_TYPE)); |
// Comparing JS objects with <=, >= is complicated. |
if (cc != eq) { |
__ Branch(slow, greater, t4, Operand(FIRST_SPEC_OBJECT_TYPE)); |
+ // Call runtime on identical symbols since we need to throw a TypeError. |
__ Branch(slow, eq, t4, Operand(SYMBOL_TYPE)); |
+ if (strong) { |
+ // Call the runtime on anything that is converted in the semantics, |
+ // since we need to throw a TypeError. Smis and heap numbers have |
+ // already been ruled out. |
+ __ And(t4, t4, Operand(kIsNotStringMask)); |
+ __ Branch(slow, ne, t4, Operand(zero_reg)); |
+ } |
// Normally here we fall through to return_equal, but undefined is |
// special: (undefined == undefined) == true, but |
// (undefined <= undefined) == false! See ECMAScript 11.8.5. |
@@ -585,7 +600,7 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { |
// Handle the case where the objects are identical. Either returns the answer |
// or goes to slow. Only falls through if the objects were not identical. |
- EmitIdenticalObjectComparison(masm, &slow, cc); |
+ EmitIdenticalObjectComparison(masm, &slow, cc, strong()); |
// If either is a Smi (we know that not both are), then they can only |
// be strictly equal if the other is a HeapNumber. |
@@ -713,7 +728,7 @@ void CompareICStub::GenerateGeneric(MacroAssembler* masm) { |
if (cc == eq) { |
native = strict() ? Builtins::STRICT_EQUALS : Builtins::EQUALS; |
} else { |
- native = Builtins::COMPARE; |
+ native = strong() ? Builtins::COMPARE_STRONG : Builtins::COMPARE; |
int ncr; // NaN compare result. |
if (cc == lt || cc == le) { |
ncr = GREATER; |
@@ -3743,7 +3758,7 @@ void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
__ bind(&unordered); |
__ bind(&generic_stub); |
- CompareICStub stub(isolate(), op(), CompareICState::GENERIC, |
+ CompareICStub stub(isolate(), op(), strong(), CompareICState::GENERIC, |
CompareICState::GENERIC, CompareICState::GENERIC); |
__ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |