@@ -82,11 +82,12 @@ class java_bytecode_convert_methodt:public messaget
82
82
symbol_exprt symbol_expr;
83
83
size_t start_pc;
84
84
size_t length;
85
+ bool is_parameter;
85
86
};
86
87
87
88
typedef std::vector<variablet> variablest;
88
89
expanding_vector<variablest> variables;
89
-
90
+ std::set<symbol_exprt> used_local_names;
90
91
bool method_has_this;
91
92
92
93
typedef enum instruction_sizet
@@ -150,13 +151,16 @@ class java_bytecode_convert_methodt:public messaget
150
151
151
152
symbol_exprt result (identifier, t);
152
153
result.set (ID_C_base_name, base_name);
154
+ used_local_names.insert (result);
153
155
154
156
return result;
155
157
}
156
158
else
157
159
{
158
160
exprt result=var.symbol_expr ;
159
- if (do_cast==CAST_AS_NEEDED && t!=result.type ()) result=typecast_exprt (result, t);
161
+ if (!var.is_parameter )
162
+ used_local_names.insert (to_symbol_expr (result));
163
+ if (do_cast==CAST_AS_NEEDED && t!=result.type ()) result=typecast_exprt (result, t);
160
164
return result;
161
165
}
162
166
}
@@ -379,6 +383,7 @@ void java_bytecode_convert_methodt::convert(
379
383
variables[param_index][0 ].symbol_expr =parameter_symbol.symbol_expr ();
380
384
variables[param_index][0 ].start_pc =0 ;
381
385
variables[param_index][0 ].length = std::numeric_limits<size_t >::max ();
386
+ variables[param_index][0 ].is_parameter =true ;
382
387
param_index+=slots;
383
388
}
384
389
@@ -1529,6 +1534,22 @@ codet java_bytecode_convert_methodt::convert_instructions(
1529
1534
// review successor computation of athrow!
1530
1535
code_blockt code;
1531
1536
1537
+ // locals
1538
+ for (const auto & var : used_local_names)
1539
+ {
1540
+ code.add (code_declt (var));
1541
+ symbolt new_symbol;
1542
+ new_symbol.name =var.get_identifier ();
1543
+ new_symbol.type =var.type ();
1544
+ new_symbol.base_name =var.get (ID_C_base_name);
1545
+ new_symbol.pretty_name =id2string (var.get_identifier ()).substr (6 , std::string::npos);
1546
+ new_symbol.mode =ID_java;
1547
+ new_symbol.is_type =false ;
1548
+ new_symbol.is_file_local =true ;
1549
+ new_symbol.is_thread_local =true ;
1550
+ new_symbol.is_lvalue =true ;
1551
+ symbol_table.add (new_symbol);
1552
+ }
1532
1553
// temporaries
1533
1554
for (const auto & var : tmp_vars)
1534
1555
{
0 commit comments