Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 432c10c9ece7bd45e4b4128f5d3355cc8db73cf7..92642a71c141556438ca8bd5d45840ae654d9123 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -5108,11 +5108,10 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
__ JumpIfNotSmi(index_, &index_not_smi_); |
// Put smi-tagged index into scratch register. |
Lasse Reichstein
2011/11/09 12:48:11
Remove the comment too.
|
- __ mov(scratch_, index_); |
__ bind(&got_smi_index_); |
// Check for index out of range. |
- __ cmp(scratch_, FieldOperand(object_, String::kLengthOffset)); |
+ __ cmp(index_, FieldOperand(object_, String::kLengthOffset)); |
__ j(above_equal, index_out_of_range_); |
// We need special handling for non-flat strings. |
@@ -5137,25 +5136,25 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
__ cmp(FieldOperand(object_, ConsString::kSecondOffset), |
Immediate(masm->isolate()->factory()->empty_string())); |
__ j(not_equal, &call_runtime_); |
- // Get the first of the two strings and load its instance type. |
- __ mov(result_, FieldOperand(object_, ConsString::kFirstOffset)); |
+ // Get the first of the two parts. |
+ __ mov(object_, FieldOperand(object_, ConsString::kFirstOffset)); |
__ jmp(&assure_seq_string, Label::kNear); |
// SlicedString, unpack and add offset. |
__ bind(&sliced_string); |
- __ add(scratch_, FieldOperand(object_, SlicedString::kOffsetOffset)); |
- __ mov(result_, FieldOperand(object_, SlicedString::kParentOffset)); |
+ __ add(index_, FieldOperand(object_, SlicedString::kOffsetOffset)); |
+ __ mov(object_, FieldOperand(object_, SlicedString::kParentOffset)); |
// Assure that we are dealing with a sequential string. Go to runtime if not. |
+ // Note that if the original string is a cons or slice with an external |
+ // string as underlying string, we pass that unpacked underlying string with |
+ // the updated index to the runtime function. |
__ bind(&assure_seq_string); |
- __ mov(result_, FieldOperand(result_, HeapObject::kMapOffset)); |
+ __ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); |
__ movzx_b(result_, FieldOperand(result_, Map::kInstanceTypeOffset)); |
STATIC_ASSERT(kSeqStringTag == 0); |
__ test(result_, Immediate(kStringRepresentationMask)); |
__ j(not_zero, &call_runtime_); |
- // Actually fetch the parent string if it is confirmed to be sequential. |
- STATIC_ASSERT(SlicedString::kParentOffset == ConsString::kFirstOffset); |
- __ mov(object_, FieldOperand(object_, SlicedString::kParentOffset)); |
// Check for 1-byte or 2-byte string. |
__ bind(&flat_string); |
@@ -5168,16 +5167,16 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
// Load the 2-byte character code into the result register. |
STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1); |
__ movzx_w(result_, FieldOperand(object_, |
- scratch_, times_1, // Scratch is smi-tagged. |
+ index_, times_1, // Scratch is smi-tagged. |
SeqTwoByteString::kHeaderSize)); |
__ jmp(&got_char_code, Label::kNear); |
// ASCII string. |
// Load the byte into the result register. |
__ bind(&ascii_string); |
- __ SmiUntag(scratch_); |
+ __ SmiUntag(index_); |
__ movzx_b(result_, FieldOperand(object_, |
- scratch_, times_1, |
+ index_, times_1, |
SeqAsciiString::kHeaderSize)); |
__ bind(&got_char_code); |
__ SmiTag(result_); |
@@ -5199,7 +5198,6 @@ void StringCharCodeAtGenerator::GenerateSlow( |
DONT_DO_SMI_CHECK); |
call_helper.BeforeCall(masm); |
__ push(object_); |
- __ push(index_); |
__ push(index_); // Consumed by runtime conversion function. |
if (index_flags_ == STRING_INDEX_IS_NUMBER) { |
__ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); |
@@ -5208,12 +5206,11 @@ void StringCharCodeAtGenerator::GenerateSlow( |
// NumberToSmi discards numbers that are not exact integers. |
__ CallRuntime(Runtime::kNumberToSmi, 1); |
} |
- if (!scratch_.is(eax)) { |
+ if (!index_.is(eax)) { |
// Save the conversion result before the pop instructions below |
// have a chance to overwrite it. |
- __ mov(scratch_, eax); |
+ __ mov(index_, eax); |
} |
- __ pop(index_); |
__ pop(object_); |
// Reload the instance type. |
__ mov(result_, FieldOperand(object_, HeapObject::kMapOffset)); |
@@ -5221,7 +5218,7 @@ void StringCharCodeAtGenerator::GenerateSlow( |
call_helper.AfterCall(masm); |
// If index is still not a smi, it must be out of range. |
STATIC_ASSERT(kSmiTag == 0); |
- __ JumpIfNotSmi(scratch_, index_out_of_range_); |
+ __ JumpIfNotSmi(index_, index_out_of_range_); |
// Otherwise, return to the fast path. |
__ jmp(&got_smi_index_); |