mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	reduce overhead of creating seq-plugin, enable parameter cleanup for #5095
This commit is contained in:
		
							parent
							
								
									d62f6c62b5
								
							
						
					
					
						commit
						9098084217
					
				
					 4 changed files with 29 additions and 20 deletions
				
			
		|  | @ -1941,7 +1941,7 @@ void ast_manager::delete_node(ast * n) { | |||
| #endif | ||||
|         switch (n->get_kind()) { | ||||
|         case AST_SORT: | ||||
|             if (to_sort(n)->m_info != nullptr && !m_debug_ref_count) { | ||||
|             if (to_sort(n)->m_info != nullptr) { | ||||
|                 sort_info * info = to_sort(n)->get_info(); | ||||
|                 info->del_eh(*this); | ||||
|                 dealloc(info); | ||||
|  | @ -1949,7 +1949,7 @@ void ast_manager::delete_node(ast * n) { | |||
|             break; | ||||
|         case AST_FUNC_DECL: { | ||||
|             func_decl* f = to_func_decl(n); | ||||
|             if (f->m_info != nullptr && !m_debug_ref_count) { | ||||
|             if (f->m_info != nullptr) { | ||||
|                 func_decl_info * info = f->get_info(); | ||||
|                 if (info->is_lambda()) { | ||||
|                     push_dec_ref(m_lambda_defs[f]); | ||||
|  |  | |||
|  | @ -44,9 +44,9 @@ bv_decl_plugin::bv_decl_plugin(): | |||
| void bv_decl_plugin::set_manager(ast_manager * m, family_id id) { | ||||
|     decl_plugin::set_manager(m, id); | ||||
| 
 | ||||
|     for (unsigned i = 1; i <= 64; i++) { | ||||
|     for (unsigned i = 1; i <= 64; i++)  | ||||
|         mk_bv_sort(i); | ||||
|     } | ||||
| 
 | ||||
|     m_bit0 = m->mk_const_decl(symbol("bit0"), get_bv_sort(1), func_decl_info(m_family_id, OP_BIT0)); | ||||
|     m_bit1 = m->mk_const_decl(symbol("bit1"), get_bv_sort(1), func_decl_info(m_family_id, OP_BIT1)); | ||||
|     m->inc_ref(m_bit0); | ||||
|  | @ -138,7 +138,7 @@ void bv_decl_plugin::finalize() { | |||
| 
 | ||||
| void bv_decl_plugin::mk_bv_sort(unsigned bv_size) { | ||||
|     force_ptr_array_size(m_bv_sorts, bv_size + 1); | ||||
|     if (m_bv_sorts[bv_size] == 0) { | ||||
|     if (!m_bv_sorts[bv_size]) { | ||||
|         parameter p(bv_size); | ||||
|         sort_size sz; | ||||
|         if (sort_size::is_very_big_base2(bv_size)) { | ||||
|  | @ -155,7 +155,7 @@ void bv_decl_plugin::mk_bv_sort(unsigned bv_size) { | |||
| inline sort * bv_decl_plugin::get_bv_sort(unsigned bv_size) { | ||||
|     if (bv_size < (1 << 12)) { | ||||
|         mk_bv_sort(bv_size); | ||||
|             return m_bv_sorts[bv_size]; | ||||
|         return m_bv_sorts[bv_size]; | ||||
|     } | ||||
|     parameter p(bv_size); | ||||
|     sort_size sz(sort_size::mk_very_big()); | ||||
|  |  | |||
|  | @ -172,7 +172,7 @@ sort* seq_decl_plugin::apply_binding(ptr_vector<sort> const& binding, sort* s) { | |||
|         if (p == m_char && s->get_decl_kind() == SEQ_SORT) | ||||
|             return m_string; | ||||
|         if (p == m_string && s->get_decl_kind() == RE_SORT) | ||||
|             return m_reglan; | ||||
|             return mk_reglan(); | ||||
|         return mk_sort(s->get_decl_kind(), 1, ¶m); | ||||
|     } | ||||
|     return s; | ||||
|  | @ -273,6 +273,16 @@ void seq_decl_plugin::init() { | |||
|     m_sigs[_OP_STRING_SUBSTR]     = alloc(psig, m, "str.substr", 0, 3, strTint2T, strT); | ||||
| } | ||||
| 
 | ||||
| sort* seq_decl_plugin::mk_reglan() { | ||||
|     if (!m_reglan) { | ||||
|         ast_manager& m = *m_manager; | ||||
|         parameter paramS(m_string); | ||||
|         m_reglan = m.mk_sort(symbol("RegEx"), sort_info(m_family_id, RE_SORT, 1, ¶mS)); | ||||
|         m.inc_ref(m_reglan); | ||||
|     } | ||||
|     return m_reglan; | ||||
| } | ||||
| 
 | ||||
| void seq_decl_plugin::set_manager(ast_manager* m, family_id id) { | ||||
|     decl_plugin::set_manager(m, id); | ||||
|     m_char_plugin = static_cast<char_decl_plugin*>(m_manager->get_plugin(m_manager->mk_family_id("char"))); | ||||
|  | @ -281,9 +291,6 @@ void seq_decl_plugin::set_manager(ast_manager* m, family_id id) { | |||
|     parameter param(m_char); | ||||
|     m_string = m->mk_sort(symbol("String"), sort_info(m_family_id, SEQ_SORT, 1, ¶m)); | ||||
|     m->inc_ref(m_string); | ||||
|     parameter paramS(m_string); | ||||
|     m_reglan = m->mk_sort(m_family_id, RE_SORT, 1, ¶mS); | ||||
|     m->inc_ref(m_reglan); | ||||
| } | ||||
| 
 | ||||
| sort * seq_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) { | ||||
|  | @ -313,7 +320,7 @@ sort * seq_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter | |||
|     case _STRING_SORT: | ||||
|         return m_string; | ||||
|     case _REGLAN_SORT: | ||||
|         return m_reglan; | ||||
|         return mk_reglan(); | ||||
|     default: | ||||
|         UNREACHABLE(); | ||||
|         return nullptr; | ||||
|  | @ -403,14 +410,14 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, | |||
|          | ||||
|     case _OP_REGEXP_FULL_CHAR: | ||||
|         m_has_re = true; | ||||
|         if (!range) range = m_reglan; | ||||
|         if (!range) range = mk_reglan(); | ||||
|         match(*m_sigs[k], arity, domain, range, rng); | ||||
|         return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_FULL_CHAR_SET)); | ||||
| 
 | ||||
|     case OP_RE_FULL_CHAR_SET: | ||||
|         m_has_re = true; | ||||
|         if (!range) range = m_reglan; | ||||
|         if (range == m_reglan) { | ||||
|         if (!range) range = mk_reglan(); | ||||
|         if (range == mk_reglan()) { | ||||
|             match(*m_sigs[k], arity, domain, range, rng); | ||||
|             return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, k)); | ||||
|         } | ||||
|  | @ -418,19 +425,19 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, | |||
| 
 | ||||
|     case OP_RE_FULL_SEQ_SET: | ||||
|         m_has_re = true; | ||||
|         if (!range) range = m_reglan; | ||||
|         if (!range) range = mk_reglan(); | ||||
|         return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, range, func_decl_info(m_family_id, k));         | ||||
| 
 | ||||
|     case _OP_REGEXP_EMPTY: | ||||
|         m_has_re = true; | ||||
|         if (!range) range = m_reglan; | ||||
|         if (!range) range = mk_reglan(); | ||||
|         match(*m_sigs[k], arity, domain, range, rng); | ||||
|         return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_EMPTY_SET)); | ||||
| 
 | ||||
|     case OP_RE_EMPTY_SET: | ||||
|         m_has_re = true; | ||||
|         if (!range) range = m_reglan; | ||||
|         if (range == m_reglan) { | ||||
|         if (!range) range = mk_reglan(); | ||||
|         if (range == mk_reglan()) { | ||||
|             match(*m_sigs[k], arity, domain, range, rng); | ||||
|             return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, k)); | ||||
|         } | ||||
|  | @ -446,12 +453,12 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, | |||
|             } | ||||
|             return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, rng, func_decl_info(m_family_id, k, num_parameters, parameters)); | ||||
|         case 2: | ||||
|             if (m_reglan != domain[0] || !arith_util(m).is_int(domain[1])) { | ||||
|             if (mk_reglan() != domain[0] || !arith_util(m).is_int(domain[1])) { | ||||
|                 m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters"); | ||||
|             } | ||||
|             return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters)); | ||||
|         case 3: | ||||
|             if (m_reglan != domain[0] || !arith_util(m).is_int(domain[1]) || !arith_util(m).is_int(domain[2])) { | ||||
|             if (mk_reglan() != domain[0] || !arith_util(m).is_int(domain[1]) || !arith_util(m).is_int(domain[2])) { | ||||
|                 m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters"); | ||||
|             } | ||||
|             return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters)); | ||||
|  |  | |||
|  | @ -155,6 +155,8 @@ class seq_decl_plugin : public decl_plugin { | |||
| 
 | ||||
|     void set_manager(ast_manager * m, family_id id) override; | ||||
| 
 | ||||
|     sort* mk_reglan(); | ||||
| 
 | ||||
| public: | ||||
|     seq_decl_plugin(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue