Chromium Code Reviews| Index: src/arm/macro-assembler-arm.h |
| =================================================================== |
| --- src/arm/macro-assembler-arm.h (revision 8110) |
| +++ src/arm/macro-assembler-arm.h (working copy) |
| @@ -29,6 +29,7 @@ |
| #define V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| #include "assembler.h" |
| +#include "frames.h" |
| #include "v8globals.h" |
| namespace v8 { |
| @@ -311,16 +312,6 @@ |
| const Register fpscr_flags, |
| const Condition cond = al); |
| - |
| - // --------------------------------------------------------------------------- |
| - // Activation frames |
| - |
| - void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); } |
| - void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); } |
| - |
| - void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); } |
| - void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); } |
| - |
| // Enter exit frame. |
| // stack_space - extra stack space, used for alignment before call to C. |
| void EnterExitFrame(bool save_doubles, int stack_space = 0); |
| @@ -871,6 +862,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); |
| // EABI variant for double arguments in use. |
| bool use_eabi_hardfloat() { |
| @@ -1017,6 +1011,10 @@ |
| void LoadInstanceDescriptors(Register map, Register descriptors); |
| + // Activation support. |
| + void EnterFrame(StackFrame::Type type); |
| + void LeaveFrame(StackFrame::Type type); |
| + |
| private: |
| void CallCFunctionHelper(Register function, |
| ExternalReference function_reference, |
| @@ -1040,10 +1038,6 @@ |
| const CallWrapper& call_wrapper, |
| CallKind call_kind); |
| - // Activation support. |
| - void EnterFrame(StackFrame::Type type); |
| - void LeaveFrame(StackFrame::Type type); |
| - |
| void InitializeNewString(Register string, |
| Register length, |
| Heap::RootListIndex map_index, |
| @@ -1057,6 +1051,7 @@ |
| 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_; |
| @@ -1066,6 +1061,56 @@ |
| }; |
|
Søren Thygesen Gjesse
2011/05/31 07:51:45
Can these two classes be in platform independent m
Erik Corry
2011/05/31 11:52:52
Done.
|
| +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_; |
| +}; |
| + |
| + |
| #ifdef ENABLE_DEBUGGER_SUPPORT |
| // 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 |