| Index: src/ia32/codegen-ia32.cc
|
| ===================================================================
|
| --- src/ia32/codegen-ia32.cc (revision 4521)
|
| +++ src/ia32/codegen-ia32.cc (working copy)
|
| @@ -8340,7 +8340,7 @@
|
| deferred->Branch(not_equal);
|
|
|
| // Shift the key to get the actual index value and check that
|
| - // it is within bounds.
|
| + // it is within bounds. Use unsigned comparison to handle negative keys.
|
| __ mov(result.reg(), key.reg());
|
| __ SmiUntag(result.reg());
|
| __ cmp(result.reg(),
|
| @@ -8413,27 +8413,27 @@
|
| deferred->Branch(not_zero);
|
| }
|
|
|
| - // Check that the key is a non-negative smi.
|
| - __ test(key.reg(), Immediate(kSmiTagMask | kSmiSignMask));
|
| - deferred->Branch(not_zero);
|
| + // Check that the key is a smi.
|
| + if (!key.is_smi()) {
|
| + __ test(key.reg(), Immediate(kSmiTagMask));
|
| + deferred->Branch(not_zero);
|
| + } else {
|
| + if (FLAG_debug_code) __ AbortIfNotSmi(key.reg());
|
| + }
|
|
|
| // Check that the receiver is not a smi.
|
| __ test(receiver.reg(), Immediate(kSmiTagMask));
|
| deferred->Branch(zero);
|
|
|
| // Check that the receiver is a JSArray.
|
| - __ mov(tmp.reg(),
|
| - FieldOperand(receiver.reg(), HeapObject::kMapOffset));
|
| - __ movzx_b(tmp.reg(),
|
| - FieldOperand(tmp.reg(), Map::kInstanceTypeOffset));
|
| - __ cmp(tmp.reg(), JS_ARRAY_TYPE);
|
| + __ CmpObjectType(receiver.reg(), JS_ARRAY_TYPE, tmp.reg());
|
| deferred->Branch(not_equal);
|
|
|
| // Check that the key is within bounds. Both the key and the length of
|
| - // the JSArray are smis.
|
| + // the JSArray are smis. Use unsigned comparison to handle negative keys.
|
| __ cmp(key.reg(),
|
| FieldOperand(receiver.reg(), JSArray::kLengthOffset));
|
| - deferred->Branch(greater_equal);
|
| + deferred->Branch(above_equal);
|
|
|
| // Get the elements array from the receiver and check that it is not a
|
| // dictionary.
|
|
|