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