| 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
|
|
|