@@ -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
8989optionalt<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;
@@ -238,32 +234,29 @@ java_class_loadert::get_parse_tree(
238234 return parse_trees;
239235}
240236
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
243238// / \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 (
245240 const std::string &jar_path)
246241{
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 {} ;
250245
251246 classpath_entries.push_front (
252247 classpath_entryt (classpath_entryt::JAR, jar_path));
253248
254- for (const auto &e : jar_index-> get () )
255- operator ()(e. first );
249+ for (const auto &c : *classes )
250+ operator ()(c );
256251
257252 classpath_entries.pop_front ();
253+
254+ return *classes;
258255}
259256
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)
262259{
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-
267260 std::vector<std::string> filenames;
268261 try
269262 {
@@ -272,13 +265,13 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
272265 catch (const std::runtime_error &)
273266 {
274267 error () << " failed to open JAR file `" << jar_path << " '" << eom;
275- return jar_index_optcreft () ;
268+ return {} ;
276269 }
277270 debug () << " Adding JAR file `" << jar_path << " '" << eom;
278271
279272 // Create a new entry in the map and initialize using the list of file names
280273 // that are in jar_filet
281- jar_indext &jar_index = jars_by_path[jar_path] ;
274+ std::vector<irep_idt> classes ;
282275 for (auto &file_name : filenames)
283276 {
284277 if (has_suffix (file_name, " .class" ))
@@ -287,10 +280,10 @@ java_class_loadert::jar_index_optcreft java_class_loadert::read_jar_file(
287280 << " Found class file " << file_name << " in JAR `" << jar_path << " '"
288281 << eom;
289282 irep_idt class_name=file_to_class_name (file_name);
290- jar_index[ class_name] = file_name ;
283+ classes. push_back ( class_name) ;
291284 }
292285 }
293- return std::cref (jar_index) ;
286+ return classes ;
294287}
295288
296289// / 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)
330323// / file_to_class_name.
331324// / \param class_name: the name of the class
332325// / \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)
334347{
335348 std::string result=id2string (class_name);
336349
0 commit comments