@@ -469,3 +469,163 @@ SCENARIO(
469
469
}
470
470
});
471
471
}
472
+
473
+ void validate_static_member_variable_lambda_assignment (
474
+ const symbol_tablet &symbol_table,
475
+ const std::vector<codet> &instructions,
476
+ const lambda_assignment_test_datat &test_data,
477
+ const std::string static_field_name)
478
+ {
479
+ const auto lambda_assignment =
480
+ require_goto_statements::find_pointer_assignments (
481
+ static_field_name, instructions);
482
+
483
+ REQUIRE (lambda_assignment.non_null_assignments .size () == 1 );
484
+ REQUIRE_FALSE (lambda_assignment.null_assignment .has_value ());
485
+
486
+ validate_lamdba_assignement (
487
+ symbol_table, instructions, test_data, lambda_assignment);
488
+ }
489
+
490
+ SCENARIO (
491
+ " Converting invokedynamic with a static member lambda" ,
492
+ " [core]"
493
+ " [lamdba][java_bytecode][java_bytecode_convert_method][!mayfail]" )
494
+ {
495
+ // NOLINTNEXTLINE(whitespace/braces)
496
+ run_test_with_compilers ([](const std::string &compiler) {
497
+ GIVEN (
498
+ " A class with a static lambda variables from " + compiler + " compiler." )
499
+ {
500
+ symbol_tablet symbol_table = load_java_class (
501
+ " StaticLambdas" ,
502
+ " ./java_bytecode/java_bytecode_parser/lambda_examples/" + compiler +
503
+ " _classes/" ,
504
+ " StaticLambdas.<clinit>" );
505
+
506
+ WHEN (" Inspecting the assignments of the entry function" )
507
+ {
508
+ const std::vector<codet> &instructions =
509
+ require_goto_statements::get_all_statements (
510
+ symbol_table.lookup_ref (" java::StaticLambdas.<clinit>:()V" ).value );
511
+
512
+ const std::string function_prefix_regex_str = " java::StaticLambdas" ;
513
+
514
+ THEN (
515
+ " The local variable should be assigned a temp object implementing "
516
+ " SimpleLambda" )
517
+ {
518
+ lambda_assignment_test_datat test_data;
519
+ test_data.lambda_interface = " java::SimpleLambda" ;
520
+ test_data.lambda_interface_method_descriptor = " .Execute:()V" ;
521
+ test_data.lambda_function_id =
522
+ " java::StaticLambdas.lambda$static$0:()V" ;
523
+ test_data.expected_params = {};
524
+ test_data.should_return_value = false ;
525
+ validate_static_member_variable_lambda_assignment (
526
+ symbol_table,
527
+ instructions,
528
+ test_data,
529
+ function_prefix_regex_str + " .simpleLambda" );
530
+ }
531
+ THEN (
532
+ " The local variable should be assigned a temp object implementing "
533
+ " ParameterLambda" )
534
+ {
535
+ lambda_assignment_test_datat test_data;
536
+ test_data.lambda_interface = " java::ParameterLambda" ;
537
+ test_data.lambda_interface_method_descriptor =
538
+ " .Execute:(ILjava/lang/Object;LDummyGeneric;)V" ;
539
+ test_data.lambda_function_id =
540
+ " java::StaticLambdas.lambda$static$1:"
541
+ " (ILjava/lang/Object;LDummyGeneric;)V" ;
542
+
543
+ symbol_exprt integer_param{" primitive" , java_int_type ()};
544
+ symbol_exprt ref_param{" reference" ,
545
+ java_type_from_string (" Ljava/lang/Object;" )};
546
+ symbol_exprt generic_param{
547
+ " specalisedGeneric" ,
548
+ java_type_from_string (" LDummyGeneric<Ljava/lang/Interger;>;" )};
549
+ test_data.expected_params = {integer_param, ref_param, generic_param};
550
+
551
+ test_data.should_return_value = false ;
552
+ validate_member_variable_lambda_assignment (
553
+ symbol_table, instructions, test_data, " paramLambda" );
554
+ }
555
+ THEN (
556
+ " The local variable should be assigned a non-null pointer to a "
557
+ " array parameter interface implementor" )
558
+ {
559
+ lambda_assignment_test_datat test_data;
560
+ test_data.lambda_interface = " java::ArrayParameterLambda" ;
561
+ test_data.lambda_interface_method_descriptor =
562
+ " .Execute:([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
563
+ test_data.lambda_function_id =
564
+ " java::StaticLambdas.lambda$static$2:"
565
+ " ([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
566
+
567
+ symbol_exprt integer_param{" primitive" , java_type_from_string (" [I" )};
568
+ symbol_exprt ref_param{" reference" ,
569
+ java_type_from_string (" [Ljava/lang/Object;" )};
570
+ symbol_exprt generic_param{
571
+ " specalisedGeneric" ,
572
+ java_type_from_string (" [LDummyGeneric<Ljava/lang/Interger;>;" )};
573
+ test_data.expected_params = {integer_param, ref_param, generic_param};
574
+ test_data.should_return_value = false ;
575
+
576
+ validate_member_variable_lambda_assignment (
577
+ symbol_table, instructions, test_data, " arrayParamLambda" );
578
+ }
579
+ THEN (
580
+ " The local variable should be assigned a temp object implementing "
581
+ " ReturningLambdaPrimitive" )
582
+ {
583
+ lambda_assignment_test_datat test_data;
584
+ test_data.lambda_interface = " java::ReturningLambdaPrimitive" ;
585
+ test_data.lambda_interface_method_descriptor = " .Execute:()I" ;
586
+ test_data.lambda_function_id =
587
+ " java::StaticLambdas.lambda$static$3:()I" ;
588
+ test_data.expected_params = {};
589
+ test_data.should_return_value = true ;
590
+ validate_member_variable_lambda_assignment (
591
+ symbol_table, instructions, test_data, " returnPrimitiveLambda" );
592
+ }
593
+ THEN (
594
+ " The local variable should be assigned a temp object implementing "
595
+ " ReturningLambdaReference" )
596
+ {
597
+ lambda_assignment_test_datat test_data;
598
+ test_data.lambda_interface = " java::ReturningLambdaReference" ;
599
+ test_data.lambda_interface_method_descriptor =
600
+ " .Execute:()Ljava/lang/Object;" ;
601
+ test_data.lambda_function_id =
602
+ " java::StaticLambdas.lambda$static$4:()Ljava/lang/Object;" ;
603
+ test_data.expected_params = {};
604
+ test_data.should_return_value = true ;
605
+ validate_member_variable_lambda_assignment (
606
+ symbol_table, instructions, test_data, " returnReferenceLambda" );
607
+ }
608
+ THEN (
609
+ " The local variable should be assigned a temp object implementing "
610
+ " ReturningLambdaSpecalisedGeneric" )
611
+ {
612
+ lambda_assignment_test_datat test_data;
613
+ test_data.lambda_interface = " java::ReturningLambdaSpecalisedGeneric" ;
614
+ test_data.lambda_interface_method_descriptor =
615
+ " .Execute:()LDummyGeneric;" ;
616
+ test_data.lambda_function_id =
617
+ " java::StaticLambdas.lambda$static$5:()LDummyGeneric;" ;
618
+ test_data.expected_params = {};
619
+ test_data.should_return_value = true ;
620
+ validate_member_variable_lambda_assignment (
621
+ symbol_table,
622
+ instructions,
623
+ test_data,
624
+ " returningSpecalisedGenericLambda" );
625
+ }
626
+
627
+ // TODO[TG-2486]: Tests for member lambdas that capture member variables
628
+ }
629
+ }
630
+ });
631
+ }
0 commit comments