let compute_call_to_builtin kf initial_state actuals =
let name = Kernel_function.get_name kf in
try
let name, override =
try
let name = Value_parameters.BuiltinsOverrides.find name in
Kf_state.mark_as_called kf;
name, true
with Not_found -> name, false
in
let abstract_function = Builtins.find_builtin name in
(try
Some (abstract_function initial_state actuals)
with Db.Value.Outside_builtin_possibilities ->
if override then None
else (
do_degenerate None;
raise Db.Value.Aborted
)
)
with Not_found ->
if Ast_info.can_be_cea_function name then
if Ast_info.is_cea_dump_function name then
Some (Builtins.dump_state initial_state)
else if Ast_info.is_cea_alloc_with_validity name then
Some (Builtins.alloc_with_validity initial_state actuals)
else if Ast_info.is_cea_function name then
Some (Builtins.dump_args name initial_state actuals)
else if Ast_info.is_cea_dump_file_function name then
Some (Builtins.dump_state_file name initial_state actuals)
else
None
else None