Skip to content

Commit 8d2a748

Browse files
author
Daniel Kroening
committed
removed jar_indext types and data structures
1 parent 27d0ae0 commit 8d2a748

File tree

2 files changed

+44
-53
lines changed

2 files changed

+44
-53
lines changed

jbmc/src/java_bytecode/java_class_loader.cpp

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,16 @@ void java_class_loadert::add_classpath_entry(const std::string &path)
8888
/// \return optional value of parse tree, empty if class cannot be loaded
8989
optionalt<java_bytecode_parse_treet> java_class_loadert::get_class_from_jar(
9090
const irep_idt &class_name,
91-
const std::string &jar_file,
92-
const jar_indext &jar_index)
91+
const std::string &jar_file)
9392
{
94-
auto jar_index_it = jar_index.find(class_name);
95-
if(jar_index_it == jar_index.end())
93+
auto classes = read_jar_file(jar_file);
94+
if(!classes.has_value())
9695
return {};
9796

9897
debug()
9998
<< "Getting class `" << class_name << "' from JAR " << jar_file << eom;
10099

101-
auto data = jar_pool(jar_file).get_entry(jar_index_it->second);
100+
auto data = jar_pool(jar_file).get_entry(class_name_to_jar_file(class_name));
102101

103102
if(!data.has_value())
104103
return {};
@@ -137,7 +136,7 @@ java_class_loadert::get_parse_tree(
137136
PRECONDITION(parse_trees.empty());
138137

139138
// do we refuse to load?
140-
if(!class_loader_limit.load_class_file(class_name_to_file(class_name)))
139+
if(!class_loader_limit.load_class_file(class_name_to_jar_file(class_name)))
141140
{
142141
debug() << "not loading " << class_name << " because of limit" << eom;
143142
java_bytecode_parse_treet parse_tree;
@@ -153,11 +152,8 @@ java_class_loadert::get_parse_tree(
153152
{
154153
case classpath_entryt::JAR:
155154
{
156-
jar_index_optcreft index = read_jar_file(cp_entry.path);
157-
if(!index)
158-
continue;
159155
optionalt<java_bytecode_parse_treet> parse_tree =
160-
get_class_from_jar(class_name, cp_entry.path, *index);
156+
get_class_from_jar(class_name, cp_entry.path);
161157
if(parse_tree)
162158
parse_trees.emplace_back(std::move(*parse_tree));
163159
}
@@ -166,7 +162,7 @@ java_class_loadert::get_parse_tree(
166162
case classpath_entryt::DIRECTORY:
167163
{
168164
// Look in the given directory
169-
const std::string class_file = class_name_to_file(class_name);
165+
const std::string class_file = class_name_to_os_file(class_name);
170166
const std::string full_path =
171167
#ifdef _WIN32
172168
cp_entry.path + '\\' + class_file;
@@ -243,33 +239,24 @@ java_class_loadert::get_parse_tree(
243239
std::vector<irep_idt> java_class_loadert::load_entire_jar(
244240
const std::string &jar_path)
245241
{
246-
jar_index_optcreft jar_index = read_jar_file(jar_path);
247-
if(!jar_index)
242+
auto classes = read_jar_file(jar_path);
243+
if(!classes.has_value())
248244
return {};
249245

250246
classpath_entries.push_front(
251247
classpath_entryt(classpath_entryt::JAR, jar_path));
252248

253-
std::vector<irep_idt> classes;
254-
255-
for(const auto &e : jar_index->get())
256-
{
257-
operator()(e.first);
258-
classes.push_back(e.first);
259-
}
249+
for(const auto &c : *classes)
250+
operator()(c);
260251

261252
classpath_entries.pop_front();
262253

263-
return classes;
254+
return *classes;
264255
}
265256

266-
java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
267-
const std::string &jar_path)
257+
optionalt<std::vector<irep_idt>>
258+
java_class_loadert::read_jar_file(const std::string &jar_path)
268259
{
269-
auto existing_it = jars_by_path.find(jar_path);
270-
if(existing_it != jars_by_path.end())
271-
return std::cref(existing_it->second);
272-
273260
std::vector<std::string> filenames;
274261
try
275262
{
@@ -278,13 +265,13 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
278265
catch(const std::runtime_error &)
279266
{
280267
error() << "failed to open JAR file `" << jar_path << "'" << eom;
281-
return jar_index_optcreft();
268+
return {};
282269
}
283270
debug() << "Adding JAR file `" << jar_path << "'" << eom;
284271

285272
// Create a new entry in the map and initialize using the list of file names
286273
// that are in jar_filet
287-
jar_indext &jar_index = jars_by_path[jar_path];
274+
std::vector<irep_idt> classes;
288275
for(auto &file_name : filenames)
289276
{
290277
if(has_suffix(file_name, ".class"))
@@ -293,10 +280,10 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
293280
<< "Found class file " << file_name << " in JAR `" << jar_path << "'"
294281
<< eom;
295282
irep_idt class_name=file_to_class_name(file_name);
296-
jar_index[class_name] = file_name;
283+
classes.push_back(class_name);
297284
}
298285
}
299-
return std::cref(jar_index);
286+
return classes;
300287
}
301288

302289
/// Convert a file name to the class name. Java interprets folders as packages,
@@ -336,7 +323,27 @@ std::string java_class_loadert::file_to_class_name(const std::string &file)
336323
/// file_to_class_name.
337324
/// \param class_name: the name of the class
338325
/// \return the class name converted to file name
339-
std::string java_class_loadert::class_name_to_file(const irep_idt &class_name)
326+
std::string
327+
java_class_loadert::class_name_to_jar_file(const irep_idt &class_name)
328+
{
329+
std::string result = id2string(class_name);
330+
331+
// dots (package name separators) to slash
332+
for(std::string::iterator it = result.begin(); it != result.end(); it++)
333+
if(*it == '.')
334+
*it = '/';
335+
336+
// add .class suffix
337+
result += ".class";
338+
339+
return result;
340+
}
341+
342+
/// Convert a class name to a file name, with OS-dependent syntax
343+
/// \param class_name: the name of the class
344+
/// \return the class name converted to file name
345+
std::string
346+
java_class_loadert::class_name_to_os_file(const irep_idt &class_name)
340347
{
341348
std::string result=id2string(class_name);
342349

jbmc/src/java_bytecode/java_class_loader.h

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ Author: Daniel Kroening, [email protected]
2727
class java_class_loadert:public messaget
2828
{
2929
public:
30-
/// A map associating logical class names with the name of the .class file
31-
/// implementing it for all classes inside a single JAR file
32-
typedef std::map<irep_idt, std::string> jar_indext;
33-
3430
/// A list of parse trees supporting overlay classes
3531
typedef std::list<java_bytecode_parse_treet> parse_tree_with_overlayst;
3632
/// A map from class names to list of parse tree where multiple entries can
@@ -95,14 +91,11 @@ class java_class_loadert:public messaget
9591
void add_classpath_entry(const std::string &);
9692

9793
static std::string file_to_class_name(const std::string &);
98-
static std::string class_name_to_file(const irep_idt &);
94+
static std::string class_name_to_os_file(const irep_idt &);
95+
static std::string class_name_to_jar_file(const irep_idt &);
9996

10097
std::vector<irep_idt> load_entire_jar(const std::string &jar_path);
10198

102-
const jar_indext &get_jar_index(const std::string &jar_path)
103-
{
104-
return jars_by_path.at(jar_path);
105-
}
10699
/// Map from class names to the bytecode parse trees
107100
fixed_keys_map_wrappert<parse_tree_with_overridest_mapt>
108101
get_class_with_overlays_map()
@@ -146,22 +139,13 @@ class java_class_loadert:public messaget
146139
std::vector<irep_idt> java_load_classes;
147140
get_extra_class_refs_functiont get_extra_class_refs;
148141

149-
/// The jar_indext for each jar file we've read
150-
std::map<std::string, jar_indext> jars_by_path;
151-
152142
/// Map from class names to the bytecode parse trees
153143
parse_tree_with_overridest_mapt class_map;
154144

155-
typedef optionalt<std::reference_wrapper<const jar_indext>>
156-
jar_index_optcreft;
157-
158-
jar_index_optcreft read_jar_file(
159-
const std::string &jar_path);
145+
optionalt<std::vector<irep_idt>> read_jar_file(const std::string &jar_path);
160146

161-
optionalt<java_bytecode_parse_treet> get_class_from_jar(
162-
const irep_idt &class_name,
163-
const std::string &jar_file,
164-
const jar_indext &jar_index);
147+
optionalt<java_bytecode_parse_treet>
148+
get_class_from_jar(const irep_idt &class_name, const std::string &jar_file);
165149
};
166150

167151
#endif // CPROVER_JAVA_BYTECODE_JAVA_CLASS_LOADER_H

0 commit comments

Comments
 (0)