Fixed segfault / multiple free issue with lists

This commit is contained in:
Benedikt Tutzer 2018-08-23 13:57:37 +02:00
parent 0ecfffa69c
commit ba18e0f81a
1 changed files with 38 additions and 26 deletions

View File

@ -100,7 +100,7 @@ namespace YOSYS_PYTHON {
bool in_std_string(std::string rhs); bool in_std_string(std::string rhs);
//WRAPPED bool in(const pool<IdString> &rhs) const { return rhs.count(*this) != 0; } //WRAPPED bool in(const pool<IdString> &rhs) const { return rhs.count(*this) != 0; }
bool in_pool_IdString(boost::python::list *rhs); bool in_pool_IdString(boost::python::list rhs);
bool operator<(IdString rhs) { return get_cpp_obj() <rhs.get_cpp_obj(); } bool operator<(IdString rhs) { return get_cpp_obj() <rhs.get_cpp_obj(); }
@ -456,13 +456,13 @@ namespace YOSYS_PYTHON {
void remove2_SigSpec_SigSpec(SigSpec *pattern, SigSpec *other); void remove2_SigSpec_SigSpec(SigSpec *pattern, SigSpec *other);
//WRAPPED void remove(const pool<RTLIL::SigBit> &pattern); //WRAPPED void remove(const pool<RTLIL::SigBit> &pattern);
void remove_pool_SigBit(boost::python::list *pattern); void remove_pool_SigBit(boost::python::list pattern);
//WRAPPED void remove(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const; //WRAPPED void remove(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const;
void remove_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other); void remove_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other);
//WRAPPED void remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other); //WRAPPED void remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other);
void remove2_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other); void remove2_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other);
//WRAPPED void remove(int offset, int length = 1); //WRAPPED void remove(int offset, int length = 1);
void remove_int_int(int offset, int length = 1); void remove_int_int(int offset, int length = 1);
@ -471,7 +471,7 @@ namespace YOSYS_PYTHON {
SigSpec extract_SigSpec_SigSpec(SigSpec *pattern, SigSpec *other); SigSpec extract_SigSpec_SigSpec(SigSpec *pattern, SigSpec *other);
//WRAPPED RTLIL::SigSpec extract(const pool<RTLIL::SigBit> &pattern, const RTLIL::SigSpec *other = NULL) const; //WRAPPED RTLIL::SigSpec extract(const pool<RTLIL::SigBit> &pattern, const RTLIL::SigSpec *other = NULL) const;
SigSpec extract_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other); SigSpec extract_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other);
//WRAPPED RTLIL::SigSpec extract(int offset, int length = 1) const; //WRAPPED RTLIL::SigSpec extract(int offset, int length = 1) const;
SigSpec extract_int_int(int offset, int length = 1); SigSpec extract_int_int(int offset, int length = 1);
@ -760,7 +760,7 @@ namespace YOSYS_PYTHON {
void connect_SigSpec_SigSpec(SigSpec *lhs, SigSpec *rhs); void connect_SigSpec_SigSpec(SigSpec *lhs, SigSpec *rhs);
//WRAPPED void new_connections(const std::vector<RTLIL::SigSig> &new_conn); //WRAPPED void new_connections(const std::vector<RTLIL::SigSig> &new_conn);
void new_connections(boost::python::list *new_conn); void new_connections(boost::python::list new_conn);
//WRAPPED void cloneInto(RTLIL::Module *new_mod) const; //WRAPPED void cloneInto(RTLIL::Module *new_mod) const;
void cloneInto(Module *new_mod); void cloneInto(Module *new_mod);
@ -784,7 +784,7 @@ namespace YOSYS_PYTHON {
Cell cell(IdString *id); Cell cell(IdString *id);
//WRAPPED void remove(const pool<RTLIL::Wire*> &wires); //WRAPPED void remove(const pool<RTLIL::Wire*> &wires);
void remove_pool_Wire(boost::python::list *wires); void remove_pool_Wire(boost::python::list wires);
//WRAPPED void remove(RTLIL::Cell *cell); //WRAPPED void remove(RTLIL::Cell *cell);
void remove_Cell(Cell *cell); void remove_Cell(Cell *cell);
@ -1573,8 +1573,6 @@ namespace YOSYS_PYTHON {
Yosys::RTLIL::IdString *tmp_port = new Yosys::RTLIL::IdString(port); Yosys::RTLIL::IdString *tmp_port = new Yosys::RTLIL::IdString(port);
Yosys::RTLIL::SigSpec *tmp_old_sig = new Yosys::RTLIL::SigSpec(old_sig); Yosys::RTLIL::SigSpec *tmp_old_sig = new Yosys::RTLIL::SigSpec(old_sig);
py_notify_connect_cell(Cell(cell), IdString(tmp_port), SigSpec(tmp_old_sig), SigSpec(&sig)); py_notify_connect_cell(Cell(cell), IdString(tmp_port), SigSpec(tmp_old_sig), SigSpec(&sig));
delete tmp_port;
delete tmp_old_sig;
} }
virtual void notify_connect(Yosys::RTLIL::Module *module, const Yosys::RTLIL::SigSig &sigsig) YS_OVERRIDE virtual void notify_connect(Yosys::RTLIL::Module *module, const Yosys::RTLIL::SigSig &sigsig) YS_OVERRIDE
@ -1582,15 +1580,13 @@ namespace YOSYS_PYTHON {
Yosys::RTLIL::SigSpec *first = new Yosys::RTLIL::SigSpec(sigsig.first); Yosys::RTLIL::SigSpec *first = new Yosys::RTLIL::SigSpec(sigsig.first);
Yosys::RTLIL::SigSpec *second = new Yosys::RTLIL::SigSpec(sigsig.second); Yosys::RTLIL::SigSpec *second = new Yosys::RTLIL::SigSpec(sigsig.second);
py_notify_connect_tuple(Module(module), boost::python::make_tuple(SigSpec(first), SigSpec(second))); py_notify_connect_tuple(Module(module), boost::python::make_tuple(SigSpec(first), SigSpec(second)));
delete first;
delete second;
} }
virtual void notify_connect(Yosys::RTLIL::Module *module, const std::vector<Yosys::RTLIL::SigSig> &sigsig_vec) YS_OVERRIDE virtual void notify_connect(Yosys::RTLIL::Module *module, const std::vector<Yosys::RTLIL::SigSig> &sigsig_vec) YS_OVERRIDE
{ {
boost::python::list sigsig_list; boost::python::list sigsig_list;
for(auto sigsig : sigsig_vec) for(auto sigsig : sigsig_vec)
sigsig_list.append(boost::python::make_tuple(SigSpec(&sigsig.first), SigSpec(&sigsig.second))); sigsig_list.append(boost::python::make_tuple(*(new SigSpec(&sigsig.first)), *(new SigSpec(&sigsig.second))));
py_notify_connect_list(Module(module), sigsig_list); py_notify_connect_list(Module(module), sigsig_list);
} }
@ -1818,11 +1814,13 @@ namespace YOSYS_PYTHON {
} }
//WRAPPED bool in(const pool<IdString> &rhs) const { return rhs.count(*this) != 0; } FROM FILE kernel/rtlil.h //WRAPPED bool in(const pool<IdString> &rhs) const { return rhs.count(*this) != 0; } FROM FILE kernel/rtlil.h
bool IdString::in_pool_IdString(boost::python::list *rhs) bool IdString::in_pool_IdString(boost::python::list rhs)
{ {
pool<Yosys::RTLIL::IdString> rhs_; pool<Yosys::RTLIL::IdString> rhs_;
for(int i = 0; i < len(*rhs); ++i) while(len(rhs) > 0)
{ {
IdString tmp = boost::python::extract<IdString>(rhs.pop());
rhs_.insert(*tmp.get_cpp_obj());
} }
return this->get_cpp_obj()->in(rhs_); return this->get_cpp_obj()->in(rhs_);
} }
@ -1990,31 +1988,37 @@ namespace YOSYS_PYTHON {
} }
//WRAPPED void remove(const pool<RTLIL::SigBit> &pattern); FROM FILE kernel/rtlil.h //WRAPPED void remove(const pool<RTLIL::SigBit> &pattern); FROM FILE kernel/rtlil.h
void SigSpec::remove_pool_SigBit(boost::python::list *pattern) void SigSpec::remove_pool_SigBit(boost::python::list pattern)
{ {
pool<Yosys::RTLIL::SigBit> pattern_; pool<Yosys::RTLIL::SigBit> pattern_;
for(int i = 0; i < len(*pattern); ++i) while(len(pattern) > 0)
{ {
SigBit tmp = boost::python::extract<SigBit>(pattern.pop());
pattern_.insert(*tmp.get_cpp_obj());
} }
this->get_cpp_obj()->remove(pattern_); this->get_cpp_obj()->remove(pattern_);
} }
//WRAPPED void remove(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const; FROM FILE kernel/rtlil.h //WRAPPED void remove(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const; FROM FILE kernel/rtlil.h
void SigSpec::remove_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other) void SigSpec::remove_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other)
{ {
pool<Yosys::RTLIL::SigBit> pattern_; pool<Yosys::RTLIL::SigBit> pattern_;
for(int i = 0; i < len(*pattern); ++i) while(len(pattern) > 0)
{ {
SigBit tmp = boost::python::extract<SigBit>(pattern.pop());
pattern_.insert(*tmp.get_cpp_obj());
} }
this->get_cpp_obj()->remove(pattern_, other->get_cpp_obj()); this->get_cpp_obj()->remove(pattern_, other->get_cpp_obj());
} }
//WRAPPED void remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other); FROM FILE kernel/rtlil.h //WRAPPED void remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other); FROM FILE kernel/rtlil.h
void SigSpec::remove2_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other) void SigSpec::remove2_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other)
{ {
pool<Yosys::RTLIL::SigBit> pattern_; pool<Yosys::RTLIL::SigBit> pattern_;
for(int i = 0; i < len(*pattern); ++i) while(len(pattern) > 0)
{ {
SigBit tmp = boost::python::extract<SigBit>(pattern.pop());
pattern_.insert(*tmp.get_cpp_obj());
} }
this->get_cpp_obj()->remove2(pattern_, other->get_cpp_obj()); this->get_cpp_obj()->remove2(pattern_, other->get_cpp_obj());
} }
@ -2032,11 +2036,13 @@ namespace YOSYS_PYTHON {
} }
//WRAPPED RTLIL::SigSpec extract(const pool<RTLIL::SigBit> &pattern, const RTLIL::SigSpec *other = NULL) const; FROM FILE kernel/rtlil.h //WRAPPED RTLIL::SigSpec extract(const pool<RTLIL::SigBit> &pattern, const RTLIL::SigSpec *other = NULL) const; FROM FILE kernel/rtlil.h
SigSpec SigSpec::extract_pool_SigBit_SigSpec(boost::python::list *pattern, SigSpec *other) SigSpec SigSpec::extract_pool_SigBit_SigSpec(boost::python::list pattern, SigSpec *other)
{ {
pool<Yosys::RTLIL::SigBit> pattern_; pool<Yosys::RTLIL::SigBit> pattern_;
for(int i = 0; i < len(*pattern); ++i) while(len(pattern) > 0)
{ {
SigBit tmp = boost::python::extract<SigBit>(pattern.pop());
pattern_.insert(*tmp.get_cpp_obj());
} }
return SigSpec(this->get_cpp_obj()->extract(pattern_, other->get_cpp_obj())); return SigSpec(this->get_cpp_obj()->extract(pattern_, other->get_cpp_obj()));
} }
@ -2317,11 +2323,15 @@ namespace YOSYS_PYTHON {
} }
//WRAPPED void new_connections(const std::vector<RTLIL::SigSig> &new_conn); FROM FILE kernel/rtlil.h //WRAPPED void new_connections(const std::vector<RTLIL::SigSig> &new_conn); FROM FILE kernel/rtlil.h
void Module::new_connections(boost::python::list *new_conn) void Module::new_connections(boost::python::list new_conn)
{ {
std::vector<Yosys::RTLIL::SigSig> new_conn_; std::vector<Yosys::RTLIL::SigSig> new_conn_;
for(int i = 0; i < len(*new_conn); ++i) while(len(new_conn) > 0)
{ {
boost::python::tuple tmp1 = boost::python::extract<boost::python::tuple>(new_conn.pop());
SigSpec tmp2 = boost::python::extract<SigSpec>(tmp1[0]);
SigSpec tmp3 = boost::python::extract<SigSpec>(tmp1[1]);
new_conn_.push_back(Yosys::RTLIL::SigSig(*tmp2.get_cpp_obj(), *tmp3.get_cpp_obj()));
} }
this->get_cpp_obj()->new_connections(new_conn_); this->get_cpp_obj()->new_connections(new_conn_);
} }
@ -2369,11 +2379,13 @@ namespace YOSYS_PYTHON {
} }
//WRAPPED void remove(const pool<RTLIL::Wire*> &wires); FROM FILE kernel/rtlil.h //WRAPPED void remove(const pool<RTLIL::Wire*> &wires); FROM FILE kernel/rtlil.h
void Module::remove_pool_Wire(boost::python::list *wires) void Module::remove_pool_Wire(boost::python::list wires)
{ {
pool<Yosys::RTLIL::Wire*> wires_; pool<Yosys::RTLIL::Wire*> wires_;
for(int i = 0; i < len(*wires); ++i) while(len(wires) > 0)
{ {
Wire tmp = boost::python::extract<Wire>(wires.pop());
wires_.insert(tmp.get_cpp_obj());
} }
this->get_cpp_obj()->remove(wires_); this->get_cpp_obj()->remove(wires_);
} }