Index: src/macro-assembler.h |
=================================================================== |
--- src/macro-assembler.h (revision 9277) |
+++ src/macro-assembler.h (working copy) |
@@ -93,6 +93,63 @@ |
namespace v8 { |
namespace internal { |
+class FrameScope { |
+ public: |
+ explicit FrameScope(MacroAssembler* masm, StackFrame::Type type) |
+ : masm_(masm), type_(type) { |
+ ASSERT(!masm->has_frame()); |
+ masm->set_has_frame(true); |
+ if (type != StackFrame::MANUAL && type_ != StackFrame::NONE) { |
+ masm->EnterFrame(type); |
+ } |
+ } |
+ |
+ ~FrameScope() { |
+ if (type_ != StackFrame::MANUAL && type_ != StackFrame::NONE) { |
+ masm_->LeaveFrame(type_); |
+ } |
+ masm_->set_has_frame(false); |
+ } |
+ |
+ // Normally we generate the leave-frame code when this object goes |
+ // out of scope. Sometimes we may need to generate the code somewhere else |
+ // in addition. Calling this will achieve that, but the object stays in |
+ // scope, the MacroAssembler is still marked as being in a frame scope, and |
+ // the code will be generated again when it goes out of scope. |
+ void GenerateLeaveFrame() { |
+ masm_->LeaveFrame(type_); |
+ } |
+ |
+ private: |
+ MacroAssembler* masm_; |
+ StackFrame::Type type_; |
+}; |
+ |
+ |
+class AllowExternalCallThatCantCauseGC: public FrameScope { |
+ public: |
+ explicit AllowExternalCallThatCantCauseGC(MacroAssembler* masm) |
+ : FrameScope(masm, StackFrame::NONE) { } |
+}; |
+ |
+ |
+class NoCurrentFrameScope { |
+ public: |
+ explicit NoCurrentFrameScope(MacroAssembler* masm) |
+ : masm_(masm), saved_(masm->has_frame()) { |
+ masm->set_has_frame(false); |
+ } |
+ |
+ ~NoCurrentFrameScope() { |
+ masm_->set_has_frame(saved_); |
+ } |
+ |
+ private: |
+ MacroAssembler* masm_; |
+ bool saved_; |
+}; |
+ |
+ |
// Support for "structured" code comments. |
#ifdef DEBUG |