|
26 | 26 | #include <ansi-c/string_constant.h>
|
27 | 27 |
|
28 | 28 | #include <goto-programs/goto_functions.h>
|
| 29 | +#include <goto-programs/remove_exceptions.h> |
29 | 30 |
|
30 | 31 | #include "java_entry_point.h"
|
31 | 32 | #include "java_object_factory.h"
|
@@ -325,6 +326,24 @@ void java_record_outputs(
|
325 | 326 | init_code.move_to_operands(output);
|
326 | 327 | }
|
327 | 328 | }
|
| 329 | + |
| 330 | + // record exceptional return variable as output |
| 331 | + codet output(ID_output); |
| 332 | + output.operands().resize(2); |
| 333 | + |
| 334 | + assert(symbol_table.has_symbol(id2string(function.name)+EXC_SUFFIX)); |
| 335 | + |
| 336 | + // retrieve the exception variable |
| 337 | + const symbolt exc_symbol=symbol_table.lookup( |
| 338 | + id2string(function.name)+EXC_SUFFIX); |
| 339 | + |
| 340 | + output.op0()=address_of_exprt( |
| 341 | + index_exprt(string_constantt(exc_symbol.base_name), |
| 342 | + from_integer(0, index_type()))); |
| 343 | + output.op1()=exc_symbol.symbol_expr(); |
| 344 | + output.add_source_location()=function.location; |
| 345 | + |
| 346 | + init_code.move_to_operands(output); |
328 | 347 | }
|
329 | 348 |
|
330 | 349 | main_function_resultt get_main_symbol(
|
@@ -591,6 +610,15 @@ bool java_entry_point(
|
591 | 610 | call_main.lhs()=return_symbol.symbol_expr();
|
592 | 611 | }
|
593 | 612 |
|
| 613 | + // add the exceptional return value |
| 614 | + auxiliary_symbolt exc_symbol; |
| 615 | + exc_symbol.mode=ID_C; |
| 616 | + exc_symbol.is_static_lifetime=false; |
| 617 | + exc_symbol.name=id2string(symbol.name)+EXC_SUFFIX; |
| 618 | + exc_symbol.base_name=id2string(symbol.name)+EXC_SUFFIX; |
| 619 | + exc_symbol.type=typet(ID_pointer, empty_typet()); |
| 620 | + symbol_table.add(exc_symbol); |
| 621 | + |
594 | 622 | exprt::operandst main_arguments=
|
595 | 623 | java_build_arguments(
|
596 | 624 | symbol,
|
|
0 commit comments