diff options
author | Gabe Black <gabeblack@google.com> | 2018-08-23 00:41:22 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-09-26 00:01:02 +0000 |
commit | abb7d288e9e278a0e7428846909c2d5c790c5e3a (patch) | |
tree | 3421e0399198cacc53a9317350aeb47ecb310284 | |
parent | 5627f7c14e9dd7f056b7b9d83284aefa4e5e9a9d (diff) | |
download | gem5-abb7d288e9e278a0e7428846909c2d5c790c5e3a.tar.xz |
systemc: Use sc_assert to check the number of interfaces.
The sc_port code had been using the .at() function of the vector class,
but when that failed it threw an exception, and it was very difficult
to tell where the exception came from from how gem5 crashed. This
change switches to sc_assert (the systemc version of assert) which
makes the cause/location of failures much more obvious.
Change-Id: I1cd51c86f47b314be551c304b014c44cfa030175
Reviewed-on: https://gem5-review.googlesource.com/12262
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r-- | src/systemc/ext/core/sc_port.hh | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/systemc/ext/core/sc_port.hh b/src/systemc/ext/core/sc_port.hh index 73f5362b6..f9e50da2e 100644 --- a/src/systemc/ext/core/sc_port.hh +++ b/src/systemc/ext/core/sc_port.hh @@ -105,14 +105,44 @@ class sc_port_b : public sc_port_base virtual void bind(IF &i) { sc_port_base::bind(i); } virtual void bind(sc_port_b<IF> &p) { sc_port_base::bind(p); } - IF *operator -> () { return _interfaces.at(0); } - const IF *operator -> () const { return _interfaces.at(0); } + IF * + operator -> () + { + sc_assert(!_interfaces.empty()); + return _interfaces[0]; + } + const IF * + operator -> () const + { + sc_assert(!_interfaces.empty()); + return _interfaces[0]; + } - IF *operator [] (int n) { return _interfaces.at(n); } - const IF *operator [] (int n) const { return _interfaces.at(n); } + IF * + operator [] (int n) + { + sc_assert(_interfaces.size() > n); + return _interfaces[n]; + } + const IF * + operator [] (int n) const + { + sc_assert(_interfaces.size() > n); + return _interfaces[n]; + } - sc_interface *get_interface() { return _interfaces.at(0); } - const sc_interface *get_interface() const { return _interfaces.at(0); } + sc_interface * + get_interface() + { + sc_assert(!_interfaces.empty()); + return _interfaces[0]; + } + const sc_interface * + get_interface() const + { + sc_assert(!_interfaces.empty()); + return _interfaces[0]; + } protected: void before_end_of_elaboration() {} @@ -151,7 +181,12 @@ class sc_port_b : public sc_port_base private: std::vector<IF *> _interfaces; - sc_interface *_gem5Interface(int n) const { return _interfaces.at(n); } + sc_interface * + _gem5Interface(int n) const + { + sc_assert(_interfaces.size() > n); + return _interfaces[n]; + } void _gem5AddInterface(sc_interface *i) { |