@@ -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;
@@ -238,32 +234,29 @@ java_class_loadert::get_parse_tree(
238
234
return parse_trees;
239
235
}
240
236
241
- // / Load all class files from a .jar file, and store name of .jar in
242
- // / `classpath_entreies`.
237
+ // / Load all class files from a .jar file
243
238
// / \param jar_path: the path for the .jar to load
244
- void java_class_loadert::load_entire_jar (
239
+ std::vector<irep_idt> java_class_loadert::load_entire_jar (
245
240
const std::string &jar_path)
246
241
{
247
- jar_index_optcreft jar_index = read_jar_file (jar_path);
248
- if (!jar_index )
249
- return ;
242
+ auto classes = read_jar_file (jar_path);
243
+ if (!classes. has_value () )
244
+ return {} ;
250
245
251
246
classpath_entries.push_front (
252
247
classpath_entryt (classpath_entryt::JAR, jar_path));
253
248
254
- for (const auto &e : jar_index-> get () )
255
- operator ()(e. first );
249
+ for (const auto &c : *classes )
250
+ operator ()(c );
256
251
257
252
classpath_entries.pop_front ();
253
+
254
+ return *classes;
258
255
}
259
256
260
- java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file (
261
- const std::string &jar_path)
257
+ optionalt<std::vector<irep_idt>>
258
+ java_class_loadert::read_jar_file ( const std::string &jar_path)
262
259
{
263
- auto existing_it = jars_by_path.find (jar_path);
264
- if (existing_it != jars_by_path.end ())
265
- return std::cref (existing_it->second );
266
-
267
260
std::vector<std::string> filenames;
268
261
try
269
262
{
@@ -272,13 +265,13 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
272
265
catch (const std::runtime_error &)
273
266
{
274
267
error () << " failed to open JAR file `" << jar_path << " '" << eom;
275
- return jar_index_optcreft () ;
268
+ return {} ;
276
269
}
277
270
debug () << " Adding JAR file `" << jar_path << " '" << eom;
278
271
279
272
// Create a new entry in the map and initialize using the list of file names
280
273
// that are in jar_filet
281
- jar_indext &jar_index = jars_by_path[jar_path] ;
274
+ std::vector<irep_idt> classes ;
282
275
for (auto &file_name : filenames)
283
276
{
284
277
if (has_suffix (file_name, " .class" ))
@@ -287,10 +280,10 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
287
280
<< " Found class file " << file_name << " in JAR `" << jar_path << " '"
288
281
<< eom;
289
282
irep_idt class_name=file_to_class_name (file_name);
290
- jar_index[ class_name] = file_name ;
283
+ classes. push_back ( class_name) ;
291
284
}
292
285
}
293
- return std::cref (jar_index) ;
286
+ return classes ;
294
287
}
295
288
296
289
// / Convert a file name to the class name. Java interprets folders as packages,
@@ -330,7 +323,27 @@ std::string java_class_loadert::file_to_class_name(const std::string &file)
330
323
// / file_to_class_name.
331
324
// / \param class_name: the name of the class
332
325
// / \return the class name converted to file name
333
- 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)
334
347
{
335
348
std::string result=id2string (class_name);
336
349
0 commit comments