| Index: src/x64/builtins-x64.cc
|
| ===================================================================
|
| --- src/x64/builtins-x64.cc (revision 8110)
|
| +++ src/x64/builtins-x64.cc (working copy)
|
| @@ -110,8 +110,9 @@
|
| // Should never count constructions for api objects.
|
| ASSERT(!is_api_function || !count_constructions);
|
|
|
| - // Enter a construct frame.
|
| - __ EnterConstructFrame();
|
| + // Enter a construct frame.
|
| +{
|
| + FrameScope scope(masm, StackFrame::CONSTRUCT);
|
|
|
| // Store a smi-tagged arguments count on the stack.
|
| __ Integer32ToSmi(rax, rax);
|
| @@ -120,8 +121,8 @@
|
| // Push the function to invoke on the stack.
|
| __ push(rdi);
|
|
|
| - // Try to allocate the object without transitioning into C code. If any of the
|
| - // preconditions is not met, the code bails out to the runtime call.
|
| + // Try to allocate the object without transitioning into C code. If any of
|
| + // the preconditions is not met, the code bails out to the runtime call.
|
| Label rt_call, allocated;
|
| if (FLAG_inline_new) {
|
| Label undo_allocation;
|
| @@ -146,9 +147,9 @@
|
| __ CmpObjectType(rax, MAP_TYPE, rbx);
|
| __ j(not_equal, &rt_call);
|
|
|
| - // Check that the constructor is not constructing a JSFunction (see comments
|
| - // in Runtime_NewObject in runtime.cc). In which case the initial map's
|
| - // instance type would be JS_FUNCTION_TYPE.
|
| + // Check that the constructor is not constructing a JSFunction (see
|
| + // comments in Runtime_NewObject in runtime.cc). In which case the initial
|
| + // map's instance type would be JS_FUNCTION_TYPE.
|
| // rdi: constructor
|
| // rax: initial map
|
| __ CmpInstanceType(rax, JS_FUNCTION_TYPE);
|
| @@ -158,7 +159,8 @@
|
| Label allocate;
|
| // Decrease generous allocation count.
|
| __ movq(rcx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset));
|
| - __ decb(FieldOperand(rcx, SharedFunctionInfo::kConstructionCountOffset));
|
| + __ decb(FieldOperand(rcx,
|
| + SharedFunctionInfo::kConstructionCountOffset));
|
| __ j(not_zero, &allocate);
|
|
|
| __ push(rax);
|
| @@ -213,10 +215,10 @@
|
| __ j(less, &loop);
|
| }
|
|
|
| - // Add the object tag to make the JSObject real, so that we can continue and
|
| - // jump into the continuation code at any time from now on. Any failures
|
| - // need to undo the allocation, so that the heap is in a consistent state
|
| - // and verifiable.
|
| + // Add the object tag to make the JSObject real, so that we can continue
|
| + // and jump into the continuation code at any time from now on. Any
|
| + // failures need to undo the allocation, so that the heap is in a
|
| + // consistent state and verifiable.
|
| // rax: initial map
|
| // rbx: JSObject
|
| // rdi: start of next object
|
| @@ -229,7 +231,8 @@
|
| // rdi: start of next object
|
| // Calculate total properties described map.
|
| __ movzxbq(rdx, FieldOperand(rax, Map::kUnusedPropertyFieldsOffset));
|
| - __ movzxbq(rcx, FieldOperand(rax, Map::kPreAllocatedPropertyFieldsOffset));
|
| + __ movzxbq(rcx,
|
| + FieldOperand(rax, Map::kPreAllocatedPropertyFieldsOffset));
|
| __ addq(rdx, rcx);
|
| // Calculate unused properties past the end of the in-object properties.
|
| __ movzxbq(rcx, FieldOperand(rax, Map::kInObjectPropertiesOffset));
|
| @@ -374,8 +377,10 @@
|
| // Restore the arguments count and leave the construct frame.
|
| __ bind(&exit);
|
| __ movq(rbx, Operand(rsp, kPointerSize)); // get arguments count
|
| - __ LeaveConstructFrame();
|
|
|
| + // Leave the construct frame.
|
| +}
|
| +
|
| // Remove caller arguments from the stack and return.
|
| __ pop(rcx);
|
| SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2);
|
| @@ -412,10 +417,13 @@
|
| // - Object*** argv
|
| // (see Handle::Invoke in execution.cc).
|
|
|
| + // Open a C++ scope for the FrameScope.
|
| +{
|
| // Platform specific argument handling. After this, the stack contains
|
| // an internal frame and the pushed function and receiver, and
|
| // register rax and rbx holds the argument count and argument array,
|
| // while rdi holds the function pointer and rsi the context.
|
| +
|
| #ifdef _WIN64
|
| // MSVC parameters in:
|
| // rcx : entry (ignored)
|
| @@ -426,7 +434,8 @@
|
|
|
| // Clear the context before we push it when entering the JS frame.
|
| __ Set(rsi, 0);
|
| - __ EnterInternalFrame();
|
| + // Enter an internal frame.
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Load the function context into rsi.
|
| __ movq(rsi, FieldOperand(rdx, JSFunction::kContextOffset));
|
| @@ -456,7 +465,7 @@
|
| // Clear the context before we push it when entering the JS frame.
|
| __ Set(rsi, 0);
|
| // Enter an internal frame.
|
| - __ EnterInternalFrame();
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Push the function and receiver and setup the context.
|
| __ push(rdi);
|
| @@ -503,13 +512,13 @@
|
| __ InvokeFunction(rdi, actual, CALL_FUNCTION,
|
| NullCallWrapper(), CALL_AS_METHOD);
|
| }
|
| -
|
| // Exit the JS frame. Notice that this also removes the empty
|
| // context and the function left on the stack by the code
|
| // invocation.
|
| - __ LeaveInternalFrame();
|
| +}
|
| +
|
| // TODO(X64): Is argument correct? Is there a receiver to remove?
|
| - __ ret(1 * kPointerSize); // remove receiver
|
| + __ ret(1 * kPointerSize); // Remove receiver.
|
| }
|
|
|
|
|
| @@ -525,7 +534,8 @@
|
|
|
| void Builtins::Generate_LazyCompile(MacroAssembler* masm) {
|
| // Enter an internal frame.
|
| - __ EnterInternalFrame();
|
| +{
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Push a copy of the function onto the stack.
|
| __ push(rdi);
|
| @@ -541,7 +551,7 @@
|
| __ pop(rdi);
|
|
|
| // Tear down temporary frame.
|
| - __ LeaveInternalFrame();
|
| +}
|
|
|
| // Do a tail-call of the compiled function.
|
| __ lea(rax, FieldOperand(rax, Code::kHeaderSize));
|
| @@ -551,7 +561,8 @@
|
|
|
| void Builtins::Generate_LazyRecompile(MacroAssembler* masm) {
|
| // Enter an internal frame.
|
| - __ EnterInternalFrame();
|
| +{
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Push a copy of the function onto the stack.
|
| __ push(rdi);
|
| @@ -567,7 +578,7 @@
|
| __ pop(rdi);
|
|
|
| // Tear down temporary frame.
|
| - __ LeaveInternalFrame();
|
| +}
|
|
|
| // Do a tail-call of the compiled function.
|
| __ lea(rax, FieldOperand(rax, Code::kHeaderSize));
|
| @@ -578,14 +589,15 @@
|
| static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
|
| Deoptimizer::BailoutType type) {
|
| // Enter an internal frame.
|
| - __ EnterInternalFrame();
|
| +{
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
|
|
| // Pass the deoptimization type to the runtime system.
|
| __ Push(Smi::FromInt(static_cast<int>(type)));
|
|
|
| __ CallRuntime(Runtime::kNotifyDeoptimized, 1);
|
| // Tear down temporary frame.
|
| - __ LeaveInternalFrame();
|
| +}
|
|
|
| // Get the full codegen state from the stack and untag it.
|
| __ SmiToInteger32(rcx, Operand(rsp, 1 * kPointerSize));
|
| @@ -622,9 +634,10 @@
|
| // the registers without worrying about which of them contain
|
| // pointers. This seems a bit fragile.
|
| __ Pushad();
|
| - __ EnterInternalFrame();
|
| - __ CallRuntime(Runtime::kNotifyOSR, 0);
|
| - __ LeaveInternalFrame();
|
| + {
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| + __ CallRuntime(Runtime::kNotifyOSR, 0);
|
| + }
|
| __ Popad();
|
| __ ret(0);
|
| }
|
| @@ -694,7 +707,9 @@
|
| __ j(above_equal, &shift_arguments);
|
|
|
| __ bind(&convert_to_object);
|
| - __ EnterInternalFrame(); // In order to preserve argument count.
|
| + {
|
| + // Enter an internal frame in order to preserve argument count.
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ Integer32ToSmi(rax, rax);
|
| __ push(rax);
|
|
|
| @@ -704,7 +719,8 @@
|
|
|
| __ pop(rax);
|
| __ SmiToInteger32(rax, rax);
|
| - __ LeaveInternalFrame();
|
| + }
|
| +
|
| // Restore the function to rdi.
|
| __ movq(rdi, Operand(rsp, rax, times_pointer_size, 1 * kPointerSize));
|
| __ jmp(&patch_receiver, Label::kNear);
|
| @@ -787,7 +803,8 @@
|
| // rsp+8: arguments
|
| // rsp+16: receiver ("this")
|
| // rsp+24: function
|
| - __ EnterInternalFrame();
|
| +{
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| // Stack frame:
|
| // rbp: Old base pointer
|
| // rbp[1]: return address
|
| @@ -920,7 +937,8 @@
|
| __ InvokeFunction(rdi, actual, CALL_FUNCTION,
|
| NullCallWrapper(), CALL_AS_METHOD);
|
|
|
| - __ LeaveInternalFrame();
|
| + // Leave internal frame.
|
| +}
|
| __ ret(3 * kPointerSize); // remove function, receiver, and arguments
|
| }
|
|
|
| @@ -1480,10 +1498,11 @@
|
|
|
| // Pass the function to optimize as the argument to the on-stack
|
| // replacement runtime function.
|
| - __ EnterInternalFrame();
|
| +{
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ push(rax);
|
| __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
|
| - __ LeaveInternalFrame();
|
| +}
|
|
|
| // If the result was -1 it means that we couldn't optimize the
|
| // function. Just return and continue in the unoptimized version.
|
| @@ -1501,7 +1520,9 @@
|
|
|
| StackCheckStub stub;
|
| __ TailCallStub(&stub);
|
| - __ Abort("Unreachable code: returned from tail call.");
|
| + if (FLAG_debug_code) {
|
| + __ Abort("Unreachable code: returned from tail call.");
|
| + }
|
| __ bind(&ok);
|
| __ ret(0);
|
|
|
|
|