mirror of
https://github.com/Z3Prover/z3
synced 2025-04-25 10:05:32 +00:00
fix exception safety in pdd-solver
This commit is contained in:
parent
c9c5dbc347
commit
3fa67777e5
5 changed files with 147 additions and 152 deletions
|
@ -62,6 +62,10 @@ namespace dd {
|
|||
init_nodes(level2var);
|
||||
}
|
||||
|
||||
void pdd_manager::set_max_num_nodes(unsigned n) {
|
||||
m_max_num_nodes = n + m_level2var.size();
|
||||
}
|
||||
|
||||
void pdd_manager::init_nodes(unsigned_vector const& l2v) {
|
||||
// add dummy nodes for operations, and 0, 1 pdds.
|
||||
for (unsigned i = 0; i < pdd_no_op; ++i) {
|
||||
|
@ -1352,9 +1356,8 @@ namespace dd {
|
|||
e->get_data().m_refcount = 0;
|
||||
}
|
||||
if (do_gc) {
|
||||
if (m_nodes.size() > m_max_num_nodes) {
|
||||
throw mem_out();
|
||||
}
|
||||
if (m_nodes.size() > m_max_num_nodes)
|
||||
throw mem_out();
|
||||
alloc_free_nodes(m_nodes.size()/2);
|
||||
}
|
||||
SASSERT(e->get_data().m_lo == n.m_lo);
|
||||
|
@ -1600,7 +1603,8 @@ namespace dd {
|
|||
for (unsigned i = m_nodes.size(); i-- > pdd_no_op; ) {
|
||||
if (!reachable[i]) {
|
||||
if (is_val(i)) {
|
||||
if (m_freeze_value == val(i)) continue;
|
||||
if (m_freeze_value == val(i))
|
||||
continue;
|
||||
m_free_values.push_back(m_mpq_table.find(val(i)).m_value_index);
|
||||
m_mpq_table.remove(val(i));
|
||||
}
|
||||
|
@ -1615,20 +1619,17 @@ namespace dd {
|
|||
|
||||
ptr_vector<op_entry> to_delete, to_keep;
|
||||
for (auto* e : m_op_cache) {
|
||||
if (e->m_result != null_pdd) {
|
||||
to_delete.push_back(e);
|
||||
}
|
||||
else {
|
||||
to_keep.push_back(e);
|
||||
}
|
||||
if (e->m_result != null_pdd)
|
||||
to_delete.push_back(e);
|
||||
else
|
||||
to_keep.push_back(e);
|
||||
}
|
||||
m_op_cache.reset();
|
||||
for (op_entry* e : to_delete) {
|
||||
for (op_entry* e : to_delete)
|
||||
m_alloc.deallocate(sizeof(*e), e);
|
||||
}
|
||||
for (op_entry* e : to_keep) {
|
||||
m_op_cache.insert(e);
|
||||
}
|
||||
|
||||
for (op_entry* e : to_keep)
|
||||
m_op_cache.insert(e);
|
||||
|
||||
m_factor_cache.reset();
|
||||
|
||||
|
|
|
@ -324,8 +324,9 @@ namespace dd {
|
|||
semantics get_semantics() const { return m_semantics; }
|
||||
|
||||
void reset(unsigned_vector const& level2var);
|
||||
void set_max_num_nodes(unsigned n) { m_max_num_nodes = n; }
|
||||
void set_max_num_nodes(unsigned n);
|
||||
unsigned_vector const& get_level2var() const { return m_level2var; }
|
||||
unsigned num_nodes() const { return m_nodes.size() - m_free_nodes.size(); }
|
||||
|
||||
pdd mk_var(unsigned i);
|
||||
pdd mk_val(rational const& r);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue