mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
deal with memory leak during shutdown
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
cbc5aaad2c
commit
c0694ae33a
|
@ -493,6 +493,7 @@ cmd_context::~cmd_context() {
|
||||||
if (m_main_ctx) {
|
if (m_main_ctx) {
|
||||||
set_verbose_stream(std::cerr);
|
set_verbose_stream(std::cerr);
|
||||||
}
|
}
|
||||||
|
pop(m_scopes.size());
|
||||||
finalize_cmds();
|
finalize_cmds();
|
||||||
finalize_tactic_cmds();
|
finalize_tactic_cmds();
|
||||||
finalize_probes();
|
finalize_probes();
|
||||||
|
|
|
@ -18,6 +18,7 @@ Revision History:
|
||||||
--*/
|
--*/
|
||||||
#include "cmd_context/pdecl.h"
|
#include "cmd_context/pdecl.h"
|
||||||
#include "ast/datatype_decl_plugin.h"
|
#include "ast/datatype_decl_plugin.h"
|
||||||
|
#include "ast/ast_pp.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
using namespace format_ns;
|
using namespace format_ns;
|
||||||
|
|
||||||
|
@ -768,9 +769,8 @@ struct pdecl_manager::app_sort_info : public pdecl_manager::sort_info {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
out << "(" << m_decl->get_name();
|
out << "(" << m_decl->get_name();
|
||||||
for (unsigned i = 0; i < m_args.size(); i++) {
|
for (auto arg : m_args) {
|
||||||
out << " ";
|
m.display(out << " ", arg);
|
||||||
m.display(out, m_args[i]);
|
|
||||||
}
|
}
|
||||||
out << ")";
|
out << ")";
|
||||||
}
|
}
|
||||||
|
@ -782,8 +782,8 @@ struct pdecl_manager::app_sort_info : public pdecl_manager::sort_info {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ptr_buffer<format> b;
|
ptr_buffer<format> b;
|
||||||
for (unsigned i = 0; i < m_args.size(); i++)
|
for (auto arg : m_args)
|
||||||
b.push_back(m.pp(m_args[i]));
|
b.push_back(m.pp(arg));
|
||||||
return mk_seq1(m.m(), b.begin(), b.end(), f2f(), m_decl->get_name().str().c_str());
|
return mk_seq1(m.m(), b.begin(), b.end(), f2f(), m_decl->get_name().str().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -807,8 +807,8 @@ struct pdecl_manager::indexed_sort_info : public pdecl_manager::sort_info {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
out << "(_ " << m_decl->get_name();
|
out << "(_ " << m_decl->get_name();
|
||||||
for (unsigned i = 0; i < m_indices.size(); i++) {
|
for (auto idx : m_indices) {
|
||||||
out << " " << m_indices[i];
|
out << " " << idx;
|
||||||
}
|
}
|
||||||
out << ")";
|
out << ")";
|
||||||
}
|
}
|
||||||
|
@ -821,8 +821,8 @@ struct pdecl_manager::indexed_sort_info : public pdecl_manager::sort_info {
|
||||||
else {
|
else {
|
||||||
ptr_buffer<format> b;
|
ptr_buffer<format> b;
|
||||||
b.push_back(mk_string(m.m(), m_decl->get_name().str().c_str()));
|
b.push_back(mk_string(m.m(), m_decl->get_name().str().c_str()));
|
||||||
for (unsigned i = 0; i < m_indices.size(); i++)
|
for (auto idx : m_indices)
|
||||||
b.push_back(mk_unsigned(m.m(), m_indices[i]));
|
b.push_back(mk_unsigned(m.m(), idx));
|
||||||
return mk_seq1(m.m(), b.begin(), b.end(), f2f(), "_");
|
return mk_seq1(m.m(), b.begin(), b.end(), f2f(), "_");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -853,6 +853,15 @@ pdecl_manager::pdecl_manager(ast_manager & m):
|
||||||
pdecl_manager::~pdecl_manager() {
|
pdecl_manager::~pdecl_manager() {
|
||||||
dec_ref(m_list);
|
dec_ref(m_list);
|
||||||
reset_sort_info();
|
reset_sort_info();
|
||||||
|
for (auto const& kv : m_sort2psort) {
|
||||||
|
del_decl_core(kv.m_value);
|
||||||
|
TRACE("pdecl_manager", tout << "orphan: " << mk_pp(kv.m_key, m()) << "\n";);
|
||||||
|
}
|
||||||
|
for (auto* p : m_table) {
|
||||||
|
del_decl_core(p);
|
||||||
|
}
|
||||||
|
m_sort2psort.reset();
|
||||||
|
m_table.reset();
|
||||||
SASSERT(m_sort2psort.empty());
|
SASSERT(m_sort2psort.empty());
|
||||||
SASSERT(m_table.empty());
|
SASSERT(m_table.empty());
|
||||||
}
|
}
|
||||||
|
@ -946,13 +955,15 @@ void pdecl_manager::del_decl_core(pdecl * p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void pdecl_manager::del_decl(pdecl * p) {
|
void pdecl_manager::del_decl(pdecl * p) {
|
||||||
TRACE("register_psort", tout << "del psort "; p->display(tout); tout << "\n";);
|
TRACE("pdecl_manager", tout << "del psort "; p->display(tout); tout << "\n";);
|
||||||
if (p->is_psort()) {
|
if (p->is_psort()) {
|
||||||
psort * _p = static_cast<psort*>(p);
|
psort * _p = static_cast<psort*>(p);
|
||||||
if (_p->is_sort_wrapper())
|
if (_p->is_sort_wrapper()) {
|
||||||
m_sort2psort.erase(static_cast<psort_sort*>(_p)->get_sort());
|
m_sort2psort.erase(static_cast<psort_sort*>(_p)->get_sort());
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
m_table.erase(_p);
|
m_table.erase(_p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
del_decl_core(p);
|
del_decl_core(p);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue