Skip to content

Commit b0a0a9b

Browse files
committed
java_class_loader(_base)t isn't a messaget
Pass a message handler as an argument to several of their functions, but do not construct a messaget object without a configured message handler as that is deprecated.
1 parent 5d517bf commit b0a0a9b

File tree

5 files changed

+104
-30
lines changed

5 files changed

+104
-30
lines changed

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,13 +330,16 @@ void java_bytecode_languaget::initialize_class_loader()
330330
for(const auto &p : config.java.classpath)
331331
java_class_loader.add_classpath_entry(p);
332332

333+
<<<<<<< HEAD
333334
<<<<<<< HEAD
334335
java_class_loader.set_java_cp_include_files(
335336
language_options->java_cp_include_files);
336337
java_class_loader.add_load_classes(language_options->java_load_classes);
337338
if(language_options->string_refinement_enabled)
338339
=======
339340
java_class_loader.set_message_handler(message_handler);
341+
=======
342+
>>>>>>> java_class_loader(_base)t isn't a messaget
340343
java_class_loader.set_java_cp_include_files(java_cp_include_files);
341344
java_class_loader.add_load_classes(java_load_classes);
342345
if(string_refinement_enabled)
@@ -469,7 +472,7 @@ bool java_bytecode_languaget::parse(
469472
messaget log(message_handler);
470473
log.status() << "JAR file without entry point: loading class files"
471474
<< messaget::eom;
472-
const auto classes = java_class_loader.load_entire_jar(path);
475+
const auto classes = java_class_loader.load_entire_jar(path, message_handler);
473476
for(const auto &c : classes)
474477
main_jar_classes.push_back(c);
475478
}
@@ -486,7 +489,7 @@ bool java_bytecode_languaget::parse(
486489
{
487490
messaget log(message_handler);
488491
log.status() << "Java main class: " << main_class << messaget::eom;
489-
java_class_loader(main_class);
492+
java_class_loader(main_class, message_handler);
490493
}
491494
>>>>>>> languaget is not a messaget
492495
@@ -1665,10 +1668,10 @@ bool java_bytecode_languaget::final(symbol_table_baset &)
16651668
return false;
16661669
}
16671670

