| Index: src/mips/stub-cache-mips.cc
|
| diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
|
| index ef98db59bb8288a52e746dbb9d0a79c9456a5acf..b713be98a3f59ba61265af1c1f20f52baf7299e2 100644
|
| --- a/src/mips/stub-cache-mips.cc
|
| +++ b/src/mips/stub-cache-mips.cc
|
| @@ -1585,6 +1585,78 @@ Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object,
|
| }
|
|
|
|
|
| +Handle<Code> CallStubCompiler::CompileArrayPopCall(
|
| + Handle<Object> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Cell> cell,
|
| + Handle<JSFunction> function,
|
| + Handle<String> name,
|
| + Code::StubType type) {
|
| + // If object is not an array or is observed or sealed, bail out to regular
|
| + // call.
|
| + if (!object->IsJSArray() ||
|
| + !cell.is_null() ||
|
| + Handle<JSArray>::cast(object)->map()->is_observed() ||
|
| + !Handle<JSArray>::cast(object)->map()->is_extensible()) {
|
| + return Handle<Code>::null();
|
| + }
|
| +
|
| + Label miss, return_undefined, call_builtin;
|
| + Register receiver = a0;
|
| + Register scratch = a1;
|
| + Register elements = a3;
|
| + HandlerFrontendHeader(object, holder, name, RECEIVER_MAP_CHECK, &miss);
|
| +
|
| + // Get the elements array of the object.
|
| + __ lw(elements, FieldMemOperand(receiver, JSArray::kElementsOffset));
|
| +
|
| + // Check that the elements are in fast mode and writable.
|
| + __ CheckMap(elements,
|
| + scratch,
|
| + Heap::kFixedArrayMapRootIndex,
|
| + &call_builtin,
|
| + DONT_DO_SMI_CHECK);
|
| +
|
| + // Get the array's length into t0 and calculate new length.
|
| + __ lw(t0, FieldMemOperand(receiver, JSArray::kLengthOffset));
|
| + __ Subu(t0, t0, Operand(Smi::FromInt(1)));
|
| + __ Branch(&return_undefined, lt, t0, Operand(zero_reg));
|
| +
|
| + // Get the last element.
|
| + __ LoadRoot(t2, Heap::kTheHoleValueRootIndex);
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + // We can't address the last element in one operation. Compute the more
|
| + // expensive shift first, and use an offset later on.
|
| + __ sll(t1, t0, kPointerSizeLog2 - kSmiTagSize);
|
| + __ Addu(elements, elements, t1);
|
| + __ lw(scratch, FieldMemOperand(elements, FixedArray::kHeaderSize));
|
| + __ Branch(&call_builtin, eq, scratch, Operand(t2));
|
| +
|
| + // Set the array's length.
|
| + __ sw(t0, FieldMemOperand(receiver, JSArray::kLengthOffset));
|
| +
|
| + // Fill with the hole.
|
| + __ sw(t2, FieldMemOperand(elements, FixedArray::kHeaderSize));
|
| + const int argc = arguments().immediate();
|
| + __ mov(v0, scratch);
|
| + __ DropAndRet(argc + 1);
|
| +
|
| + __ bind(&return_undefined);
|
| + __ LoadRoot(v0, Heap::kUndefinedValueRootIndex);
|
| + __ DropAndRet(argc + 1);
|
| +
|
| + __ bind(&call_builtin);
|
| + __ TailCallExternalReference(
|
| + ExternalReference(Builtins::c_ArrayPop, isolate()), argc + 1, 1);
|
| +
|
| + HandlerFrontendFooter(&miss);
|
| +
|
| + // Return the generated code.
|
| + return GetCode(type, name);
|
| +}
|
| +
|
| +
|
| Handle<Code> CallStubCompiler::CompileFastApiCall(
|
| const CallOptimization& optimization,
|
| Handle<Object> object,
|
|
|