diff --git a/libdevcore/Common.cpp b/libdevcore/Common.cpp index e33936102..5450f9311 100644 --- a/libdevcore/Common.cpp +++ b/libdevcore/Common.cpp @@ -32,10 +32,13 @@ char const* Version = "0.9.27"; const u256 UndefinedU256 = ~(u256)0; -void HasInvariants::checkInvariants() const +void InvariantChecker::checkInvariants() const { - if (!invariants()) - BOOST_THROW_EXCEPTION(FailedInvariant()); + if (!m_this->invariants()) + { + cwarn << "Invariant failed in" << m_function << "at" << m_file << ":" << m_line; + ::boost::exception_detail::throw_exception_(FailedInvariant(), m_function, m_file, m_line); + } } struct TimerChannel: public LogChannel { static const char* name(); static const int verbosity = 0; }; diff --git a/libdevcore/Common.h b/libdevcore/Common.h index f1d35bbc7..a3ab374a6 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -163,10 +163,6 @@ private: class HasInvariants { public: - /// Check invariants are met, throw if not. - void checkInvariants() const; - -protected: /// Reimplement to specify the invariants. virtual bool invariants() const = 0; }; @@ -175,16 +171,22 @@ protected: class InvariantChecker { public: - InvariantChecker(HasInvariants* _this): m_this(_this) { m_this->checkInvariants(); } - ~InvariantChecker() { m_this->checkInvariants(); } + InvariantChecker(HasInvariants* _this, char const* _fn, char const* _file, int _line): m_this(_this), m_function(_fn), m_file(_file), m_line(_line) { checkInvariants(); } + ~InvariantChecker() { checkInvariants(); } private: + /// Check invariants are met, throw if not. + void checkInvariants() const; + HasInvariants const* m_this; + char const* m_function; + char const* m_file; + int m_line; }; /// Scope guard for invariant check in a class derived from HasInvariants. #if ETH_DEBUG -#define DEV_INVARIANT_CHECK { ::dev::InvariantChecker __dev_invariantCheck(this); } +#define DEV_INVARIANT_CHECK { ::dev::InvariantChecker __dev_invariantCheck(this, BOOST_THROW_EXCEPTION_CURRENT_FUNCTION, __FILE__, __LINE__); } #else #define DEV_INVARIANT_CHECK (void)0; #endif