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>
This commit is contained in:
@@ -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)
|
||||
@@ -85,6 +93,17 @@ currentModule()
|
||||
return _modules.back();
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
|
||||
@@ -116,6 +116,7 @@ class Module
|
||||
};
|
||||
|
||||
Module *currentModule();
|
||||
Module *newModuleChecked();
|
||||
Module *newModule();
|
||||
|
||||
void callbackModule(Module *m);
|
||||
|
||||
@@ -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())
|
||||
{}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user