mirror of
https://github.com/Z3Prover/z3
synced 2026-02-10 02:50:55 +00:00
* Initial plan * Add [[nodiscard]] to AST factory functions and modernize iterator loops - Added [[nodiscard]] attribute to key factory functions in ast.h: - All mk_app() variants for creating application nodes - All mk_func_decl() variants for creating function declarations - All mk_const() variants for creating constants - All mk_sort() variants for creating sorts - mk_var() for creating variables - mk_quantifier(), mk_forall(), mk_exists(), mk_lambda() for quantifiers - mk_label(), mk_pattern() and related functions - Converted iterator loops to range-based for loops in: - src/util/region.cpp: pop_scope() - src/util/dec_ref_util.h: dec_ref_key_values(), dec_ref_keys(), dec_ref_values() - src/util/mpf.h: dispose() - src/util/numeral_buffer.h: reset() Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Modernize additional iterator loops to range-based for loops - Converted iterator loops to range-based for loops in: - src/api/api_ast_map.cpp: Z3_ast_map_keys() and Z3_ast_map_to_string() - src/api/c++/z3++.h: optimize copy constructor and add() method - src/opt/wmax.cpp: mk_assumptions() Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Revert changes to z3++.h for C++ version compatibility Revert the range-based for loop changes in src/api/c++/z3++.h to maintain compatibility with older C++ versions that users may rely on. The C++ API wrapper must support down-level C++ standards for backward compatibility. Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Trigger CI build [skip ci] is not used to ensure CI runs --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
146 lines
3.2 KiB
C++
146 lines
3.2 KiB
C++
/*++
|
|
Copyright (c) 2006 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
region.cpp
|
|
|
|
Abstract:
|
|
|
|
Region/Arena memory manager
|
|
|
|
Author:
|
|
|
|
Leonardo de Moura (leonardo) 2006-09-18.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "util/region.h"
|
|
|
|
#ifdef Z3DEBUG
|
|
|
|
void region::display_mem_stats(std::ostream & out) const {
|
|
out << "num. objects: " << m_chunks.size() << "\n";
|
|
}
|
|
|
|
void * region::allocate(size_t size) {
|
|
char * r = alloc_svect(char, size);
|
|
m_chunks.push_back(r);
|
|
return r;
|
|
}
|
|
|
|
void region::reset() {
|
|
for (auto* c : m_chunks)
|
|
dealloc_svect(c);
|
|
m_chunks.reset();
|
|
m_scopes.reset();
|
|
}
|
|
|
|
void region::pop_scope() {
|
|
unsigned old_size = m_scopes.back();
|
|
m_scopes.pop_back();
|
|
for (auto it = m_chunks.begin() + old_size; it != m_chunks.end(); ++it)
|
|
dealloc_svect(*it);
|
|
m_chunks.shrink(old_size);
|
|
}
|
|
|
|
|
|
#else
|
|
|
|
#include "util/tptr.h"
|
|
#include "util/debug.h"
|
|
#include "util/memory_manager.h"
|
|
#include "util/page.h"
|
|
|
|
inline void region::allocate_page() {
|
|
m_curr_page = allocate_default_page(m_curr_page, m_free_pages);
|
|
m_curr_ptr = m_curr_page;
|
|
m_curr_end_ptr = end_of_default_page(m_curr_page);
|
|
}
|
|
|
|
region::region() {
|
|
m_curr_page = nullptr;
|
|
m_curr_ptr = nullptr;
|
|
m_curr_end_ptr = nullptr;
|
|
m_free_pages = nullptr;
|
|
m_mark = nullptr;
|
|
allocate_page();
|
|
}
|
|
|
|
region::~region() {
|
|
del_pages(m_curr_page);
|
|
del_pages(m_free_pages);
|
|
}
|
|
|
|
void * region::allocate(size_t size) {
|
|
char * new_curr_ptr = m_curr_ptr + size;
|
|
if (new_curr_ptr < m_curr_end_ptr) {
|
|
char * result = m_curr_ptr;
|
|
m_curr_ptr = ALIGN(char *, new_curr_ptr);
|
|
return result;
|
|
}
|
|
else if (size < DEFAULT_PAGE_SIZE) {
|
|
allocate_page();
|
|
char * result = m_curr_ptr;
|
|
m_curr_ptr += size;
|
|
m_curr_ptr = ALIGN(char *, m_curr_ptr);
|
|
return result;
|
|
}
|
|
else {
|
|
// big page
|
|
m_curr_page = ::allocate_page(m_curr_page, size);
|
|
char * result = m_curr_page;
|
|
allocate_page();
|
|
return result;
|
|
}
|
|
}
|
|
|
|
inline void region::recycle_curr_page() {
|
|
char * prev = prev_page(m_curr_page);
|
|
recycle_page(m_curr_page, m_free_pages);
|
|
m_curr_page = prev;
|
|
}
|
|
|
|
void region::reset() {
|
|
while (m_curr_page != nullptr) {
|
|
recycle_curr_page();
|
|
}
|
|
SASSERT(m_curr_page == 0);
|
|
m_curr_ptr = nullptr;
|
|
m_curr_end_ptr = nullptr;
|
|
m_mark = nullptr;
|
|
allocate_page();
|
|
}
|
|
|
|
void region::push_scope() {
|
|
char * curr_page = m_curr_page;
|
|
char * curr_ptr = m_curr_ptr;
|
|
m_mark = new (*this) mark(curr_page, curr_ptr, m_mark);
|
|
}
|
|
|
|
void region::pop_scope() {
|
|
SASSERT(m_mark);
|
|
char * old_curr_page = m_mark->m_curr_page;
|
|
SASSERT(is_default_page(old_curr_page));
|
|
m_curr_ptr = m_mark->m_curr_ptr;
|
|
m_mark = m_mark->m_prev_mark;
|
|
while (m_curr_page != old_curr_page) {
|
|
recycle_curr_page();
|
|
}
|
|
SASSERT(is_default_page(m_curr_page));
|
|
m_curr_end_ptr = end_of_default_page(m_curr_page);
|
|
}
|
|
|
|
void region::display_mem_stats(std::ostream & out) const {
|
|
unsigned n = 0;
|
|
char * page = m_curr_page;
|
|
while (page != nullptr) {
|
|
n++;
|
|
page = prev_page(page);
|
|
}
|
|
out << "num. pages: " << n << "\n";
|
|
}
|
|
|
|
#endif
|
|
|