Index: src/macro-assembler.h |
diff --git a/src/macro-assembler.h b/src/macro-assembler.h |
index 54cebca90f879fed0bb4e74aa737014704b6bbd4..2501f806c9496671b45f3da4c178a85725a95ef7 100644 |
--- a/src/macro-assembler.h |
+++ b/src/macro-assembler.h |
@@ -124,6 +124,74 @@ class FrameScope { |
bool old_has_frame_; |
}; |
+class FrameAndConstantPoolScope { |
+ public: |
+ FrameAndConstantPoolScope(MacroAssembler* masm, StackFrame::Type type) |
+ : masm_(masm), |
+ type_(type), |
+ old_has_frame_(masm->has_frame()), |
+ old_constant_pool_available_(FLAG_enable_ool_constant_pool && |
+ masm->is_ool_constant_pool_available()) { |
+ masm->set_has_frame(true); |
+ if (FLAG_enable_ool_constant_pool) { |
+ masm->set_ool_constant_pool_available(true); |
+ } |
+ if (type_ != StackFrame::MANUAL && type_ != StackFrame::NONE) { |
+ masm->EnterFrame(type, !old_constant_pool_available_); |
+ } |
+ } |
+ |
+ ~FrameAndConstantPoolScope() { |
+ masm_->LeaveFrame(type_); |
+ masm_->set_has_frame(old_has_frame_); |
+ if (FLAG_enable_ool_constant_pool) { |
+ masm_->set_ool_constant_pool_available(old_constant_pool_available_); |
+ } |
+ } |
+ |
+ // 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() { |
+ DCHECK(type_ != StackFrame::MANUAL && type_ != StackFrame::NONE); |
+ masm_->LeaveFrame(type_); |
+ } |
+ |
+ private: |
+ MacroAssembler* masm_; |
+ StackFrame::Type type_; |
+ bool old_has_frame_; |
+ bool old_constant_pool_available_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(FrameAndConstantPoolScope); |
+}; |
+ |
+// Class for scoping the the unavailability of constant pool access. |
+class ConstantPoolUnavailableScope { |
+ public: |
+ explicit ConstantPoolUnavailableScope(MacroAssembler* masm) |
+ : masm_(masm), |
+ old_constant_pool_available_(FLAG_enable_ool_constant_pool && |
+ masm->is_ool_constant_pool_available()) { |
+ if (FLAG_enable_ool_constant_pool) { |
+ masm_->set_ool_constant_pool_available(false); |
+ } |
+ } |
+ ~ConstantPoolUnavailableScope() { |
+ if (FLAG_enable_ool_constant_pool) { |
+ masm_->set_ool_constant_pool_available(old_constant_pool_available_); |
+ } |
+ } |
+ |
+ private: |
+ MacroAssembler* masm_; |
+ int old_constant_pool_available_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ConstantPoolUnavailableScope); |
+}; |
+ |
class AllowExternalCallThatCantCauseGC: public FrameScope { |
public: |