| Index: src/ia32/ic-ia32.cc | 
| =================================================================== | 
| --- src/ia32/ic-ia32.cc	(revision 4526) | 
| +++ src/ia32/ic-ia32.cc	(working copy) | 
| @@ -496,7 +496,8 @@ | 
| //  -- esp[0] : return address | 
| // ----------------------------------- | 
| Label miss; | 
| -  Label not_positive_smi; | 
| +  Label index_not_smi; | 
| +  Label index_out_of_range; | 
| Label slow_char_code; | 
| Label got_char_code; | 
|  | 
| @@ -511,7 +512,8 @@ | 
| scratch, | 
| code, | 
| &miss,  // When not a string. | 
| -                                       ¬_positive_smi, | 
| +                                       &index_not_smi, | 
| +                                       &index_out_of_range, | 
| &slow_char_code); | 
| // If we didn't bail out, code register contains smi tagged char | 
| // code. | 
| @@ -521,14 +523,9 @@ | 
| __ Abort("Unexpected fall-through from char from code tail call"); | 
| #endif | 
|  | 
| -  // Check if key is a smi or a heap number. | 
| -  __ bind(¬_positive_smi); | 
| -  ASSERT(kSmiTag == 0); | 
| -  __ test(index, Immediate(kSmiTagMask)); | 
| -  __ j(zero, &slow_char_code); | 
| -  __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); | 
| -  __ cmp(ecx, Factory::heap_number_map()); | 
| -  __ j(not_equal, &miss); | 
| +  // Check if key is a heap number. | 
| +  __ bind(&index_not_smi); | 
| +  __ CheckMap(index, Factory::heap_number_map(), &miss, true); | 
|  | 
| // Push receiver and key on the stack (now that we know they are a | 
| // string and a number), and call runtime. | 
| @@ -553,6 +550,7 @@ | 
| } | 
| __ cmp(code, Factory::nan_value()); | 
| __ j(not_equal, &got_char_code); | 
| +  __ bind(&index_out_of_range); | 
| __ Set(eax, Immediate(Factory::undefined_value())); | 
| __ ret(0); | 
|  | 
|  |