diff options
author | Gabe Black <gabeblack@google.com> | 2018-08-22 19:24:18 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-09-25 23:57:06 +0000 |
commit | f17f15e57fa16c2ce7eb4c951165b4978d686f87 (patch) | |
tree | b3180c3996dd146c007f0c4d3270f8a46913e2a2 /src | |
parent | 46b85b66374f30af7e97254e45d534ef8a7a11ba (diff) | |
download | gem5-f17f15e57fa16c2ce7eb4c951165b4978d686f87.tar.xz |
systemc: If no sc_module_name was used, throw an error.
This is tested by the regression tests. Also make sure the handshake
which sets up instances of sc_module is cleaned up if we bail partway
through for some reason, for instance if an intermediate class throws
an exception as part of its constructor.
Change-Id: I89afe5f76832cc132aa2bb8f19916dea64546784
Reviewed-on: https://gem5-review.googlesource.com/12251
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/systemc/core/module.cc | 21 | ||||
-rw-r--r-- | src/systemc/core/module.hh | 1 | ||||
-rw-r--r-- | src/systemc/core/sc_module.cc | 2 |
3 files changed, 22 insertions, 2 deletions
diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc index b13b50d28..0c118e0c5 100644 --- a/src/systemc/core/module.cc +++ b/src/systemc/core/module.cc @@ -32,6 +32,7 @@ #include <cassert> #include "base/logging.hh" +#include "systemc/ext/utils/sc_report_handler.hh" namespace sc_gem5 { @@ -52,7 +53,14 @@ Module::Module(const char *name) : _name(name), _sc_mod(nullptr), _obj(nullptr) _new_module = this; } -Module::~Module() { allModules.remove(this); } +Module::~Module() +{ + if (_new_module == this) { + // Aborted module construction? + _new_module = nullptr; + } + allModules.remove(this); +} void Module::finish(Object *this_obj) @@ -86,6 +94,17 @@ currentModule() } Module * +newModuleChecked() +{ + if (!_new_module) { + SC_REPORT_ERROR("(E533) module name stack is empty: " + "did you forget to add a sc_module_name parameter to " + "your module constructor?", nullptr); + } + return _new_module; +} + +Module * newModule() { return _new_module; diff --git a/src/systemc/core/module.hh b/src/systemc/core/module.hh index e988b9667..e276dad19 100644 --- a/src/systemc/core/module.hh +++ b/src/systemc/core/module.hh @@ -116,6 +116,7 @@ class Module }; Module *currentModule(); +Module *newModuleChecked(); Module *newModule(); void callbackModule(Module *m); diff --git a/src/systemc/core/sc_module.cc b/src/systemc/core/sc_module.cc index 016b9edbe..c515aaf09 100644 --- a/src/systemc/core/sc_module.cc +++ b/src/systemc/core/sc_module.cc @@ -168,7 +168,7 @@ sc_module::get_child_events() const } sc_module::sc_module() : - sc_object(sc_gem5::newModule()->name()), + sc_object(sc_gem5::newModuleChecked()->name()), _gem5_module(sc_gem5::currentModule()) {} |