@@ -88,17 +88,16 @@ void java_class_loadert::add_classpath_entry(const std::string &path)
88
88
// / \return optional value of parse tree, empty if class cannot be loaded
89
89
optionalt<java_bytecode_parse_treet> java_class_loadert::get_class_from_jar (
90
90
const irep_idt &class_name,
91
- const std::string &jar_file,
92
- const jar_indext &jar_index)
91
+ const std::string &jar_file)
93
92
{
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 ())
96
95
return {};
97
96
98
97
debug ()
99
98
<< " Getting class `" << class_name << " ' from JAR " << jar_file << eom;
100
99
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) );
102
101
103
102
if (!data.has_value ())
104
103
return {};
@@ -137,7 +136,7 @@ java_class_loadert::get_parse_tree(
137
136
PRECONDITION (parse_trees.empty ());
138
137
139
138
// 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)))
141
140
{
142
141
debug () << " not loading " << class_name << " because of limit" << eom;
143
142
java_bytecode_parse_treet parse_tree;
@@ -153,11 +152,8 @@ java_class_loadert::get_parse_tree(
153
152
{
154
153
case classpath_entryt::JAR:
155
154
{
156
- jar_index_optcreft index = read_jar_file (cp_entry.path );
157
- if (!index )
158
- continue ;
159
155
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 );
161
157
if (parse_tree)
162
158
parse_trees.emplace_back (std::move (*parse_tree));
163
159
}
@@ -166,7 +162,7 @@ java_class_loadert::get_parse_tree(
166
162
case classpath_entryt::DIRECTORY:
167
163
{
168
164
// 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);
170
166
const std::string full_path =
171
167
#ifdef _WIN32
172
168
cp_entry.path + ' \\ ' + class_file;
@@ -243,33 +239,24 @@ java_class_loadert::get_parse_tree(
243
239
std::vector<irep_idt> java_class_loadert::load_entire_jar (
244
240
const std::string &jar_path)
245
241
{
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 () )
248
244
return {};
249
245
250
246
classpath_entries.push_front (
251
247
classpath_entryt (classpath_entryt::JAR, jar_path));
252
248
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);
260
251
261
252
classpath_entries.pop_front ();
262
253
263
- return classes;
254
+ return * classes;
264
255
}
265
256
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)
268
259
{
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
-
273
260
std::vector<std::string> filenames;
274
261
try
275
262
{
@@ -278,13 +265,13 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
278
265
catch (const std::runtime_error &)
279
266
{
280
267
error () << " failed to open JAR file `" << jar_path << " '" << eom;
281
- return jar_index_optcreft () ;
268
+ return {} ;
282
269
}
283
270
debug () << " Adding JAR file `" << jar_path << " '" << eom;
284
271
285
272
// Create a new entry in the map and initialize using the list of file names
286
273
// that are in jar_filet
287
- jar_indext &jar_index = jars_by_path[jar_path] ;
274
+ std::vector<irep_idt> classes ;
288
275
for (auto &file_name : filenames)
289
276
{
290
277
if (has_suffix (file_name, " .class" ))
@@ -293,10 +280,10 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
293
280
<< " Found class file " << file_name << " in JAR `" << jar_path << " '"
294
281
<< eom;
295
282
irep_idt class_name=file_to_class_name (file_name);
296
- jar_index[ class_name] = file_name ;
283
+ classes. push_back ( class_name) ;
297
284
}
298
285
}
299
- return std::cref (jar_index) ;
286
+ return classes ;
300
287
}
301
288
302
289
// / 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)
336
323
// / file_to_class_name.
337
324
// / \param class_name: the name of the class
338
325
// / \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)
340
347
{
341
348
std::string result=id2string (class_name);
342
349
0 commit comments