| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 830f714225db850b95185a69d9f96f0782ed04da..b9f9126844efea1b0b9f51001ff68d0d2a7a60b4 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -5527,8 +5527,8 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| STATIC_ASSERT(Smi::kMaxValue == String::kMaxLength);
|
| // Handle exceptionally long strings in the runtime system.
|
| __ j(overflow, &string_add_runtime);
|
| - // 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(Operand(ebx), Immediate(Smi::FromInt(2)));
|
| __ j(not_equal, &longer_than_two);
|
|
|
| @@ -5945,6 +5945,8 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| // If entry is undefined no string with this hash can be found.
|
| __ cmp(candidate, FACTORY->undefined_value());
|
| __ j(equal, not_found);
|
| + __ cmp(candidate, FACTORY->null_value());
|
| + __ j(equal, &next_probe[i]);
|
|
|
| // If length is not 2 the string is not a candidate.
|
| __ cmp(FieldOperand(candidate, String::kLengthOffset),
|
| @@ -6313,59 +6315,6 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void StringCharAtStub::Generate(MacroAssembler* masm) {
|
| - // Expects two arguments (object, index) on the stack:
|
| -
|
| - // Stack frame on entry.
|
| - // esp[0]: return address
|
| - // esp[4]: index
|
| - // esp[8]: object
|
| -
|
| - Register object = ebx;
|
| - Register index = eax;
|
| - Register scratch1 = ecx;
|
| - Register scratch2 = edx;
|
| - Register result = eax;
|
| -
|
| - __ pop(scratch1); // Return address.
|
| - __ pop(index);
|
| - __ pop(object);
|
| - __ push(scratch1);
|
| -
|
| - Label need_conversion;
|
| - Label index_out_of_range;
|
| - Label done;
|
| - StringCharAtGenerator generator(object,
|
| - index,
|
| - scratch1,
|
| - scratch2,
|
| - result,
|
| - &need_conversion,
|
| - &need_conversion,
|
| - &index_out_of_range,
|
| - STRING_INDEX_IS_NUMBER);
|
| - generator.GenerateFast(masm);
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&index_out_of_range);
|
| - // When the index is out of range, the spec requires us to return
|
| - // the empty string.
|
| - __ Set(result, Immediate(FACTORY->empty_string()));
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&need_conversion);
|
| - // Move smi zero into the result register, which will trigger
|
| - // conversion.
|
| - __ Set(result, Immediate(Smi::FromInt(0)));
|
| - __ jmp(&done);
|
| -
|
| - StubRuntimeCallHelper call_helper;
|
| - generator.GenerateSlow(masm, call_helper);
|
| -
|
| - __ bind(&done);
|
| - __ ret(0);
|
| -}
|
| -
|
| void ICCompareStub::GenerateSmis(MacroAssembler* masm) {
|
| ASSERT(state_ == CompareIC::SMIS);
|
| NearLabel miss;
|
|
|