Index: src/ia32/ic-ia32.cc |
=================================================================== |
--- src/ia32/ic-ia32.cc (revision 4772) |
+++ src/ia32/ic-ia32.cc (working copy) |
@@ -305,8 +305,7 @@ |
// -- esp[0] : return address |
// ----------------------------------- |
Label slow, check_string, index_smi, index_string; |
- Label check_pixel_array, probe_dictionary; |
- Label check_number_dictionary; |
+ Label check_pixel_array, probe_dictionary, check_number_dictionary; |
// Check that the object isn't a smi. |
__ test(edx, Immediate(kSmiTagMask)); |
@@ -329,8 +328,9 @@ |
// Check that the key is a smi. |
__ test(eax, Immediate(kSmiTagMask)); |
__ j(not_zero, &check_string, not_taken); |
- // Get the elements array of the object. |
__ bind(&index_smi); |
+ // Now the key is known to be a smi. This place is also jumped to from below |
+ // where a numeric string is converted to a smi. |
__ mov(ecx, FieldOperand(edx, JSObject::kElementsOffset)); |
// Check that the object is in fast mode (not dictionary). |
__ CheckMap(ecx, Factory::fixed_array_map(), &check_pixel_array, true); |
@@ -409,6 +409,7 @@ |
__ j(not_zero, &index_string, not_taken); |
// Is the string a symbol? |
+ // ecx: key map. |
__ movzx_b(ebx, FieldOperand(ecx, Map::kInstanceTypeOffset)); |
ASSERT(kSymbolTag != 0); |
__ test(ebx, Immediate(kIsSymbolMask)); |
@@ -461,6 +462,7 @@ |
__ movzx_b(ecx, FieldOperand(ebx, Map::kInstanceSizeOffset)); |
__ add(ecx, Operand(edi)); |
__ mov(eax, FieldOperand(edx, ecx, times_pointer_size, 0)); |
+ __ IncrementCounter(&Counters::keyed_load_generic_lookup_cache, 1); |
__ ret(0); |
// Do a quick inline probe of the receiver's dictionary, if it |
@@ -487,10 +489,17 @@ |
__ bind(&index_string); |
// We want the smi-tagged index in eax. kArrayIndexValueMask has zeros in |
// the low kHashShift bits. |
+ // eax: key (string). |
+ // ebx: hash field. |
+ // edx: receiver. |
ASSERT(String::kHashShift >= kSmiTagSize); |
__ and_(ebx, String::kArrayIndexValueMask); |
__ shr(ebx, String::kHashShift - kSmiTagSize); |
+ // Here we actually clobber the key (eax) which will be used if calling into |
+ // runtime later. However as the new key is the numeric value of a string key |
+ // there is no difference in using either key. |
__ mov(eax, ebx); |
+ // Now jump to the place where smi keys are handled. |
__ jmp(&index_smi); |
} |