| Index: src/arm/builtins-arm.cc
|
| ===================================================================
|
| --- src/arm/builtins-arm.cc (revision 8618)
|
| +++ src/arm/builtins-arm.cc (working copy)
|
| @@ -619,8 +619,7 @@
|
|
|
| Label non_function_call;
|
| // Check that the function is not a smi.
|
| - __ tst(r1, Operand(kSmiTagMask));
|
| - __ b(eq, &non_function_call);
|
| + __ JumpIfSmi(r1, &non_function_call);
|
| // Check that the function is a JSFunction.
|
| __ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE);
|
| __ b(ne, &non_function_call);
|
| @@ -675,8 +674,7 @@
|
| // Load the initial map and verify that it is in fact a map.
|
| // r1: constructor function
|
| __ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
|
| - __ tst(r2, Operand(kSmiTagMask));
|
| - __ b(eq, &rt_call);
|
| + __ JumpIfSmi(r2, &rt_call);
|
| __ CompareObjectType(r2, r3, r4, MAP_TYPE);
|
| __ b(ne, &rt_call);
|
|
|
| @@ -915,10 +913,11 @@
|
| masm->isolate()->builtins()->HandleApiCallConstruct();
|
| ParameterCount expected(0);
|
| __ InvokeCode(code, expected, expected,
|
| - RelocInfo::CODE_TARGET, CALL_FUNCTION);
|
| + RelocInfo::CODE_TARGET, CALL_FUNCTION, CALL_AS_METHOD);
|
| } else {
|
| ParameterCount actual(r0);
|
| - __ InvokeFunction(r1, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(r1, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
| // Pop the function from the stack.
|
| @@ -945,12 +944,11 @@
|
| // sp[0]: receiver (newly allocated object)
|
| // sp[1]: constructor function
|
| // sp[2]: number of arguments (smi-tagged)
|
| - __ tst(r0, Operand(kSmiTagMask));
|
| - __ b(eq, &use_receiver);
|
| + __ JumpIfSmi(r0, &use_receiver);
|
|
|
| // If the type of the result (stored in its map) is less than
|
| - // FIRST_JS_OBJECT_TYPE, it is not an object in the ECMA sense.
|
| - __ CompareObjectType(r0, r3, r3, FIRST_JS_OBJECT_TYPE);
|
| + // FIRST_SPEC_OBJECT_TYPE, it is not an object in the ECMA sense.
|
| + __ CompareObjectType(r0, r3, r3, FIRST_SPEC_OBJECT_TYPE);
|
| __ b(ge, &exit);
|
|
|
| // Throw away the result of the constructor invocation and use the
|
| @@ -1046,11 +1044,11 @@
|
| // Invoke the code and pass argc as r0.
|
| __ mov(r0, Operand(r3));
|
| if (is_construct) {
|
| - __ Call(masm->isolate()->builtins()->JSConstructCall(),
|
| - RelocInfo::CODE_TARGET);
|
| + __ Call(masm->isolate()->builtins()->JSConstructCall());
|
| } else {
|
| ParameterCount actual(r0);
|
| - __ InvokeFunction(r1, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(r1, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
| // Exit the JS frame and remove the parameters (except function), and return.
|
| @@ -1234,8 +1232,7 @@
|
| // r0: actual number of arguments
|
| Label non_function;
|
| __ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2));
|
| - __ tst(r1, Operand(kSmiTagMask));
|
| - __ b(eq, &non_function);
|
| + __ JumpIfSmi(r1, &non_function);
|
| __ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE);
|
| __ b(ne, &non_function);
|
|
|
| @@ -1255,8 +1252,7 @@
|
| __ b(ne, &shift_arguments);
|
|
|
| // Do not transform the receiver for native (Compilerhints already in r3).
|
| - __ tst(r3, Operand(1 << (SharedFunctionInfo::kES5Native +
|
| - kSmiTagSize)));
|
| + __ tst(r3, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize)));
|
| __ b(ne, &shift_arguments);
|
|
|
| // Compute the receiver in non-strict mode.
|
| @@ -1265,8 +1261,7 @@
|
| // r0: actual number of arguments
|
| // r1: function
|
| // r2: first argument
|
| - __ tst(r2, Operand(kSmiTagMask));
|
| - __ b(eq, &convert_to_object);
|
| + __ JumpIfSmi(r2, &convert_to_object);
|
|
|
| __ LoadRoot(r3, Heap::kUndefinedValueRootIndex);
|
| __ cmp(r2, r3);
|
| @@ -1275,9 +1270,8 @@
|
| __ cmp(r2, r3);
|
| __ b(eq, &use_global_receiver);
|
|
|
| - STATIC_ASSERT(LAST_JS_OBJECT_TYPE + 1 == LAST_TYPE);
|
| - STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - __ CompareObjectType(r2, r3, r3, FIRST_JS_OBJECT_TYPE);
|
| + STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
| + __ CompareObjectType(r2, r3, r3, FIRST_SPEC_OBJECT_TYPE);
|
| __ b(ge, &shift_arguments);
|
|
|
| __ bind(&convert_to_object);
|
| @@ -1379,7 +1373,8 @@
|
| ne);
|
|
|
| ParameterCount expected(0);
|
| - __ InvokeCode(r3, expected, expected, JUMP_FUNCTION);
|
| + __ InvokeCode(r3, expected, expected, JUMP_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
|
|
| @@ -1440,13 +1435,11 @@
|
| __ b(ne, &push_receiver);
|
|
|
| // Do not transform the receiver for strict mode functions.
|
| - __ tst(r2, Operand(1 << (SharedFunctionInfo::kES5Native +
|
| - kSmiTagSize)));
|
| + __ tst(r2, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize)));
|
| __ b(ne, &push_receiver);
|
|
|
| // Compute the receiver in non-strict mode.
|
| - __ tst(r0, Operand(kSmiTagMask));
|
| - __ b(eq, &call_to_object);
|
| + __ JumpIfSmi(r0, &call_to_object);
|
| __ LoadRoot(r1, Heap::kNullValueRootIndex);
|
| __ cmp(r0, r1);
|
| __ b(eq, &use_global_receiver);
|
| @@ -1456,9 +1449,8 @@
|
|
|
| // Check if the receiver is already a JavaScript object.
|
| // r0: receiver
|
| - STATIC_ASSERT(LAST_JS_OBJECT_TYPE + 1 == LAST_TYPE);
|
| - STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - __ CompareObjectType(r0, r1, r1, FIRST_JS_OBJECT_TYPE);
|
| + STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
| + __ CompareObjectType(r0, r1, r1, FIRST_SPEC_OBJECT_TYPE);
|
| __ b(ge, &push_receiver);
|
|
|
| // Convert the receiver to a regular object.
|
| @@ -1515,7 +1507,8 @@
|
| ParameterCount actual(r0);
|
| __ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
| __ ldr(r1, MemOperand(fp, kFunctionOffset));
|
| - __ InvokeFunction(r1, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(r1, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
|
|
| // Tear down the internal frame and remove function, receiver and args.
|
| __ LeaveInternalFrame();
|
|
|