| Index: src/arm/stub-cache-arm.cc
|
| diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc
|
| index ce1d85448158d8b6d70728bcb633d5dbaa6b8d80..ee98d126158cdce64cd7e445897311f98b239ea2 100644
|
| --- a/src/arm/stub-cache-arm.cc
|
| +++ b/src/arm/stub-cache-arm.cc
|
| @@ -370,27 +370,31 @@ void StubCompiler::GenerateLoadStringLength(MacroAssembler* masm,
|
| Register receiver,
|
| Register scratch1,
|
| Register scratch2,
|
| - Label* miss) {
|
| + Label* miss,
|
| + bool support_wrappers) {
|
| Label check_wrapper;
|
|
|
| // Check if the object is a string leaving the instance type in the
|
| // scratch1 register.
|
| - GenerateStringCheck(masm, receiver, scratch1, scratch2, miss, &check_wrapper);
|
| + GenerateStringCheck(masm, receiver, scratch1, scratch2, miss,
|
| + support_wrappers ? &check_wrapper : miss);
|
|
|
| // Load length directly from the string.
|
| __ ldr(r0, FieldMemOperand(receiver, String::kLengthOffset));
|
| __ Ret();
|
|
|
| - // Check if the object is a JSValue wrapper.
|
| - __ bind(&check_wrapper);
|
| - __ cmp(scratch1, Operand(JS_VALUE_TYPE));
|
| - __ b(ne, miss);
|
| + if (support_wrappers) {
|
| + // Check if the object is a JSValue wrapper.
|
| + __ bind(&check_wrapper);
|
| + __ cmp(scratch1, Operand(JS_VALUE_TYPE));
|
| + __ b(ne, miss);
|
|
|
| - // Unwrap the value and check if the wrapped value is a string.
|
| - __ ldr(scratch1, FieldMemOperand(receiver, JSValue::kValueOffset));
|
| - GenerateStringCheck(masm, scratch1, scratch2, scratch2, miss, miss);
|
| - __ ldr(r0, FieldMemOperand(scratch1, String::kLengthOffset));
|
| - __ Ret();
|
| + // Unwrap the value and check if the wrapped value is a string.
|
| + __ ldr(scratch1, FieldMemOperand(receiver, JSValue::kValueOffset));
|
| + GenerateStringCheck(masm, scratch1, scratch2, scratch2, miss, miss);
|
| + __ ldr(r0, FieldMemOperand(scratch1, String::kLengthOffset));
|
| + __ Ret();
|
| + }
|
| }
|
|
|
|
|
| @@ -2995,7 +2999,7 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) {
|
| __ cmp(r0, Operand(Handle<String>(name)));
|
| __ b(ne, &miss);
|
|
|
| - GenerateLoadStringLength(masm(), r1, r2, r3, &miss);
|
| + GenerateLoadStringLength(masm(), r1, r2, r3, &miss, true);
|
| __ bind(&miss);
|
| __ DecrementCounter(&Counters::keyed_load_string_length, 1, r2, r3);
|
|
|
|
|