@@ -402,63 +402,26 @@ bool ai_baset::do_function_call_rec(
402
402
{
403
403
PRECONDITION (!goto_functions.function_map .empty ());
404
404
405
- // We can't really do this here -- we rely on
406
- // these being removed by some previous analysis.
407
- PRECONDITION (function.id () != ID_dereference);
408
-
409
- // Can't be a function
410
- DATA_INVARIANT (
411
- function.id () != " NULL-object" , " Function cannot be null object" );
412
- DATA_INVARIANT (function.id () != ID_member, " Function cannot be struct field" );
413
- DATA_INVARIANT (function.id () != ID_index, " Function cannot be array element" );
405
+ // This is quite a strong assumption on the well-formedness of the program.
406
+ // It means function pointers must be removed before use.
407
+ DATA_INVARIANT (function.id () == ID_symbol);
414
408
415
409
bool new_data=false ;
416
410
417
- if (function.id ()==ID_symbol)
418
- {
419
- const irep_idt &identifier = to_symbol_expr (function).get_identifier ();
411
+ const irep_idt &identifier = to_symbol_expr (function).get_identifier ();
420
412
421
- goto_functionst::function_mapt::const_iterator it=
422
- goto_functions.function_map .find (identifier);
413
+ goto_functionst::function_mapt::const_iterator it=
414
+ goto_functions.function_map .find (identifier);
423
415
424
- if (it==goto_functions.function_map .end ())
425
- throw " failed to find function " +id2string (identifier);
416
+ if (it==goto_functions.function_map .end ())
417
+ throw " failed to find function " +id2string (identifier);
426
418
427
- new_data=do_function_call (
428
- l_call, l_return,
429
- goto_functions,
430
- it,
431
- arguments,
432
- ns);
433
- }
434
- else if (function.id ()==ID_if)
435
- {
436
- DATA_INVARIANT (function.operands ().size () != 3 , " if has three operands" );
437
-
438
- bool new_data1=
439
- do_function_call_rec (
440
- l_call, l_return,
441
- function.op1 (),
442
- arguments,
443
- goto_functions,
444
- ns);
445
-
446
- bool new_data2=
447
- do_function_call_rec (
448
- l_call, l_return,
449
- function.op2 (),
450
- arguments,
451
- goto_functions,
452
- ns);
453
-
454
- if (new_data1 || new_data2)
455
- new_data=true ;
456
- }
457
- else
458
- {
459
- throw " unexpected function_call argument: " +
460
- function.id_string ();
461
- }
419
+ new_data=do_function_call (
420
+ l_call, l_return,
421
+ goto_functions,
422
+ it,
423
+ arguments,
424
+ ns);
462
425
463
426
return new_data;
464
427
}
0 commit comments