| Index: src/compiler/frame.h | 
| diff --git a/src/compiler/frame.h b/src/compiler/frame.h | 
| index 77dccaa629cc0c36e2cb604dc5e3ebf3e7065055..d413d3e0336841dee93a753b12a3b431dad99994 100644 | 
| --- a/src/compiler/frame.h | 
| +++ b/src/compiler/frame.h | 
| @@ -81,26 +81,13 @@ class Frame : public ZoneObject { | 
| explicit Frame(int fixed_frame_size_in_slots, | 
| const CallDescriptor* descriptor); | 
|  | 
| -  inline bool needs_frame() const { return needs_frame_; } | 
| -  inline void MarkNeedsFrame() { needs_frame_ = true; } | 
| - | 
| inline int GetTotalFrameSlotCount() const { return frame_slot_count_; } | 
|  | 
| -  inline int GetSPToFPSlotCount() const { | 
| -    return GetTotalFrameSlotCount() - | 
| -           StandardFrameConstants::kFixedSlotCountAboveFp; | 
| -  } | 
| inline int GetSavedCalleeRegisterSlotCount() const { | 
| return callee_saved_slot_count_; | 
| } | 
| inline int GetSpillSlotCount() const { return spill_slot_count_; } | 
|  | 
| -  inline void SetElidedFrameSizeInSlots(int slots) { | 
| -    DCHECK_EQ(0, callee_saved_slot_count_); | 
| -    DCHECK_EQ(0, spill_slot_count_); | 
| -    frame_slot_count_ = slots; | 
| -  } | 
| - | 
| void SetAllocatedRegisters(BitVector* regs) { | 
| DCHECK(allocated_registers_ == nullptr); | 
| allocated_registers_ = regs; | 
| @@ -120,21 +107,18 @@ class Frame : public ZoneObject { | 
| int alignment_slots = alignment / kPointerSize; | 
| int delta = alignment_slots - (frame_slot_count_ & (alignment_slots - 1)); | 
| if (delta != alignment_slots) { | 
| -      DCHECK(needs_frame_); | 
| frame_slot_count_ += delta; | 
| } | 
| return delta; | 
| } | 
|  | 
| void AllocateSavedCalleeRegisterSlots(int count) { | 
| -    needs_frame_ = true; | 
| frame_slot_count_ += count; | 
| callee_saved_slot_count_ += count; | 
| } | 
|  | 
| int AllocateSpillSlot(int width) { | 
| DCHECK_EQ(0, callee_saved_slot_count_); | 
| -    needs_frame_ = true; | 
| int frame_slot_count_before = frame_slot_count_; | 
| int slot = AllocateAlignedFrameSlot(width); | 
| spill_slot_count_ += (frame_slot_count_ - frame_slot_count_before); | 
| @@ -146,7 +130,6 @@ class Frame : public ZoneObject { | 
| int ReserveSpillSlots(size_t slot_count) { | 
| DCHECK_EQ(0, callee_saved_slot_count_); | 
| DCHECK_EQ(0, spill_slot_count_); | 
| -    needs_frame_ = true; | 
| spill_slot_count_ += static_cast<int>(slot_count); | 
| frame_slot_count_ += static_cast<int>(slot_count); | 
| return frame_slot_count_ - 1; | 
| @@ -168,7 +151,6 @@ class Frame : public ZoneObject { | 
| } | 
|  | 
| private: | 
| -  bool needs_frame_; | 
| int frame_slot_count_; | 
| int callee_saved_slot_count_; | 
| int spill_slot_count_; | 
| @@ -210,23 +192,33 @@ class FrameOffset { | 
| class FrameAccessState : public ZoneObject { | 
| public: | 
| explicit FrameAccessState(Frame* const frame) | 
| -      : frame_(frame), access_frame_with_fp_(false), sp_delta_(0) { | 
| -    SetFrameAccessToDefault(); | 
| -  } | 
| +      : frame_(frame), | 
| +        access_frame_with_fp_(false), | 
| +        sp_delta_(0), | 
| +        has_frame_(false) {} | 
|  | 
| Frame* frame() const { return frame_; } | 
| +  void MarkHasFrame(bool state); | 
|  | 
| int sp_delta() const { return sp_delta_; } | 
| void ClearSPDelta() { sp_delta_ = 0; } | 
| void IncreaseSPDelta(int amount) { sp_delta_ += amount; } | 
|  | 
| bool access_frame_with_fp() const { return access_frame_with_fp_; } | 
| + | 
| +  // Regardless of how we access slots on the stack - using sp or fp - do we | 
| +  // have a frame, at the current stage in code generation. | 
| +  bool has_frame() const { return has_frame_; } | 
| + | 
| void SetFrameAccessToDefault(); | 
| void SetFrameAccessToFP() { access_frame_with_fp_ = true; } | 
| void SetFrameAccessToSP() { access_frame_with_fp_ = false; } | 
|  | 
| int GetSPToFPSlotCount() const { | 
| -    return frame_->GetSPToFPSlotCount() + sp_delta(); | 
| +    int frame_slot_count = | 
| +        (has_frame() ? frame()->GetTotalFrameSlotCount() : kElidedFrameSlots) - | 
| +        StandardFrameConstants::kFixedSlotCountAboveFp; | 
| +    return frame_slot_count + sp_delta(); | 
| } | 
| int GetSPToFPOffset() const { return GetSPToFPSlotCount() * kPointerSize; } | 
|  | 
| @@ -240,6 +232,7 @@ class FrameAccessState : public ZoneObject { | 
| Frame* const frame_; | 
| bool access_frame_with_fp_; | 
| int sp_delta_; | 
| +  bool has_frame_; | 
| }; | 
| }  // namespace compiler | 
| }  // namespace internal | 
|  |