@@ -31,13 +31,13 @@ class java_bytecode_convert_classt:public messaget
31
31
size_t _max_array_length,
32
32
lazy_methodst& _lazy_methods,
33
33
lazy_methods_modet _lazy_methods_mode,
34
- bool _string_refinement_enabled ):
34
+ const java_string_library_preprocesst &_string_preprocess ):
35
35
messaget (_message_handler),
36
36
symbol_table (_symbol_table),
37
37
max_array_length (_max_array_length),
38
38
lazy_methods (_lazy_methods),
39
39
lazy_methods_mode (_lazy_methods_mode),
40
- string_refinement_enabled (_string_refinement_enabled )
40
+ string_preprocess (_string_preprocess )
41
41
{
42
42
}
43
43
@@ -47,18 +47,10 @@ class java_bytecode_convert_classt:public messaget
47
47
48
48
if (parse_tree.loading_successful )
49
49
convert (parse_tree.parsed_class );
50
- else if (string_refinement_enabled &&
51
- parse_tree.parsed_class .name ==" java.lang.String" )
52
- add_string_type (" java.lang.String" );
53
- else if (string_refinement_enabled &&
54
- parse_tree.parsed_class .name ==" java.lang.StringBuilder" )
55
- add_string_type (" java.lang.StringBuilder" );
56
- else if (string_refinement_enabled &&
57
- parse_tree.parsed_class .name ==" java.lang.CharSequence" )
58
- add_string_type (" java.lang.CharSequence" );
59
- else if (string_refinement_enabled &&
60
- parse_tree.parsed_class .name ==" java.lang.StringBuffer" )
61
- add_string_type (" java.lang.StringBuffer" );
50
+ else if (string_preprocess.is_known_string_type (
51
+ parse_tree.parsed_class .name ))
52
+ string_preprocess.add_string_type (
53
+ parse_tree.parsed_class .name , symbol_table);
62
54
else
63
55
generate_class_stub (parse_tree.parsed_class .name );
64
56
}
@@ -71,15 +63,14 @@ class java_bytecode_convert_classt:public messaget
71
63
const size_t max_array_length;
72
64
lazy_methodst &lazy_methods;
73
65
lazy_methods_modet lazy_methods_mode;
74
- bool string_refinement_enabled ;
66
+ java_string_library_preprocesst string_preprocess ;
75
67
76
68
// conversion
77
69
void convert (const classt &c);
78
70
void convert (symbolt &class_symbol, const fieldt &f);
79
71
80
72
void generate_class_stub (const irep_idt &class_name);
81
73
void add_array_types ();
82
- void add_string_type (const irep_idt &class_name);
83
74
};
84
75
85
76
/* ******************************************************************\
@@ -486,15 +477,15 @@ bool java_bytecode_convert_class(
486
477
size_t max_array_length,
487
478
lazy_methodst &lazy_methods,
488
479
lazy_methods_modet lazy_methods_mode,
489
- bool string_refinement_enabled )
480
+ const java_string_library_preprocesst &string_preprocess )
490
481
{
491
482
java_bytecode_convert_classt java_bytecode_convert_class (
492
483
symbol_table,
493
484
message_handler,
494
485
max_array_length,
495
486
lazy_methods,
496
487
lazy_methods_mode,
497
- string_refinement_enabled );
488
+ string_preprocess );
498
489
499
490
try
500
491
{
@@ -518,66 +509,3 @@ bool java_bytecode_convert_class(
518
509
519
510
return true ;
520
511
}
521
-
522
- /* ******************************************************************\
523
-
524
- Function: java_bytecode_convert_classt::add_string_type
525
-
526
- Inputs: a name for the class such as "java.lang.String"
527
-
528
- Purpose: Implements the java.lang.String type in the case that
529
- we provide an internal implementation.
530
-
531
- \*******************************************************************/
532
-
533
- void java_bytecode_convert_classt::add_string_type (const irep_idt &class_name)
534
- {
535
- class_typet string_type;
536
- string_type.set_tag (class_name);
537
- string_type.components ().resize (3 );
538
- string_type.components ()[0 ].set_name (" @java.lang.Object" );
539
- string_type.components ()[0 ].set_pretty_name (" @java.lang.Object" );
540
- string_type.components ()[0 ].type ()=symbol_typet (" java::java.lang.Object" );
541
- string_type.components ()[1 ].set_name (" length" );
542
- string_type.components ()[1 ].set_pretty_name (" length" );
543
- string_type.components ()[1 ].type ()=java_int_type ();
544
- string_type.components ()[2 ].set_name (" data" );
545
- string_type.components ()[2 ].set_pretty_name (" data" );
546
- // Use a pointer-to-unbounded-array instead of a pointer-to-char.
547
- // Saves some casting in the string refinement algorithm but may
548
- // be unnecessary.
549
- string_type.components ()[2 ].type ()=pointer_typet (
550
- array_typet (java_char_type (), infinity_exprt (java_int_type ())));
551
- string_type.add_base (symbol_typet (" java::java.lang.Object" ));
552
-
553
- symbolt string_symbol;
554
- string_symbol.name =" java::" +id2string (class_name);
555
- string_symbol.base_name =id2string (class_name);
556
- string_symbol.type =string_type;
557
- string_symbol.is_type =true ;
558
-
559
- symbol_table.add (string_symbol);
560
-
561
- // Also add a stub of `String.equals` so that remove-virtual-functions
562
- // generates a check for Object.equals vs. String.equals.
563
- // No need to fill it in, as pass_preprocess will replace the calls again.
564
- symbolt string_equals_symbol;
565
- string_equals_symbol.name =
566
- " java::java.lang.String.equals:(Ljava/lang/Object;)Z" ;
567
- string_equals_symbol.base_name =id2string (class_name)+" .equals" ;
568
- string_equals_symbol.pretty_name =id2string (class_name)+" .equals" ;
569
- string_equals_symbol.mode =ID_java;
570
-
571
- code_typet string_equals_type;
572
- string_equals_type.return_type ()=java_boolean_type ();
573
- code_typet::parametert thisparam;
574
- thisparam.set_this ();
575
- thisparam.type ()=pointer_typet (symbol_typet (string_symbol.name ));
576
- code_typet::parametert otherparam;
577
- otherparam.type ()=pointer_typet (symbol_typet (" java::java.lang.Object" ));
578
- string_equals_type.parameters ().push_back (thisparam);
579
- string_equals_type.parameters ().push_back (otherparam);
580
- string_equals_symbol.type =std::move (string_equals_type);
581
-
582
- symbol_table.add (string_equals_symbol);
583
- }
0 commit comments