@@ -306,6 +306,25 @@ code_typet member_type_lazy(
306
306
return to_code_type (member_type_from_descriptor);
307
307
}
308
308
309
+ // / Retrieves the symbol of the lambda method associated with the given
310
+ // / lambda method handle (bootstrap method).
311
+ // / \param lambda_method_handles Vector of lambda method handles (bootstrap
312
+ // / methods) of the class where the lambda is called
313
+ // / \param index Index of the lambda method handle in the vector
314
+ // / \return Symbol of the lambda method if the method handle does not have an
315
+ // / unknown type
316
+ optionalt<symbolt> java_bytecode_convert_methodt::get_lambda_method_symbol (
317
+ const java_class_typet::java_lambda_method_handlest &lambda_method_handles,
318
+ const size_t &index)
319
+ {
320
+ const symbol_exprt &lambda_method_handle = lambda_method_handles.at (index );
321
+ // If the lambda method handle has an unknown type, it does not refer to
322
+ // any symbol (it is a symbol expression with empty identifier)
323
+ if (!lambda_method_handle.get_identifier ().empty ())
324
+ return symbol_table.lookup_ref (lambda_method_handle.get_identifier ());
325
+ return {};
326
+ }
327
+
309
328
// / This creates a method symbol in the symtab, but doesn't actually perform
310
329
// / method conversion just yet. The caller should call
311
330
// / java_bytecode_convert_method later to give the symbol/method a body.
@@ -555,7 +574,11 @@ void java_bytecode_convert_methodt::convert(
555
574
current_method=method_symbol.name ;
556
575
method_has_this=code_type.has_this ();
557
576
if ((!m.is_abstract ) && (!m.is_native ))
558
- method_symbol.value =convert_instructions (m, code_type, method_symbol.name );
577
+ method_symbol.value = convert_instructions (
578
+ m,
579
+ code_type,
580
+ method_symbol.name ,
581
+ to_java_class_type (class_symbol.type ).lambda_method_handles ());
559
582
}
560
583
561
584
const bytecode_infot &java_bytecode_convert_methodt::get_bytecode_info (
@@ -926,7 +949,8 @@ static unsigned get_bytecode_type_width(const typet &ty)
926
949
codet java_bytecode_convert_methodt::convert_instructions (
927
950
const methodt &method,
928
951
const code_typet &method_type,
929
- const irep_idt &method_name)
952
+ const irep_idt &method_name,
953
+ const java_class_typet::java_lambda_method_handlest &lambda_method_handles)
930
954
{
931
955
const instructionst &instructions=method.instructions ;
932
956
@@ -1211,7 +1235,19 @@ codet java_bytecode_convert_methodt::convert_instructions(
1211
1235
else if (statement==" invokedynamic" )
1212
1236
{
1213
1237
// not used in Java
1214
- code_typet &code_type=to_code_type (arg0.type ());
1238
+ code_typet &code_type = to_code_type (arg0.type ());
1239
+
1240
+ const optionalt<symbolt> &lambda_method_symbol = get_lambda_method_symbol (
1241
+ lambda_method_handles,
1242
+ code_type.get_int (ID_java_lambda_method_handle_index));
1243
+ if (lambda_method_symbol.has_value ())
1244
+ debug () << " Converting invokedynamic for lambda: "
1245
+ << lambda_method_symbol.value ().name << eom;
1246
+ else
1247
+ debug () << " Converting invokedynamic for lambda with unknown handle "
1248
+ " type"
1249
+ << eom;
1250
+
1215
1251
const code_typet::parameterst ¶meters (code_type.parameters ());
1216
1252
1217
1253
pop (parameters.size ());
0 commit comments