Skip to content

Commit 4538920

Browse files
Extract java_bytecode_language_optionst class
Extract java_bytecode_language_optionst class from java_bytecode_language class, to make it more structured by separating the fields that are expected to remain constant during the execution once they are initialized.
1 parent 20164f5 commit 4538920

File tree

3 files changed

+130
-107
lines changed

3 files changed

+130
-107
lines changed

jbmc/src/java_bytecode/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -666,12 +666,12 @@ and the methods in them. The methods, along with their parsed representation
666666
\ref java_bytecode_languaget::method_bytecode via a reference held in
667667
\ref java_bytecode_convert_classt::method_bytecode. typecheck then performs a
668668
switch over the value of
669-
[lazy_methods_mode](\ref java_bytecode_languaget::lazy_methods_mode) to
669+
[lazy_methods_mode](\ref java_bytecode_language_optionst::lazy_methods_mode) to
670670
determine which loading strategy to use.
671671

672672
\subsection eager-loading Eager loading
673673

674-
If [lazy_methods_mode](\ref java_bytecode_languaget::lazy_methods_mode) is
674+
If [lazy_methods_mode](\ref java_bytecode_language_optionst::lazy_methods_mode) is
675675
\ref java_bytecode_languaget::LAZY_METHODS_MODE_EAGER then eager loading is
676676
used. Under eager loading
677677
\ref java_bytecode_languaget::convert_single_method(const irep_idt &, symbol_table_baset &, lazy_class_to_declared_symbols_mapt &)
@@ -695,7 +695,7 @@ method parameters) and function references (at function call sites) to
695695
locate further classes and methods to load. The following paragraph describes
696696
the mechanism used.
697697

698-
If [lazy_methods_mode](\ref java_bytecode_languaget::lazy_methods_mode) is
698+
If [lazy_methods_mode](\ref java_bytecode_language_optionst::lazy_methods_mode) is
699699
\ref lazy_methods_modet::LAZY_METHODS_MODE_CONTEXT_INSENSITIVE then
700700
context-insensitive lazy loading is used. Under this stragegy
701701
\ref java_bytecode_languaget::do_ci_lazy_method_conversion is called to do all

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 85 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,10 @@ void lazy_class_to_declared_symbols_mapt::reinitialize()
132132
map.clear();
133133
}
134134

135-
/// Consume options that are java bytecode specific.
136-
void java_bytecode_languaget::set_language_options(const optionst &options)
135+
java_bytecode_language_optionst::java_bytecode_language_optionst(
136+
const optionst &options,
137+
messaget &log)
137138
{
138-
object_factory_parameters.set(options);
139-
140139
assume_inputs_non_null =
141140
options.get_bool_option("java-assume-inputs-non-null");
142141
string_refinement_enabled = options.get_bool_option("refine-strings");
@@ -182,9 +181,6 @@ void java_bytecode_languaget::set_language_options(const optionst &options)
182181
extra_entry_points.end(),
183182
std::back_inserter(extra_methods),
184183
build_load_method_by_regex);
185-
const auto &new_points = build_extra_entry_points(options);
186-
extra_methods.insert(
187-
extra_methods.end(), new_points.begin(), new_points.end());
188184

189185
java_cp_include_files = options.get_option("java-cp-include-files");
190186
if(!java_cp_include_files.empty())
@@ -195,7 +191,7 @@ void java_bytecode_languaget::set_language_options(const optionst &options)
195191
jsont json_cp_config;
196192
if(parse_json(
197193
java_cp_include_files.substr(1),
198-
get_message_handler(),
194+
log.get_message_handler(),
199195
json_cp_config))
200196
throw "cannot read JSON input configuration for JAR loading";
201197

