Index: src/ia32/macro-assembler-ia32.h |
=================================================================== |
--- src/ia32/macro-assembler-ia32.h (revision 8110) |
+++ src/ia32/macro-assembler-ia32.h (working copy) |
@@ -29,6 +29,7 @@ |
#define V8_IA32_MACRO_ASSEMBLER_IA32_H_ |
#include "assembler.h" |
+#include "frames.h" |
#include "v8globals.h" |
namespace v8 { |
@@ -105,15 +106,6 @@ |
void DebugBreak(); |
#endif |
- // --------------------------------------------------------------------------- |
- // Activation frames |
- |
- void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); } |
- void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); } |
- |
- void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } |
- void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } |
- |
// Enter specific kind of exit frame. Expects the number of |
// arguments in register eax and sets up the number of arguments in |
// register edi and the pointer to the first argument in register |
@@ -624,6 +616,9 @@ |
bool generating_stub() { return generating_stub_; } |
void set_allow_stub_calls(bool value) { allow_stub_calls_ = value; } |
bool allow_stub_calls() { return allow_stub_calls_; } |
+ void set_has_frame(bool value) { has_frame_ = value; } |
+ bool has_frame() { return has_frame_; } |
+ inline bool AllowThisStubCall(CodeStub* stub); |
// --------------------------------------------------------------------------- |
// String utilities. |
@@ -647,9 +642,14 @@ |
return SafepointRegisterStackIndex(reg.code()); |
} |
+ // Activation support. |
+ void EnterFrame(StackFrame::Type type); |
+ void LeaveFrame(StackFrame::Type type); |
+ |
private: |
bool generating_stub_; |
bool allow_stub_calls_; |
+ bool has_frame_; |
// This handle will be patched with the code object on installation. |
Handle<Object> code_object_; |
@@ -664,10 +664,6 @@ |
const CallWrapper& call_wrapper = NullCallWrapper(), |
CallKind call_kind = CALL_AS_METHOD); |
- // Activation support. |
- void EnterFrame(StackFrame::Type type); |
- void LeaveFrame(StackFrame::Type type); |
- |
void EnterExitFramePrologue(); |
void EnterExitFrameEpilogue(int argc, bool save_doubles); |
@@ -697,6 +693,56 @@ |
}; |
+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::NONE) { |
+ masm->EnterFrame(type); |
+ } |
+ } |
+ |
+ ~FrameScope() { |
+ if (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 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_; |
+}; |
+ |
+ |
// The code patcher is used to patch (typically) small parts of code e.g. for |
// debugging and other types of instrumentation. When using the code patcher |
// the exact number of bytes specified must be emitted. Is not legal to emit |