| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 3a90343b844998253fe4f498e9b2051be008a65b..654814c1e6be3403b60d15e00ae7e1f559ae1d6e 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -40,15 +40,12 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size)
|
| - : Assembler(arg_isolate, buffer, size),
|
| +MacroAssembler::MacroAssembler(void* buffer, int size)
|
| + : Assembler(buffer, size),
|
| generating_stub_(false),
|
| allow_stub_calls_(true),
|
| - root_array_available_(true) {
|
| - if (isolate() != NULL) {
|
| - code_object_ = Handle<Object>(isolate()->heap()->undefined_value(),
|
| - isolate());
|
| - }
|
| + root_array_available_(true),
|
| + code_object_(isolate()->heap()->undefined_value()) {
|
| }
|
|
|
|
|
| @@ -2854,6 +2851,9 @@ void MacroAssembler::PrepareCallCFunction(int num_arguments) {
|
| ASSERT(frame_alignment != 0);
|
| ASSERT(num_arguments >= 0);
|
|
|
| + // Reserve space for Isolate address which is always passed as last parameter
|
| + num_arguments += 1;
|
| +
|
| // Make stack end at alignment and allocate space for arguments and old rsp.
|
| movq(kScratchRegister, rsp);
|
| ASSERT(IsPowerOf2(frame_alignment));
|
| @@ -2873,6 +2873,26 @@ void MacroAssembler::CallCFunction(ExternalReference function,
|
|
|
|
|
| void MacroAssembler::CallCFunction(Register function, int num_arguments) {
|
| + // Pass current isolate address as additional parameter.
|
| + if (num_arguments < kRegisterPassedArguments) {
|
| +#ifdef _WIN64
|
| + // First four arguments are passed in registers on Windows.
|
| + Register arg_to_reg[] = {rcx, rdx, r8, r9};
|
| +#else
|
| + // First six arguments are passed in registers on other platforms.
|
| + Register arg_to_reg[] = {rdi, rsi, rdx, rcx, r8, r9};
|
| +#endif
|
| + Register reg = arg_to_reg[num_arguments];
|
| + LoadAddress(reg, ExternalReference::isolate_address());
|
| + } else {
|
| + // Push Isolate pointer after all parameters.
|
| + int argument_slots_on_stack =
|
| + ArgumentStackSlotsForCFunctionCall(num_arguments);
|
| + LoadAddress(kScratchRegister, ExternalReference::isolate_address());
|
| + movq(Operand(rsp, argument_slots_on_stack * kPointerSize),
|
| + kScratchRegister);
|
| + }
|
| +
|
| // Check stack alignment.
|
| if (emit_debug_code()) {
|
| CheckStackAlignment();
|
| @@ -2881,6 +2901,7 @@ void MacroAssembler::CallCFunction(Register function, int num_arguments) {
|
| call(function);
|
| ASSERT(OS::ActivationFrameAlignment() != 0);
|
| ASSERT(num_arguments >= 0);
|
| + num_arguments += 1;
|
| int argument_slots_on_stack =
|
| ArgumentStackSlotsForCFunctionCall(num_arguments);
|
| movq(rsp, Operand(rsp, argument_slots_on_stack * kPointerSize));
|
| @@ -2888,9 +2909,7 @@ void MacroAssembler::CallCFunction(Register function, int num_arguments) {
|
|
|
|
|
| CodePatcher::CodePatcher(byte* address, int size)
|
| - : address_(address),
|
| - size_(size),
|
| - masm_(Isolate::Current(), address, size + Assembler::kGap) {
|
| + : address_(address), size_(size), masm_(address, size + Assembler::kGap) {
|
| // Create a new macro assembler pointing to the address of the code to patch.
|
| // The size is adjusted with kGap on order for the assembler to generate size
|
| // bytes of instructions without failing with buffer size constraints.
|
|
|