@@ -224,17 +220,18 @@ void java_bytecode_languaget::set_language_options(const optionst &options)
224220
{
225221
const std::string filename = options.get_option("static-values");
226222
jsont tmp_json;
227-
if(parse_json(filename, *message_handler, tmp_json))
223+
if(parse_json(filename, log.get_message_handler(), tmp_json))
228224
{
229-
warning() << "Provided JSON file for static-values cannot be parsed; it"
230-
<< " will be ignored." << messaget::eom;
225+
log.warning()
226+
<< "Provided JSON file for static-values cannot be parsed; it"
227+
<< " will be ignored." << messaget::eom;
231228
}
232229
else
233230
{
234231
if(!tmp_json.is_object())
235232
{
236-
warning() << "Provided JSON file for static-values is not a JSON "
237-
<< "object; it will be ignored." << messaget::eom;
233+
log.warning() << "Provided JSON file for static-values is not a JSON "
234+
<< "object; it will be ignored." << messaget::eom;
238235
}
239236
else
240237
static_values_json = std::move(to_json_object(tmp_json));
@@ -246,8 +243,18 @@ void java_bytecode_languaget::set_language_options(const optionst &options)
246243

247244
if(options.is_set("context-include") || options.is_set("context-exclude"))
248245
method_in_context = get_context(options);
246+
}
249247

250-
language_options_initialized=true;
248+
/// Consume options that are java bytecode specific.
249+
void java_bytecode_languaget::set_language_options(const optionst &options)
250+
{
251+
object_factory_parameters.set(options);
252+
language_options = java_bytecode_language_optionst{options, *this};
253+
const auto &new_points = build_extra_entry_points(options);
254+
language_options->extra_methods.insert(
255+
language_options->extra_methods.end(),
256+
new_points.begin(),
257+
new_points.end());
251258
}
252259

253260
std::set<std::string> java_bytecode_languaget::extensions() const
@@ -283,17 +290,18 @@ bool java_bytecode_languaget::parse(
283290
std::istream &,
284291
const std::string &path)
285292
{
286-
PRECONDITION(language_options_initialized);
293+
PRECONDITION(language_options.has_value());
287294

288295
java_class_loader.clear_classpath();
289296

290297
for(const auto &p : config.java.classpath)
291298
java_class_loader.add_classpath_entry(p);
292299

293300
java_class_loader.set_message_handler(get_message_handler());
294-
java_class_loader.set_java_cp_include_files(java_cp_include_files);
295-
java_class_loader.add_load_classes(java_load_classes);
296-
if(string_refinement_enabled)
301+
java_class_loader.set_java_cp_include_files(
302+
language_options->java_cp_include_files);
303+
java_class_loader.add_load_classes(language_options->java_load_classes);
304+
if(language_options->string_refinement_enabled)
297305
{
298306
string_preprocess.initialize_known_type_table();
299307

@@ -314,8 +322,7 @@ bool java_bytecode_languaget::parse(
314322
{
315323
// build an object to potentially limit which classes are loaded
316324
java_class_loader_limitt class_loader_limit(
317-
get_message_handler(),
318-
java_cp_include_files);
325+
get_message_handler(), language_options->java_cp_include_files);
319326
if(config.java.main_class.empty())
320327
{
321328
// If we have an entry method, we can derive a main class.
@@ -331,8 +338,12 @@ bool java_bytecode_languaget::parse(
331338
std::string manifest_main_class = manifest["Main-Class"];
332339

333340
// if the manifest declares a Main-Class line, we got a main class
334-
if(!manifest_main_class.empty() && !ignore_manifest_main_class)
341+
if(
342+
!manifest_main_class.empty() &&
343+
!language_options->ignore_manifest_main_class)
344+
{
335345
main_class = manifest_main_class;
346+
}
336347
}
337348
}
338349
else
@@ -725,7 +736,7 @@ bool java_bytecode_languaget::typecheck(
725736
symbol_tablet &symbol_table,
726737
const std::string &)
727738
{
728-
PRECONDITION(language_options_initialized);
739+
PRECONDITION(language_options.has_value());
729740
// There are various cases in the Java front-end where pre-existing symbols
730741
// from a previous load are not handled. We just rule this case out for now;
731742
// a user wishing to ensure a particular class is loaded should use
@@ -738,7 +749,7 @@ bool java_bytecode_languaget::typecheck(
738749

739750
java_internal_additions(symbol_table);
740751

741-
if(string_refinement_enabled)
752+
if(language_options->string_refinement_enabled)
742753
string_preprocess.initialize_conversion_table();
743754

744755
// Must load java.lang.Object first to avoid stubbing
@@ -748,15 +759,14 @@ bool java_bytecode_languaget::typecheck(
748759
java_class_loader.get_class_with_overlays_map().find("java.lang.Object");
749760
if(it != java_class_loader.get_class_with_overlays_map().end())
750761
{
751-
if(
752-
java_bytecode_convert_class(
753-
it->second,
754-
symbol_table,
755-
get_message_handler(),
756-
max_user_array_length,
757-
method_bytecode,
758-
string_preprocess,
759-
no_load_classes))
762+
if(java_bytecode_convert_class(
763+
it->second,
764+
symbol_table,
765+
get_message_handler(),
766+
language_options->max_user_array_length,
767+
method_bytecode,
768+
string_preprocess,
769+
language_options->no_load_classes))
760770
{
761771
return true;
762772
}
@@ -769,15 +779,14 @@ bool java_bytecode_languaget::typecheck(
769779
if(class_trees.second.front().parsed_class.name.empty())
770780
continue;
771781

772-
if(
773-
java_bytecode_convert_class(
774-
class_trees.second,
775-
symbol_table,
776-
get_message_handler(),
777-
max_user_array_length,
778-
method_bytecode,
779-
string_preprocess,
780-
no_load_classes))
782+
if(java_bytecode_convert_class(
783+
class_trees.second,
784+
symbol_table,
785+
get_message_handler(),
786+
language_options->max_user_array_length,
787+
method_bytecode,
788+
string_preprocess,
789+
language_options->no_load_classes))
781790
{
782791
return true;
783792
}
@@ -852,7 +861,7 @@ bool java_bytecode_languaget::typecheck(
852861
for(java_bytecode_parse_treet &parse_tree : class_to_trees.second)
853862
{
854863
generate_constant_global_variables(
855-
parse_tree, symbol_table, string_refinement_enabled);
864+
parse_tree, symbol_table, language_options->string_refinement_enabled);
856865
}
857866
}
858867
status() << "Java: added "
@@ -888,14 +897,14 @@ bool java_bytecode_languaget::typecheck(
888897
create_static_initializer_symbols(
889898
symbol_table,
890899
synthetic_methods,
891-
threading_support,
892-
static_values_json.has_value());
900+
language_options->threading_support,
901+
language_options->static_values_json.has_value());
893902

894903
lazy_class_to_declared_symbols_mapt class_to_declared_symbols;
895904

896905
// Now incrementally elaborate methods
897906
// that are reachable from this entry point.
898-
switch(lazy_methods_mode)
907+
switch(language_options->lazy_methods_mode)
899908
{
900909
case LAZY_METHODS_MODE_CONTEXT_INSENSITIVE:
901910
// ci = context-insensitive
@@ -940,15 +949,17 @@ bool java_bytecode_languaget::typecheck(
940949
// now instrument runtime exceptions
941950
java_bytecode_instrument(
942951
symbol_table,
943-
throw_runtime_exceptions,
952+
language_options->throw_runtime_exceptions,
944953
get_message_handler());
945954

946955
// now typecheck all
947956
bool res = java_bytecode_typecheck(
948-
symbol_table, get_message_handler(), string_refinement_enabled);
957+
symbol_table,
958+
get_message_handler(),
959+
language_options->string_refinement_enabled);
949960

950961
// now instrument thread-blocks and synchronized methods.
951-
if(threading_support)
962+
if(language_options->threading_support)
952963
{
953964
convert_threadblock(symbol_table);
954965
convert_synchronized_methods(symbol_table, get_message_handler());
@@ -960,7 +971,7 @@ bool java_bytecode_languaget::typecheck(
960971
bool java_bytecode_languaget::generate_support_functions(
961972
symbol_tablet &symbol_table)
962973
{
963-
PRECONDITION(language_options_initialized);
974+
PRECONDITION(language_options.has_value());
964975

965976
symbol_table_buildert symbol_table_builder =
966977
symbol_table_buildert::wrap(symbol_table);
@@ -990,16 +1001,16 @@ bool java_bytecode_languaget::generate_support_functions(
9901001
symbol_table_builder,
9911002
main_class,
9921003
get_message_handler(),
993-
assume_inputs_non_null,
994-
assert_uncaught_exceptions,
1004+
language_options->assume_inputs_non_null,
1005+
language_options->assert_uncaught_exceptions,
9951006
object_factory_parameters,
9961007
get_pointer_type_selector(),
997-
string_refinement_enabled,
1008+
language_options->string_refinement_enabled,
9981009
[&](const symbolt &function, symbol_table_baset &symbol_table) {
9991010
return java_build_arguments(
10001011
function,
10011012
symbol_table,
1002-
assume_inputs_non_null,
1013+
language_options->assume_inputs_non_null,
10031014
object_factory_parameters,
10041015
get_pointer_type_selector(),
10051016
get_message_handler());
@@ -1040,9 +1051,9 @@ bool java_bytecode_languaget::do_ci_lazy_method_conversion(
10401051
symbol_table,
10411052
main_class,
10421053
main_jar_classes,
1043-
extra_methods,
1054+
language_options->extra_methods,
10441055
java_class_loader,
1045-
java_load_classes,
1056+
language_options->java_load_classes,
10461057
get_pointer_type_selector(),
10471058
get_message_handler(),
10481059
synthetic_methods);
@@ -1105,13 +1116,15 @@ void java_bytecode_languaget::convert_lazy_method(
11051116
java_bytecode_instrument_symbol(
11061117
symbol_table,
11071118
symbol_table.get_writeable_ref(function_id),
1108-
throw_runtime_exceptions,
1119+
language_options->throw_runtime_exceptions,
11091120
get_message_handler());
11101121
}
11111122

11121123
// now typecheck this function
11131124
java_bytecode_typecheck_updated_symbols(
1114-
symbol_table, get_message_handler(), string_refinement_enabled);
1125+
symbol_table,
1126+
get_message_handler(),
1127+
language_options->string_refinement_enabled);
11151128
}
11161129

11171130
/// Notify ci_lazy_methods, if present, of any static function calls made by
@@ -1174,7 +1187,9 @@ bool java_bytecode_languaget::convert_single_method(
11741187
lazy_class_to_declared_symbols_mapt &class_to_declared_symbols)
11751188
{
11761189
// Do not convert if method is not in context
1177-
if(method_in_context && !(*method_in_context)(id2string(function_id)))
1190+
if(
1191+
language_options->method_in_context &&
1192+
!(*language_options->method_in_context)(id2string(function_id)))
11781193
{
11791194
return false;
11801195
}
@@ -1222,21 +1237,21 @@ bool java_bytecode_languaget::convert_single_method(
12221237
switch(synthetic_method_it->second)
12231238
{
12241239
case synthetic_method_typet::STATIC_INITIALIZER_WRAPPER:
1225-
if(threading_support)
1240+
if(language_options->threading_support)
12261241
writable_symbol.value = get_thread_safe_clinit_wrapper_body(
12271242
function_id,
12281243
symbol_table,
1229-
nondet_static,
1230-
static_values_json.has_value(),
1244+
language_options->nondet_static,
1245+
language_options->static_values_json.has_value(),
12311246
object_factory_parameters,
12321247
get_pointer_type_selector(),
12331248
get_message_handler());
12341249
else
12351250
writable_symbol.value = get_clinit_wrapper_body(
12361251
function_id,
12371252
symbol_table,
1238-
nondet_static,
1239-
static_values_json.has_value(),
1253+
language_options->nondet_static,
1254+
language_options->static_values_json.has_value(),
12401255
object_factory_parameters,
12411256
get_pointer_type_selector(),
12421257
get_message_handler());
@@ -1248,13 +1263,14 @@ bool java_bytecode_languaget::convert_single_method(
12481263
INVARIANT(
12491264
class_name, "user_specified_clinit must be declared by a class.");
12501265
INVARIANT(
1251-
static_values_json.has_value(), "static-values JSON must be available");
1266+
language_options->static_values_json.has_value(),
1267+
"static-values JSON must be available");
12521268
writable_symbol.value = get_user_specified_clinit_body(
12531269
*class_name,
1254-
*static_values_json,
1270+
*language_options->static_values_json,
12551271
symbol_table,
12561272
needed_lazy_methods,
1257-
max_user_array_length,
1273+
language_options->max_user_array_length,
12581274
references,
12591275
class_to_declared_symbols.get(symbol_table));
12601276
break;
@@ -1307,12 +1323,12 @@ bool java_bytecode_languaget::convert_single_method(
13071323
cmb->get().method,
13081324
symbol_table,
13091325
get_message_handler(),
1310-
max_user_array_length,
1311-
throw_assertion_error,
1326+
language_options->max_user_array_length,
1327+
language_options->throw_assertion_error,
13121328
std::move(needed_lazy_methods),
13131329
string_preprocess,
13141330
class_hierarchy,
1315-
threading_support);
1331+
language_options->threading_support);
13161332
INVARIANT(declaring_class(symbol), "Method must have a declaring class.");
13171333
return false;
13181334
}

0 commit comments

Comments
 (0)