Skip to content

Commit c26b83d

Browse files
Constructor for builtin function with no eval
1 parent 54a4d7d commit c26b83d

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

src/solvers/refinement/string_builtin_function.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,32 @@ optionalt<exprt> string_insertion_builtin_functiont::eval(
207207
const array_typet type(result.type().subtype(), length);
208208
return make_string(result_value, type);
209209
}
210+
211+
string_builtin_function_with_no_evalt::string_builtin_function_with_no_evalt(
212+
const function_application_exprt &f,
213+
array_poolt &array_pool)
214+
: function_application(f)
215+
{
216+
const std::vector<exprt> &fun_args = f.arguments();
217+
std::size_t i = 0;
218+
if(fun_args.size() >= 2 && fun_args[1].type().id() == ID_pointer)
219+
{
220+
string_res = array_pool.find(fun_args[1], fun_args[0]);
221+
i = 2;
222+
}
223+
224+
for(; i < fun_args.size(); ++i)
225+
{
226+
const auto arg = expr_try_dynamic_cast<struct_exprt>(fun_args[i]);
227+
// TODO: use is_refined_string_type ?
228+
if(
229+
arg && arg->operands().size() == 2 &&
230+
arg->op1().type().id() == ID_pointer)
231+
{
232+
INVARIANT(is_refined_string_type(arg->type()), "should be a string");
233+
string_args.push_back(array_pool.find(arg->op1(), arg->op0()));
234+
}
235+
else
236+
args.push_back(fun_args[i]);
237+
}
238+
}

src/solvers/refinement/string_builtin_function.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ class string_builtin_function_with_no_evalt : public string_builtin_functiont
208208
optionalt<array_string_exprt> string_res;
209209
std::vector<array_string_exprt> string_args;
210210
std::vector<exprt> args;
211+
212+
string_builtin_function_with_no_evalt(
213+
const function_application_exprt &f,
214+
array_poolt &array_pool);
215+
211216
std::string name() const override
212217
{
213218
return id2string(function_application.id());

src/solvers/refinement/string_refinement_util.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ static std::unique_ptr<string_builtin_functiont> to_string_builtin_function(
176176
: name.get_identifier();
177177

178178
if(id == ID_cprover_string_insert_func)
179-
return std::unique_ptr<string_builtin_functiont>(
180-
new string_insertion_builtin_functiont(fun_app.arguments(), array_pool));
179+
return util_make_unique<string_insertion_builtin_functiont>(
180+
fun_app.arguments(), array_pool);
181181

182182
if(id == ID_cprover_string_concat_func)
183183
return util_make_unique<string_concatenation_builtin_functiont>(

0 commit comments

Comments
 (0)