| Index: src/x64/builtins-x64.cc
|
| ===================================================================
|
| --- src/x64/builtins-x64.cc (revision 8618)
|
| +++ src/x64/builtins-x64.cc (working copy)
|
| @@ -343,11 +343,12 @@
|
| Handle<Code> code =
|
| masm->isolate()->builtins()->HandleApiCallConstruct();
|
| ParameterCount expected(0);
|
| - __ InvokeCode(code, expected, expected,
|
| - RelocInfo::CODE_TARGET, CALL_FUNCTION);
|
| + __ InvokeCode(code, expected, expected, RelocInfo::CODE_TARGET,
|
| + CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD);
|
| } else {
|
| ParameterCount actual(rax);
|
| - __ InvokeFunction(rdi, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(rdi, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
| // Restore context from the frame.
|
| @@ -361,8 +362,9 @@
|
| __ JumpIfSmi(rax, &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.
|
| - __ CmpObjectType(rax, FIRST_JS_OBJECT_TYPE, rcx);
|
| + // FIRST_SPEC_OBJECT_TYPE, it is not an object in the ECMA sense.
|
| + STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
| + __ CmpObjectType(rax, FIRST_SPEC_OBJECT_TYPE, rcx);
|
| __ j(above_equal, &exit);
|
|
|
| // Throw away the result of the constructor invocation and use the
|
| @@ -499,7 +501,8 @@
|
| } else {
|
| ParameterCount actual(rax);
|
| // Function must be in rdi.
|
| - __ InvokeFunction(rdi, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(rdi, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
| // Exit the JS frame. Notice that this also removes the empty
|
| @@ -673,8 +676,8 @@
|
|
|
| // Do not transform the receiver for natives.
|
| // SharedFunctionInfo is already loaded into rbx.
|
| - __ testb(FieldOperand(rbx, SharedFunctionInfo::kES5NativeByteOffset),
|
| - Immediate(1 << SharedFunctionInfo::kES5NativeBitWithinByte));
|
| + __ testb(FieldOperand(rbx, SharedFunctionInfo::kNativeByteOffset),
|
| + Immediate(1 << SharedFunctionInfo::kNativeBitWithinByte));
|
| __ j(not_zero, &shift_arguments);
|
|
|
| // Compute the receiver in non-strict mode.
|
| @@ -686,9 +689,8 @@
|
| __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex);
|
| __ j(equal, &use_global_receiver);
|
|
|
| - STATIC_ASSERT(LAST_JS_OBJECT_TYPE + 1 == LAST_TYPE);
|
| - STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx);
|
| + STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
| + __ CmpObjectType(rbx, FIRST_SPEC_OBJECT_TYPE, rcx);
|
| __ j(above_equal, &shift_arguments);
|
|
|
| __ bind(&convert_to_object);
|
| @@ -774,7 +776,8 @@
|
| RelocInfo::CODE_TARGET);
|
|
|
| ParameterCount expected(0);
|
| - __ InvokeCode(rdx, expected, expected, JUMP_FUNCTION);
|
| + __ InvokeCode(rdx, expected, expected, JUMP_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
|
|
|
|
| @@ -844,9 +847,9 @@
|
| __ j(not_equal, &push_receiver);
|
|
|
| // Do not transform the receiver for natives.
|
| - __ testb(FieldOperand(rdx, SharedFunctionInfo::kES5NativeByteOffset),
|
| - Immediate(1 << SharedFunctionInfo::kES5NativeBitWithinByte));
|
| - __ j(not_zero, &push_receiver);
|
| + __ testb(FieldOperand(rdx, SharedFunctionInfo::kNativeByteOffset),
|
| + Immediate(1 << SharedFunctionInfo::kNativeBitWithinByte));
|
| + __ j(not_equal, &push_receiver);
|
|
|
| // Compute the receiver in non-strict mode.
|
| __ JumpIfSmi(rbx, &call_to_object, Label::kNear);
|
| @@ -857,9 +860,8 @@
|
|
|
| // If given receiver is already a JavaScript object then there's no
|
| // reason for converting it.
|
| - STATIC_ASSERT(LAST_JS_OBJECT_TYPE + 1 == LAST_TYPE);
|
| - STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE);
|
| - __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx);
|
| + STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
| + __ CmpObjectType(rbx, FIRST_SPEC_OBJECT_TYPE, rcx);
|
| __ j(above_equal, &push_receiver);
|
|
|
| // Convert the receiver to an object.
|
| @@ -914,7 +916,8 @@
|
| ParameterCount actual(rax);
|
| __ SmiToInteger32(rax, rax);
|
| __ movq(rdi, Operand(rbp, kFunctionOffset));
|
| - __ InvokeFunction(rdi, actual, CALL_FUNCTION);
|
| + __ InvokeFunction(rdi, actual, CALL_FUNCTION,
|
| + NullCallWrapper(), CALL_AS_METHOD);
|
|
|
| __ LeaveInternalFrame();
|
| __ ret(3 * kPointerSize); // remove function, receiver, and arguments
|
|
|