| Index: src/macro-assembler.h
|
| diff --git a/src/macro-assembler.h b/src/macro-assembler.h
|
| index 54cebca90f879fed0bb4e74aa737014704b6bbd4..87dd3cdc1d7622b2de2ccaf8855a4b364722c19d 100644
|
| --- a/src/macro-assembler.h
|
| +++ b/src/macro-assembler.h
|
| @@ -124,6 +124,68 @@ 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_(masm->is_ool_constant_pool_available()) {
|
| + masm->set_has_frame(true);
|
| + 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_);
|
| + 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_(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:
|
|
|