Index: src/arm/code-stubs-arm.cc |
=================================================================== |
--- src/arm/code-stubs-arm.cc (revision 7153) |
+++ src/arm/code-stubs-arm.cc (working copy) |
@@ -5960,7 +5960,6 @@ |
Register symbol_table = c2; |
__ LoadRoot(symbol_table, Heap::kSymbolTableRootIndex); |
- // Load undefined value |
Register undefined = scratch4; |
__ LoadRoot(undefined, Heap::kUndefinedValueRootIndex); |
@@ -5981,6 +5980,7 @@ |
// mask: capacity mask |
// first_symbol_table_element: address of the first element of |
// the symbol table |
+ // undefined: the undefined object |
// scratch: - |
// Perform a number of probes in the symbol table. |
@@ -6008,20 +6008,27 @@ |
kPointerSizeLog2)); |
// If entry is undefined no string with this hash can be found. |
- __ cmp(candidate, undefined); |
+ Label is_string; |
+ __ CompareObjectType(candidate, scratch, scratch, ODDBALL_TYPE); |
+ __ b(ne, &is_string); |
+ |
+ __ cmp(undefined, candidate); |
__ b(eq, not_found); |
+ // Must be null (deleted entry). |
Lasse Reichstein
2011/03/15 09:07:01
How about adding some debug code to test that it i
Erik Corry
2011/03/15 10:00:50
Done.
|
+ __ jmp(&next_probe[i]); |
+ __ bind(&is_string); |
+ |
+ // Check that the candidate is a non-external ascii string. The instance |
Lasse Reichstein
2011/03/15 09:07:01
ASCII is an acronym.
Erik Corry
2011/03/15 10:00:50
Done.
|
+ // type is still in the scratch register from the CompareObjectType |
+ // operation. |
+ __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, &next_probe[i]); |
+ |
// If length is not 2 the string is not a candidate. |
__ ldr(scratch, FieldMemOperand(candidate, String::kLengthOffset)); |
__ cmp(scratch, Operand(Smi::FromInt(2))); |
__ b(ne, &next_probe[i]); |
- // Check that the candidate is a non-external ascii string. |
- __ ldr(scratch, FieldMemOperand(candidate, HeapObject::kMapOffset)); |
- __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); |
- __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, |
- &next_probe[i]); |
- |
// Check if the two characters match. |
// Assumes that word load is little endian. |
__ ldrh(scratch, FieldMemOperand(candidate, SeqAsciiString::kHeaderSize)); |
@@ -6448,8 +6455,8 @@ |
// Adding two lengths can't overflow. |
STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2); |
__ add(r6, r2, Operand(r3)); |
- // Use the runtime system when adding two one character strings, as it |
- // contains optimizations for this specific case using the symbol table. |
+ // Use the symbol table when adding two one character strings, as it |
+ // helps later optimizations to return a symbol here. |
__ cmp(r6, Operand(2)); |
__ b(ne, &longer_than_two); |