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) |
@@ -424,9 +432,10 @@ |
// r9 : argc |
// [rsp+0x20] : argv |
- // Clear the context before we push it when entering the JS frame. |
+ // Clear the context before we push it when entering the internal 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)); |
@@ -453,10 +462,10 @@ |
__ movq(rdi, rsi); |
// rdi : function |
- // Clear the context before we push it when entering the JS frame. |
+ // Clear the context before we push it when entering the internal 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 |
+ // Exit the internal 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); |
@@ -540,8 +550,8 @@ |
// Restore receiver. |
__ pop(rdi); |
- // Tear down temporary frame. |
- __ LeaveInternalFrame(); |
+ // Tear down internal frame. |
+} |
// 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); |
@@ -566,8 +577,8 @@ |
// Restore function. |
__ pop(rdi); |
- // Tear down temporary frame. |
- __ LeaveInternalFrame(); |
+ // Tear down internal frame. |
+} |
// 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(); |
+ // Tear down internal frame. |
+} |
// 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); |