diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2019-11-09 15:32:15 -0500 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2019-11-09 16:10:14 -0500 |
commit | d267384837d6bdd12ebff16162750d38803f6287 (patch) | |
tree | e361aa86f4fa1e4f80f74167a89268fe4719b22d /src/emu | |
parent | edb7eb0bf0582f984f2e035a4c96f728f92c8a63 (diff) |
Make many device_execute_interface functions noexcept, including the "information" overrides. This also covers several time-related functions in attotime, running_machine and emu_timer. (nw)
m6805: Calculate min_cycles and max_cycles once at device_start time (Nw)
attotime: Add as_khz and as_mhz (nw)
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/attotime.h | 48 | ||||
-rw-r--r-- | src/emu/diexec.cpp | 20 | ||||
-rw-r--r-- | src/emu/diexec.h | 32 | ||||
-rw-r--r-- | src/emu/emucore.h | 8 | ||||
-rw-r--r-- | src/emu/machine.h | 2 | ||||
-rw-r--r-- | src/emu/schedule.cpp | 6 | ||||
-rw-r--r-- | src/emu/schedule.h | 12 |
7 files changed, 69 insertions, 59 deletions
diff --git a/src/emu/attotime.h b/src/emu/attotime.h index cad95177724..945ed78a87a 100644 --- a/src/emu/attotime.h +++ b/src/emu/attotime.h @@ -91,15 +91,15 @@ class attotime { public: // construction/destruction - constexpr attotime() : m_seconds(0), m_attoseconds(0) { } + constexpr attotime() noexcept : m_seconds(0), m_attoseconds(0) { } /** Constructs with @p secs seconds and @p attos attoseconds. */ - constexpr attotime(seconds_t secs, attoseconds_t attos) : m_seconds(secs), m_attoseconds(attos) { } + constexpr attotime(seconds_t secs, attoseconds_t attos) noexcept : m_seconds(secs), m_attoseconds(attos) { } - constexpr attotime(const attotime& that) : m_seconds(that.m_seconds), m_attoseconds(that.m_attoseconds) { } + constexpr attotime(const attotime& that) noexcept : m_seconds(that.m_seconds), m_attoseconds(that.m_attoseconds) { } // assignment - attotime& operator=(const attotime& that) + attotime &operator=(const attotime& that) noexcept { this->m_seconds = that.m_seconds; this->m_attoseconds = that.m_attoseconds; @@ -107,23 +107,25 @@ public: } // queries - constexpr bool is_zero() const { return (m_seconds == 0 && m_attoseconds == 0); } + constexpr bool is_zero() const noexcept { return (m_seconds == 0 && m_attoseconds == 0); } /** Test if value is above @ref ATTOTIME_MAX_SECONDS (considered an overflow) */ - constexpr bool is_never() const { return (m_seconds >= ATTOTIME_MAX_SECONDS); } + constexpr bool is_never() const noexcept { return (m_seconds >= ATTOTIME_MAX_SECONDS); } // conversion to other forms - constexpr double as_double() const { return double(m_seconds) + ATTOSECONDS_TO_DOUBLE(m_attoseconds); } - constexpr attoseconds_t as_attoseconds() const; + constexpr double as_double() const noexcept { return double(m_seconds) + ATTOSECONDS_TO_DOUBLE(m_attoseconds); } + constexpr attoseconds_t as_attoseconds() const noexcept; constexpr double as_hz() const { return m_seconds == 0 ? ATTOSECONDS_TO_HZ(m_attoseconds) : is_never() ? 0.0 : 1.0 / as_double(); } + constexpr double as_khz() const { return m_seconds == 0 ? double(ATTOSECONDS_PER_MILLISECOND) / double(m_attoseconds) : is_never() ? 0.0 : 1e-3 / as_double(); } + constexpr double as_mhz() const { return m_seconds == 0 ? double(ATTOSECONDS_PER_MICROSECOND) / double(m_attoseconds) : is_never() ? 0.0 : 1e-6 / as_double(); } u64 as_ticks(u32 frequency) const; u64 as_ticks(const XTAL &xtal) const { return as_ticks(xtal.value()); } /** Convert to string using at @p precision */ const char *as_string(int precision = 9) const; /** @return the attoseconds portion. */ - constexpr attoseconds_t attoseconds() const { return m_attoseconds; } + constexpr attoseconds_t attoseconds() const noexcept { return m_attoseconds; } /** @return the seconds portion. */ - constexpr seconds_t seconds() const { return m_seconds; } + constexpr seconds_t seconds() const noexcept { return m_seconds; } static attotime from_double(double _time); static attotime from_ticks(u64 ticks, u32 frequency); @@ -154,8 +156,8 @@ public: } // math - attotime &operator+=(const attotime &right); - attotime &operator-=(const attotime &right); + attotime &operator+=(const attotime &right) noexcept; + attotime &operator-=(const attotime &right) noexcept; attotime &operator*=(u32 factor); attotime &operator/=(u32 factor); @@ -175,7 +177,7 @@ public: //************************************************************************** /** handle addition between two attotimes */ -inline attotime operator+(const attotime &left, const attotime &right) +inline attotime operator+(const attotime &left, const attotime &right) noexcept { attotime result; @@ -200,7 +202,7 @@ inline attotime operator+(const attotime &left, const attotime &right) return result; } -inline attotime &attotime::operator+=(const attotime &right) +inline attotime &attotime::operator+=(const attotime &right) noexcept { // if one of the items is never, return never if (this->m_seconds >= ATTOTIME_MAX_SECONDS || right.m_seconds >= ATTOTIME_MAX_SECONDS) @@ -225,7 +227,7 @@ inline attotime &attotime::operator+=(const attotime &right) /** handle subtraction between two attotimes */ -inline attotime operator-(const attotime &left, const attotime &right) +inline attotime operator-(const attotime &left, const attotime &right) noexcept { attotime result; @@ -246,7 +248,7 @@ inline attotime operator-(const attotime &left, const attotime &right) return result; } -inline attotime &attotime::operator-=(const attotime &right) +inline attotime &attotime::operator-=(const attotime &right) noexcept { // if time1 is never, return never if (this->m_seconds >= ATTOTIME_MAX_SECONDS) @@ -291,39 +293,39 @@ inline attotime operator/(const attotime &left, u32 factor) /** handle comparisons between attotimes */ -inline constexpr bool operator==(const attotime &left, const attotime &right) +inline constexpr bool operator==(const attotime &left, const attotime &right) noexcept { return (left.m_seconds == right.m_seconds && left.m_attoseconds == right.m_attoseconds); } -inline constexpr bool operator!=(const attotime &left, const attotime &right) +inline constexpr bool operator!=(const attotime &left, const attotime &right) noexcept { return (left.m_seconds != right.m_seconds || left.m_attoseconds != right.m_attoseconds); } -inline constexpr bool operator<(const attotime &left, const attotime &right) +inline constexpr bool operator<(const attotime &left, const attotime &right) noexcept { return (left.m_seconds < right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds < right.m_attoseconds)); } -inline constexpr bool operator<=(const attotime &left, const attotime &right) +inline constexpr bool operator<=(const attotime &left, const attotime &right) noexcept { return (left.m_seconds < right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds <= right.m_attoseconds)); } -inline constexpr bool operator>(const attotime &left, const attotime &right) +inline constexpr bool operator>(const attotime &left, const attotime &right) noexcept { return (left.m_seconds > right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds > right.m_attoseconds)); } -inline constexpr bool operator>=(const attotime &left, const attotime &right) +inline constexpr bool operator>=(const attotime &left, const attotime &right) noexcept { return (left.m_seconds > right.m_seconds || (left.m_seconds == right.m_seconds && left.m_attoseconds >= right.m_attoseconds)); } /** Convert to an attoseconds value, clamping to +/- 1 second */ -inline constexpr attoseconds_t attotime::as_attoseconds() const +inline constexpr attoseconds_t attotime::as_attoseconds() const noexcept { return (m_seconds == 0) ? m_attoseconds : // positive values between 0 and 1 second diff --git a/src/emu/diexec.cpp b/src/emu/diexec.cpp index 4df8bb33493..a3a042b4d32 100644 --- a/src/emu/diexec.cpp +++ b/src/emu/diexec.cpp @@ -92,7 +92,7 @@ device_execute_interface::~device_execute_interface() // run before we run again //------------------------------------------------- -void device_execute_interface::abort_timeslice() +void device_execute_interface::abort_timeslice() noexcept(MAME_NDEBUG) { // ignore if not the executing device if (!executing()) @@ -207,7 +207,7 @@ void device_execute_interface::trigger(int trigid) // for a device //------------------------------------------------- -attotime device_execute_interface::local_time() const +attotime device_execute_interface::local_time() const noexcept(MAME_NDEBUG) { // if we're active, add in the time from the current slice if (executing()) @@ -225,7 +225,7 @@ attotime device_execute_interface::local_time() const // cycles executed on this device //------------------------------------------------- -u64 device_execute_interface::total_cycles() const +u64 device_execute_interface::total_cycles() const noexcept(MAME_NDEBUG) { if (executing()) { @@ -242,7 +242,7 @@ u64 device_execute_interface::total_cycles() const // of clocks to cycles, rounding down if necessary //------------------------------------------------- -u64 device_execute_interface::execute_clocks_to_cycles(u64 clocks) const +u64 device_execute_interface::execute_clocks_to_cycles(u64 clocks) const noexcept { return clocks; } @@ -253,7 +253,7 @@ u64 device_execute_interface::execute_clocks_to_cycles(u64 clocks) const // of cycles to clocks, rounding down if necessary //------------------------------------------------- -u64 device_execute_interface::execute_cycles_to_clocks(u64 cycles) const +u64 device_execute_interface::execute_cycles_to_clocks(u64 cycles) const noexcept { return cycles; } @@ -265,7 +265,7 @@ u64 device_execute_interface::execute_cycles_to_clocks(u64 cycles) const // operation can take //------------------------------------------------- -u32 device_execute_interface::execute_min_cycles() const +u32 device_execute_interface::execute_min_cycles() const noexcept { return 1; } @@ -277,7 +277,7 @@ u32 device_execute_interface::execute_min_cycles() const // operation can take //------------------------------------------------- -u32 device_execute_interface::execute_max_cycles() const +u32 device_execute_interface::execute_max_cycles() const noexcept { return 1; } @@ -288,7 +288,7 @@ u32 device_execute_interface::execute_max_cycles() const // of input lines for the device //------------------------------------------------- -u32 device_execute_interface::execute_input_lines() const +u32 device_execute_interface::execute_input_lines() const noexcept { return 0; } @@ -299,7 +299,7 @@ u32 device_execute_interface::execute_input_lines() const // IRQ vector when an acknowledge is processed //------------------------------------------------- -u32 device_execute_interface::execute_default_irq_vector(int linenum) const +u32 device_execute_interface::execute_default_irq_vector(int linenum) const noexcept { return 0; } @@ -310,7 +310,7 @@ u32 device_execute_interface::execute_default_irq_vector(int linenum) const // the input line has an asynchronous edge trigger //------------------------------------------------- -bool device_execute_interface::execute_input_edge_triggered(int linenum) const +bool device_execute_interface::execute_input_edge_triggered(int linenum) const noexcept { return false; } diff --git a/src/emu/diexec.h b/src/emu/diexec.h index 056033b95c6..565d89c6da2 100644 --- a/src/emu/diexec.h +++ b/src/emu/diexec.h @@ -152,12 +152,12 @@ public: } // execution management - device_scheduler &scheduler() const { assert(m_scheduler != nullptr); return *m_scheduler; } - bool executing() const { return scheduler().currently_executing() == this; } - s32 cycles_remaining() const { return executing() ? *m_icountptr : 0; } // cycles remaining in this timeslice - void eat_cycles(int cycles) { if (executing()) *m_icountptr = (cycles > *m_icountptr) ? 0 : (*m_icountptr - cycles); } - void adjust_icount(int delta) { if (executing()) *m_icountptr += delta; } - void abort_timeslice(); + device_scheduler &scheduler() const noexcept(MAME_NDEBUG) { assert(m_scheduler != nullptr); return *m_scheduler; } + bool executing() const noexcept(MAME_NDEBUG) { return scheduler().currently_executing() == this; } + s32 cycles_remaining() const noexcept(MAME_NDEBUG) { return executing() ? *m_icountptr : 0; } // cycles remaining in this timeslice + void eat_cycles(int cycles) noexcept(MAME_NDEBUG) { if (executing()) *m_icountptr = (cycles > *m_icountptr) ? 0 : (*m_icountptr - cycles); } + void adjust_icount(int delta) noexcept(MAME_NDEBUG) { if (executing()) *m_icountptr += delta; } + void abort_timeslice() noexcept(MAME_NDEBUG); // input and interrupt management void set_input_line(int linenum, int state) { m_input[linenum].set_state_synced(state); } @@ -170,7 +170,7 @@ public: // suspend/resume void suspend(u32 reason, bool eatcycles); void resume(u32 reason); - bool suspended(u32 reason = SUSPEND_ANY_REASON) const { return (m_nextsuspend & reason) != 0; } + bool suspended(u32 reason = SUSPEND_ANY_REASON) const noexcept { return (m_nextsuspend & reason) != 0; } void yield() { suspend(SUSPEND_REASON_TIMESLICE, false); } void spin() { suspend(SUSPEND_REASON_TIMESLICE, true); } void spin_until_trigger(int trigid) { suspend_until_trigger(trigid, true); } @@ -183,8 +183,8 @@ public: void signal_interrupt_trigger() { trigger(m_inttrigger); } // time and cycle accounting - attotime local_time() const; - u64 total_cycles() const; + attotime local_time() const noexcept(MAME_NDEBUG); + u64 total_cycles() const noexcept(MAME_NDEBUG); // required operation overrides void run() { execute_run(); } @@ -195,15 +195,15 @@ public: protected: // clock and cycle information getters - virtual u64 execute_clocks_to_cycles(u64 clocks) const; - virtual u64 execute_cycles_to_clocks(u64 cycles) const; - virtual u32 execute_min_cycles() const; - virtual u32 execute_max_cycles() const; + virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept; + virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept; + virtual u32 execute_min_cycles() const noexcept; + virtual u32 execute_max_cycles() const noexcept; // input line information getters - virtual u32 execute_input_lines() const; - virtual u32 execute_default_irq_vector(int linenum) const; - virtual bool execute_input_edge_triggered(int linenum) const; + virtual u32 execute_input_lines() const noexcept; + virtual u32 execute_default_irq_vector(int linenum) const noexcept; + virtual bool execute_input_edge_triggered(int linenum) const noexcept; // optional operation overrides virtual void execute_run() = 0; diff --git a/src/emu/emucore.h b/src/emu/emucore.h index ef6713c8d8f..530227ad692 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -237,6 +237,14 @@ template <typename T> constexpr auto DEGREE_TO_RADIAN(T const &x) { return (M_PI #define ENDIAN_VALUE_NE_NNE(endian,neval,nneval) (((endian) == ENDIANNESS_NATIVE) ? (neval) : (nneval)) +// useful for declaring functions with asserts as conditionally noexcept +#ifdef NDEBUG +constexpr bool MAME_NDEBUG = true; +#else +constexpr bool MAME_NDEBUG = false; +#endif + + //************************************************************************** // EXCEPTION CLASSES //************************************************************************** diff --git a/src/emu/machine.h b/src/emu/machine.h index 8d151bc0c92..a3be1a81f4c 100644 --- a/src/emu/machine.h +++ b/src/emu/machine.h @@ -206,7 +206,7 @@ public: // additional helpers emu_options &options() const { return m_config.options(); } - attotime time() const { return m_scheduler.time(); } + attotime time() const noexcept(MAME_NDEBUG) { return m_scheduler.time(); } bool scheduled_event_pending() const { return m_exit_pending || m_hard_reset_pending; } bool allow_logging() const { return !m_logerror_list.empty(); } diff --git a/src/emu/schedule.cpp b/src/emu/schedule.cpp index fbe9f667255..c35e41d0457 100644 --- a/src/emu/schedule.cpp +++ b/src/emu/schedule.cpp @@ -209,7 +209,7 @@ void emu_timer::adjust(attotime start_delay, s32 param, const attotime &period) // timer was started //------------------------------------------------- -attotime emu_timer::elapsed() const +attotime emu_timer::elapsed() const noexcept(MAME_NDEBUG) { return machine().time() - m_start; } @@ -220,7 +220,7 @@ attotime emu_timer::elapsed() const // remaining until the timer expires //------------------------------------------------- -attotime emu_timer::remaining() const +attotime emu_timer::remaining() const noexcept(MAME_NDEBUG) { attotime curtime = machine().time(); if (curtime >= m_expire) @@ -356,7 +356,7 @@ device_scheduler::~device_scheduler() // time - return the current time //------------------------------------------------- -attotime device_scheduler::time() const +attotime device_scheduler::time() const noexcept(MAME_NDEBUG) { // if we're currently in a callback, use the timer's expiration time as a base if (m_callback_timer != nullptr) diff --git a/src/emu/schedule.h b/src/emu/schedule.h index f5631a6f816..951bbb045eb 100644 --- a/src/emu/schedule.h +++ b/src/emu/schedule.h @@ -64,7 +64,7 @@ class emu_timer public: // getters emu_timer *next() const { return m_next; } - running_machine &machine() const { assert(m_machine != nullptr); return *m_machine; } + running_machine &machine() const noexcept(MAME_NDEBUG) { assert(m_machine != nullptr); return *m_machine; } bool enabled() const { return m_enabled; } int param() const { return m_param; } void *ptr() const { return m_ptr; } @@ -79,8 +79,8 @@ public: void adjust(attotime start_delay, s32 param = 0, const attotime &periodicity = attotime::never); // timing queries - attotime elapsed() const; - attotime remaining() const; + attotime elapsed() const noexcept(MAME_NDEBUG); + attotime remaining() const noexcept(MAME_NDEBUG); attotime start() const { return m_start; } attotime expire() const { return m_expire; } attotime period() const { return m_period; } @@ -121,10 +121,10 @@ public: ~device_scheduler(); // getters - running_machine &machine() const { return m_machine; } - attotime time() const; + running_machine &machine() const noexcept { return m_machine; } + attotime time() const noexcept(MAME_NDEBUG); emu_timer *first_timer() const { return m_timer_list; } - device_execute_interface *currently_executing() const { return m_executing_device; } + device_execute_interface *currently_executing() const noexcept { return m_executing_device; } bool can_save() const; // execution |