@@ -303,6 +303,15 @@ code_typet member_type_lazy(
303
303
return to_code_type (member_type_from_descriptor);
304
304
}
305
305
306
+ symbolt java_bytecode_convert_methodt::get_lambda_method_symbol (
307
+ const java_class_typet::java_lambda_method_handlest &lambda_method_handles,
308
+ const irep_idt &index)
309
+ {
310
+ const symbol_exprt &lambda_method_handle =
311
+ lambda_method_handles.at (std::stoi (id2string (index)));
312
+ return symbol_table.lookup_ref (lambda_method_handle.get_identifier ());
313
+ }
314
+
306
315
// / This creates a method symbol in the symtab, but doesn't actually perform
307
316
// / method conversion just yet. The caller should call
308
317
// / java_bytecode_convert_method later to give the symbol/method a body.
@@ -552,7 +561,11 @@ void java_bytecode_convert_methodt::convert(
552
561
current_method=method_symbol.name ;
553
562
method_has_this=code_type.has_this ();
554
563
if ((!m.is_abstract ) && (!m.is_native ))
555
- method_symbol.value =convert_instructions (m, code_type, method_symbol.name );
564
+ method_symbol.value = convert_instructions (
565
+ m,
566
+ code_type,
567
+ method_symbol.name ,
568
+ to_java_class_type (class_symbol.type ).lambda_method_handles ());
556
569
}
557
570
558
571
const bytecode_infot &java_bytecode_convert_methodt::get_bytecode_info (
@@ -923,7 +936,8 @@ static unsigned get_bytecode_type_width(const typet &ty)
923
936
codet java_bytecode_convert_methodt::convert_instructions (
924
937
const methodt &method,
925
938
const code_typet &method_type,
926
- const irep_idt &method_name)
939
+ const irep_idt &method_name,
940
+ const java_class_typet::java_lambda_method_handlest &lambda_method_handles)
927
941
{
928
942
const instructionst &instructions=method.instructions ;
929
943
@@ -1208,7 +1222,14 @@ codet java_bytecode_convert_methodt::convert_instructions(
1208
1222
else if (statement==" invokedynamic" )
1209
1223
{
1210
1224
// not used in Java
1211
- code_typet &code_type=to_code_type (arg0.type ());
1225
+ code_typet &code_type = to_code_type (arg0.type ());
1226
+
1227
+ const symbolt &lambda_method_symbol = get_lambda_method_symbol (
1228
+ lambda_method_handles,
1229
+ code_type.get (ID_java_lambda_method_handle_index));
1230
+ debug () << " Converting invokedynamic for lambda: "
1231
+ << lambda_method_symbol.name << eom;
1232
+
1212
1233
const code_typet::parameterst ¶meters (code_type.parameters ());
1213
1234
1214
1235
pop (parameters.size ());
0 commit comments