| Index: src/arm/builtins-arm.cc
|
| ===================================================================
|
| --- src/arm/builtins-arm.cc (revision 1873)
|
| +++ src/arm/builtins-arm.cc (working copy)
|
| @@ -58,6 +58,16 @@
|
| // -- sp[...]: constructor arguments
|
| // -----------------------------------
|
|
|
| + Label non_function_call;
|
| + // Check that the function is not a smi.
|
| + __ tst(r1, Operand(kSmiTagMask));
|
| + __ b(eq, &non_function_call);
|
| + // Check that the function is a JSFunction.
|
| + __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
|
| + __ ldrb(r2, FieldMemOperand(r2, Map::kInstanceTypeOffset));
|
| + __ cmp(r2, Operand(JS_FUNCTION_TYPE));
|
| + __ b(ne, &non_function_call);
|
| +
|
| // Enter a construct frame.
|
| __ EnterConstructFrame();
|
|
|
| @@ -169,7 +179,17 @@
|
| __ LeaveConstructFrame();
|
| __ add(sp, sp, Operand(r1, LSL, kPointerSizeLog2 - 1));
|
| __ add(sp, sp, Operand(kPointerSize));
|
| - __ mov(pc, Operand(lr));
|
| + __ Jump(lr);
|
| +
|
| + // r0: number of arguments
|
| + // r1: called object
|
| + __ bind(&non_function_call);
|
| +
|
| + // Set expected number of arguments to zero (not changing r0).
|
| + __ mov(r2, Operand(0));
|
| + __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
|
| + __ Jump(Handle<Code>(builtin(ArgumentsAdaptorTrampoline)),
|
| + RelocInfo::CODE_TARGET);
|
| }
|
|
|
|
|
| @@ -235,7 +255,7 @@
|
| // Exit the JS frame and remove the parameters (except function), and return.
|
| // Respect ABI stack constraint.
|
| __ LeaveInternalFrame();
|
| - __ mov(pc, lr);
|
| + __ Jump(lr);
|
|
|
| // r0: result
|
| }
|
| @@ -544,7 +564,7 @@
|
| // Tear down the internal frame and remove function, receiver and args.
|
| __ LeaveInternalFrame();
|
| __ add(sp, sp, Operand(3 * kPointerSize));
|
| - __ mov(pc, lr);
|
| + __ Jump(lr);
|
| }
|
|
|
|
|
| @@ -663,14 +683,14 @@
|
|
|
| // Exit frame and return.
|
| LeaveArgumentsAdaptorFrame(masm);
|
| - __ mov(pc, lr);
|
| + __ Jump(lr);
|
|
|
|
|
| // -------------------------------------------
|
| // Dont adapt arguments.
|
| // -------------------------------------------
|
| __ bind(&dont_adapt_arguments);
|
| - __ mov(pc, r3);
|
| + __ Jump(r3);
|
| }
|
|
|
|
|
|
|