< prev index next >

src/share/vm/c1/c1_CodeStubs.hpp

Print this page

        

*** 300,331 **** class MonitorAccessStub: public CodeStub { protected: LIR_Opr _obj_reg; LIR_Opr _lock_reg; public: ! MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg) { _obj_reg = obj_reg; _lock_reg = lock_reg; } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); } #endif // PRODUCT }; class MonitorEnterStub: public MonitorAccessStub { - private: - CodeEmitInfo* _info; - public: MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info); virtual void emit_code(LIR_Assembler* e); - virtual CodeEmitInfo* info() const { return _info; } virtual void visit(LIR_OpVisitState* visitor) { visitor->do_input(_obj_reg); visitor->do_input(_lock_reg); visitor->do_slow_case(_info); } --- 300,330 ---- class MonitorAccessStub: public CodeStub { protected: LIR_Opr _obj_reg; LIR_Opr _lock_reg; + CodeEmitInfo* _info; public: ! MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info) { _obj_reg = obj_reg; _lock_reg = lock_reg; + _info = (info != NULL) ? new CodeEmitInfo(info) : NULL; } + virtual CodeEmitInfo* info() const { return _info; } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); } #endif // PRODUCT }; class MonitorEnterStub: public MonitorAccessStub { public: MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info); virtual void emit_code(LIR_Assembler* e); virtual void visit(LIR_OpVisitState* visitor) { visitor->do_input(_obj_reg); visitor->do_input(_lock_reg); visitor->do_slow_case(_info); }
*** 339,359 **** private: bool _compute_lock; int _monitor_ix; public: ! MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix) ! : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg), _compute_lock(compute_lock), _monitor_ix(monitor_ix) { } virtual void emit_code(LIR_Assembler* e); virtual void visit(LIR_OpVisitState* visitor) { assert(_obj_reg->is_illegal(), "unused"); if (_compute_lock) { visitor->do_temp(_lock_reg); } else { visitor->do_input(_lock_reg); } } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); } #endif // PRODUCT }; --- 338,367 ---- private: bool _compute_lock; int _monitor_ix; public: ! MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix, CodeEmitInfo* info) ! : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg, info), _compute_lock(compute_lock), _monitor_ix(monitor_ix) { } virtual void emit_code(LIR_Assembler* e); virtual void visit(LIR_OpVisitState* visitor) { assert(_obj_reg->is_illegal(), "unused"); if (_compute_lock) { visitor->do_temp(_lock_reg); } else { visitor->do_input(_lock_reg); } + /* Do NOT call this, we don't need it to emit non-safepoint debug info. + * This makes the compiler assume there is a safepoint associated with + * this stub, but there's not. It causes C1 crashes in Eclipse and other + * OSGi applications. + + if (_info != NULL) { + visitor->do_slow_case(_info); + } + */ } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); } #endif // PRODUCT };
< prev index next >