1668-
void java_bytecode_languaget::show_parse(std::ostream &out, message_handlert &)
1671+
void java_bytecode_languaget::show_parse(std::ostream &out, message_handlert &message_handler)
16691672
{
16701673
java_class_loadert::parse_tree_with_overlayst &parse_trees =
1671-
java_class_loader(main_class);
1674+
java_class_loader(main_class, message_handler);
16721675
parse_trees.front().output(out);
16731676
if(parse_trees.size() > 1)
16741677
{

jbmc/src/java_bytecode/java_class_loader.cpp

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ Author: Daniel Kroening, [email protected]
1717
#include "java_bytecode_parser.h"
1818

1919
java_class_loadert::parse_tree_with_overlayst &java_class_loadert::operator()(
20-
const irep_idt &class_name)
20+
const irep_idt &class_name,
21+
message_handlert &message_handler)
2122
{
2223
debug() << "Classpath:";
2324
for(const auto &entry : classpath_entries)
@@ -44,7 +45,7 @@ java_class_loadert::parse_tree_with_overlayst &java_class_loadert::operator()(
4445
queue.push(id);
4546

4647
java_class_loader_limitt class_loader_limit(
47-
get_message_handler(), java_cp_include_files);
48+
message_handler, java_cp_include_files);
4849

4950
while(!queue.empty())
5051
{
@@ -54,10 +55,11 @@ java_class_loadert::parse_tree_with_overlayst &java_class_loadert::operator()(
5455
if(class_map.count(c) != 0)
5556
continue;
5657

57-
debug() << "Reading class " << c << eom;
58+
messaget log(message_handler);
59+
log.debug() << "Reading class " << c << messaget::eom;
5860

5961
parse_tree_with_overlayst &parse_trees =
60-
get_parse_tree(class_loader_limit, c);
62+
get_parse_tree(class_loader_limit, c, message_handler);
6163

6264
// Add any dependencies to queue
6365
for(const java_bytecode_parse_treet &parse_tree : parse_trees)
@@ -121,6 +123,7 @@ bool java_class_loadert::can_load_class(const irep_idt &class_name)
121123
/// to find the .class file.
122124
/// \param class_loader_limit: Filter to decide whether to load classes
123125
/// \param class_name: Name of class to load
126+
/// \param message_handler: message handler
124127
/// \return The list of valid implementations, including overlays
125128
/// \remarks
126129
/// Allows multiple definitions of the same class to appear on the
@@ -129,23 +132,26 @@ bool java_class_loadert::can_load_class(const irep_idt &class_name)
129132
java_class_loadert::parse_tree_with_overlayst &
130133
java_class_loadert::get_parse_tree(
131134
java_class_loader_limitt &class_loader_limit,
132-
const irep_idt &class_name)
135+
const irep_idt &class_name,
136+
message_handlert &message_handler)
133137
{
134138
parse_tree_with_overlayst &parse_trees = class_map[class_name];
135139
PRECONDITION(parse_trees.empty());
136140

141+
messaget log(message_handler);
142+
137143
// do we refuse to load?
138144
if(!class_loader_limit.load_class_file(class_name_to_jar_file(class_name)))
139145
{
140-
debug() << "not loading " << class_name << " because of limit" << eom;
146+
log.debug() << "not loading " << class_name << " because of limit" << messaget::eom;
141147
parse_trees.emplace_back(class_name);
142148
return parse_trees;
143149
}
144150

145151
// Rummage through the class path
146152
for(const auto &cp_entry : classpath_entries)
147153
{
148-
auto parse_tree = load_class(class_name, cp_entry);
154+
auto parse_tree = load_class(class_name, cp_entry, message_handler);
149155
if(parse_tree.has_value())
150156
parse_trees.emplace_back(std::move(*parse_tree));
151157
}
@@ -164,10 +170,18 @@ java_class_loadert::get_parse_tree(
164170
++parse_tree_it;
165171
break;
166172
}
173+
<<<<<<< HEAD
167174
debug() << "Skipping class " << class_name
168175
<< " marked with OverlayClassImplementation but found before"
169176
" original definition"
170177
<< eom;
178+
=======
179+
log.warning()
180+
<< "Skipping class " << class_name
181+
<< " marked with OverlayClassImplementation but found before"
182+
" original definition"
183+
<< messaget::eom;
184+
>>>>>>> java_class_loader(_base)t isn't a messaget
171185
}
172186
auto unloaded_or_overlay_out_of_order_it = parse_tree_it;
173187
++parse_tree_it;
@@ -179,8 +193,14 @@ java_class_loadert::get_parse_tree(
179193
// Remove non-initial classes that aren't overlays
180194
if(!is_overlay_class(parse_tree_it->parsed_class))
181195
{
196+
<<<<<<< HEAD
182197
debug() << "Skipping duplicate definition of class " << class_name
183198
<< " not marked with OverlayClassImplementation" << eom;
199+
=======
200+
log.warning()
201+
<< "Skipping duplicate definition of class " << class_name
202+
<< " not marked with OverlayClassImplementation" << messaget::eom;
203+
>>>>>>> java_class_loader(_base)t isn't a messaget
184204
auto duplicate_non_overlay_it = parse_tree_it;
185205
++parse_tree_it;
186206
parse_trees.erase(duplicate_non_overlay_it);
@@ -192,45 +212,60 @@ java_class_loadert::get_parse_tree(
192212
return parse_trees;
193213
194214
// Not found or failed to load
215+
<<<<<<< HEAD
195216
debug() << "failed to load class " << class_name << eom;
217+
=======
218+
log.warning() << "failed to load class `" << class_name << '\'' << messaget::eom;
219+
>>>>>>> java_class_loader(_base)t isn't a messaget
196220
parse_trees.emplace_back(class_name);
197221
return parse_trees;
198222
}
199223
200224
/// Load all class files from a .jar file
201225
/// \param jar_path: the path for the .jar to load
202226
std::vector<irep_idt> java_class_loadert::load_entire_jar(
203-
const std::string &jar_path)
227+
const std::string &jar_path,
228+
message_handlert &message_handler)
204229
{
205-
auto classes = read_jar_file(jar_path);
230+
auto classes = read_jar_file(jar_path, message_handler);
206231
if(!classes.has_value())
207232
return {};
208233
209234
classpath_entries.push_front(
210235
classpath_entryt(classpath_entryt::JAR, jar_path));
211236
212237
for(const auto &c : *classes)
213-
operator()(c);
238+
operator()(c, message_handler);
214239
215240
classpath_entries.pop_front();
216241
217242
return *classes;
218243
}
219244
220245
optionalt<std::vector<irep_idt>>
221-
java_class_loadert::read_jar_file(const std::string &jar_path)
246+
java_class_loadert::read_jar_file(const std::string &jar_path,
247+
message_handlert &message_handler)
222248
{
249+
messaget log(message_handler);
250+
223251
std::vector<std::string> filenames;
224252
try
225253
{
226254
filenames = jar_pool(jar_path).filenames();
227255
}
228256
catch(const std::runtime_error &)
229257
{
258+
<<<<<<< HEAD
230259
error() << "failed to open JAR file '" << jar_path << "'" << eom;
231260
return {};
232261
}
233262
debug() << "Adding JAR file '" << jar_path << "'" << eom;
263+
=======
264+
log.error() << "failed to open JAR file `" << jar_path << "'" << messaget::eom;
265+
return {};
266+
}
267+
log.debug() << "Adding JAR file `" << jar_path << "'" << messaget::eom;
268+
>>>>>>> java_class_loader(_base)t isn't a messaget
234269

235270
// Create a new entry in the map and initialize using the list of file names
236271
// that are in jar_filet
@@ -239,8 +274,14 @@ java_class_loadert::read_jar_file(const std::string &jar_path)
239274
{
240275
if(has_suffix(file_name, ".class"))
241276
{
277+
<<<<<<< HEAD
242278
debug() << "Found class file " << file_name << " in JAR '" << jar_path
243279
<< "'" << eom;
280+
=======
281+
log.debug()
282+
<< "Found class file " << file_name << " in JAR `" << jar_path << "'"
283+
<< messaget::eom;
284+
>>>>>>> java_class_loader(_base)t isn't a messaget
244285
irep_idt class_name=file_to_class_name(file_name);
245286
classes.push_back(class_name);
246287
}

jbmc/src/java_bytecode/java_class_loader.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ class java_class_loadert : public java_class_loader_baset
4141
{
4242
}
4343

44-
parse_tree_with_overlayst &operator()(const irep_idt &class_name);
44+
parse_tree_with_overlayst &operator()(const irep_idt &class_name, message_handlert &);
4545

4646
/// Checks whether \p class_name is parseable from the classpath,
4747
/// ignoring class loading limits.
4848
bool can_load_class(const irep_idt &class_name);
4949

5050
parse_tree_with_overlayst &get_parse_tree(
5151
java_class_loader_limitt &class_loader_limit,
52-
const irep_idt &class_name);
52+
const irep_idt &class_name, message_handlert &);
5353

5454
/// Set the argument of the class loader limit \ref java_class_loader_limitt
5555
/// \param cp_include_files: argument string for java_class_loader_limit
@@ -74,7 +74,7 @@ class java_class_loadert : public java_class_loader_baset
7474
java_load_classes.push_back(id);
7575
}
7676

77-
std::vector<irep_idt> load_entire_jar(const std::string &jar_path);
77+
std::vector<irep_idt> load_entire_jar(const std::string &jar_path, message_handlert &);
7878

7979
/// Map from class names to the bytecode parse trees
8080
fixed_keys_map_wrappert<parse_tree_with_overridest_mapt>
@@ -103,7 +103,7 @@ class java_class_loadert : public java_class_loader_baset
103103
/// Map from class names to the bytecode parse trees
104104
parse_tree_with_overridest_mapt class_map;
105105

106-
optionalt<std::vector<irep_idt>> read_jar_file(const std::string &jar_path);
106+
optionalt<std::vector<irep_idt>> read_jar_file(const std::string &jar_path, message_handlert &);
107107
};
108108

109109
#endif // CPROVER_JAVA_BYTECODE_JAVA_CLASS_LOADER_H

jbmc/src/java_bytecode/java_class_loader_base.cpp

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ Author: Daniel Kroening, [email protected]
1212
#include "java_bytecode_parser.h"
1313

1414
#include <util/file_util.h>
15+
<<<<<<< HEAD
1516
#include <util/prefix.h>
17+
=======
18+
#include <util/message.h>
19+
>>>>>>> java_class_loader(_base)t isn't a messaget
1620
#include <util/suffix.h>
1721

1822
#include <fstream>
@@ -127,15 +131,16 @@ java_class_loader_baset::class_name_to_os_file(const irep_idt &class_name)
127131
/// attempt to load a class from a classpath_entry
128132
optionalt<java_bytecode_parse_treet> java_class_loader_baset::load_class(
129133
const irep_idt &class_name,
130-
const classpath_entryt &cp_entry)
134+
const classpath_entryt &cp_entry,
135+
message_handlert &message_handler)
131136
{
132137
switch(cp_entry.kind)
133138
{
134139
case classpath_entryt::JAR:
135-
return get_class_from_jar(class_name, cp_entry.path);
140+
return get_class_from_jar(class_name, cp_entry.path, message_handler);
136141

137142
case classpath_entryt::DIRECTORY:
138-
return get_class_from_directory(class_name, cp_entry.path);
143+
return get_class_from_directory(class_name, cp_entry.path, message_handler);
139144
}
140145

141146
UNREACHABLE;
@@ -144,12 +149,16 @@ optionalt<java_bytecode_parse_treet> java_class_loader_baset::load_class(
144149
/// Load class from jar file.
145150
/// \param class_name: name of class to load in Java source format
146151
/// \param jar_file: path of the jar file
152+
/// \param message_handler: message handler
147153
/// \return optional value of parse tree, empty if class cannot be loaded
148154
optionalt<java_bytecode_parse_treet>
149155
java_class_loader_baset::get_class_from_jar(
150156
const irep_idt &class_name,
151-
const std::string &jar_file)
157+
const std::string &jar_file,
158+
message_handlert &message_handler)
152159
{
160+
messaget log(message_handler);
161+
153162
try
154163
{
155164
auto &jar = jar_pool(jar_file);
@@ -158,6 +167,7 @@ java_class_loader_baset::get_class_from_jar(
158167
if(!data.has_value())
159168
return {};
160169

170+
<<<<<<< HEAD
161171
debug() << "Getting class '" << class_name << "' from JAR " << jar_file
162172
<< eom;
163173

@@ -167,28 +177,48 @@ java_class_loader_baset::get_class_from_jar(
167177
catch(const std::runtime_error &)
168178
{
169179
error() << "failed to open JAR file '" << jar_file << "'" << eom;
180+
=======
181+
log.debug() << "Getting class `" << class_name << "' from JAR " << jar_file
182+
<< messaget::eom;
183+
184+
std::istringstream istream(*data);
185+
return java_bytecode_parse(istream, message_handler);
186+
}
187+
catch(const std::runtime_error &)
188+
{
189+
log.error() << "failed to open JAR file `" << jar_file << "'" << messaget::eom;
190+
>>>>>>> java_class_loader(_base)t isn't a messaget
170191
return {};
171192
}
172193
}
173194
174195
/// Load class from directory.
175196
/// \param class_name: name of class to load in Java source format
176197
/// \param path: directory to load from
198+
/// \param message_handler: message handler
177199
/// \return optional value of parse tree, empty if class cannot be loaded
178200
optionalt<java_bytecode_parse_treet>
179201
java_class_loader_baset::get_class_from_directory(
180202
const irep_idt &class_name,
181-
const std::string &path)
203+
const std::string &path,
204+
message_handlert &message_handler)
182205
{
183206
// Look in the given directory
184207
const std::string class_file = class_name_to_os_file(class_name);
185208
const std::string full_path = concat_dir_file(path, class_file);
186209
187210
if(std::ifstream(full_path))
188211
{
212+
<<<<<<< HEAD
189213
debug() << "Getting class '" << class_name << "' from file " << full_path
190214
<< eom;
191215
return java_bytecode_parse(full_path, class_name, get_message_handler());
216+
=======
217+
messaget log(message_handler);
218+
log.debug() << "Getting class `" << class_name << "' from file " << full_path
219+
<< messaget::eom;
220+
return java_bytecode_parse(full_path, message_handler);
221+
>>>>>>> java_class_loader(_base)t isn't a messaget
192222
}
193223
else
194224
return {};

0 commit comments

Comments
 (0)