Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 8868) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -1613,14 +1613,14 @@ |
const Register map = r9.is(tos_) ? r7 : r9; |
// undefined -> false. |
- CheckOddball(masm, UNDEFINED, Heap::kUndefinedValueRootIndex, false, &patch); |
+ CheckOddball(masm, UNDEFINED, Heap::kUndefinedValueRootIndex, false); |
// Boolean -> its value. |
- CheckOddball(masm, BOOLEAN, Heap::kFalseValueRootIndex, false, &patch); |
- CheckOddball(masm, BOOLEAN, Heap::kTrueValueRootIndex, true, &patch); |
+ CheckOddball(masm, BOOLEAN, Heap::kFalseValueRootIndex, false); |
+ CheckOddball(masm, BOOLEAN, Heap::kTrueValueRootIndex, true); |
// 'null' -> false. |
- CheckOddball(masm, NULL_TYPE, Heap::kNullValueRootIndex, false, &patch); |
+ CheckOddball(masm, NULL_TYPE, Heap::kNullValueRootIndex, false); |
if (types_.Contains(SMI)) { |
// Smis: 0 -> false, all other -> true |
@@ -1635,12 +1635,13 @@ |
if (types_.NeedsMap()) { |
__ ldr(map, FieldMemOperand(tos_, HeapObject::kMapOffset)); |
- // Everything with a map could be undetectable, so check this now. |
- __ ldrb(ip, FieldMemOperand(map, Map::kBitFieldOffset)); |
- __ tst(ip, Operand(1 << Map::kIsUndetectable)); |
- // Undetectable -> false. |
- __ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, ne); |
- __ Ret(ne); |
+ if (types_.CanBeUndetectable()) { |
+ __ ldrb(ip, FieldMemOperand(map, Map::kBitFieldOffset)); |
+ __ tst(ip, Operand(1 << Map::kIsUndetectable)); |
+ // Undetectable -> false. |
+ __ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, ne); |
+ __ Ret(ne); |
+ } |
} |
if (types_.Contains(SPEC_OBJECT)) { |
@@ -1648,10 +1649,6 @@ |
__ CompareInstanceType(map, ip, FIRST_SPEC_OBJECT_TYPE); |
// tos_ contains the correct non-zero return value already. |
__ Ret(ge); |
- } else if (types_.Contains(INTERNAL_OBJECT)) { |
- // We've seen a spec object for the first time -> patch. |
- __ CompareInstanceType(map, ip, FIRST_SPEC_OBJECT_TYPE); |
- __ b(ge, &patch); |
} |
if (types_.Contains(STRING)) { |
@@ -1659,10 +1656,6 @@ |
__ CompareInstanceType(map, ip, FIRST_NONSTRING_TYPE); |
__ ldr(tos_, FieldMemOperand(tos_, String::kLengthOffset), lt); |
__ Ret(lt); // the string length is OK as the return value |
- } else if (types_.Contains(INTERNAL_OBJECT)) { |
- // We've seen a string for the first time -> patch |
- __ CompareInstanceType(map, ip, FIRST_NONSTRING_TYPE); |
- __ b(lt, &patch); |
} |
if (types_.Contains(HEAP_NUMBER)) { |
@@ -1679,30 +1672,17 @@ |
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, vs); // for FP_NAN |
__ Ret(); |
__ bind(¬_heap_number); |
- } else if (types_.Contains(INTERNAL_OBJECT)) { |
- // We've seen a heap number for the first time -> patch |
- __ CompareRoot(map, Heap::kHeapNumberMapRootIndex); |
- __ b(eq, &patch); |
} |
- if (types_.Contains(INTERNAL_OBJECT)) { |
- // Internal objects -> true. |
- __ mov(tos_, Operand(1, RelocInfo::NONE)); |
- __ Ret(); |
- } |
- |
- if (!types_.IsAll()) { |
- __ bind(&patch); |
- GenerateTypeTransition(masm); |
- } |
+ __ bind(&patch); |
+ GenerateTypeTransition(masm); |
} |
void ToBooleanStub::CheckOddball(MacroAssembler* masm, |
Type type, |
Heap::RootListIndex value, |
- bool result, |
- Label* patch) { |
+ bool result) { |
if (types_.Contains(type)) { |
// If we see an expected oddball, return its ToBoolean value tos_. |
__ LoadRoot(ip, value); |
@@ -1713,12 +1693,6 @@ |
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, eq); |
} |
__ Ret(eq); |
- } else if (types_.Contains(INTERNAL_OBJECT)) { |
- // If we see an unexpected oddball and handle internal objects, we must |
- // patch because the code for internal objects doesn't handle it explictly. |
- __ LoadRoot(ip, value); |
- __ cmp(tos_, ip); |
- __ b(eq, patch); |
} |
} |