# HG changeset patch # User John W. Eaton # Date 1428009363 14400 # Thu Apr 02 17:16:03 2015 -0400 # Node ID cc01738df4ec10c13d0c716312c7a34e0e1bc703 # Parent 9c26eee65266890e1fcc97e35204566160ec9ecf only insert package names into loader map if package dir exists (bug #43769) * load-path.h, load-path.cc (load_path::::is_package): New function. (load_path::dir_info::is_package): New function. (load_path::get_loader): Don't insert name into loader map unless is it is also a +package directory somewhere in the load path. * ov-classdef.cc (cdef_manager::do_find_package_symbol): Undo change from changeset 8fe29850fb74. diff --git a/libinterp/corefcn/load-path.cc b/libinterp/corefcn/load-path.cc --- a/libinterp/corefcn/load-path.cc +++ b/libinterp/corefcn/load-path.cc @@ -109,6 +109,12 @@ load_path::dir_info::update (void) } } +bool +load_path::dir_info::is_package (const std::string& name) const +{ + return package_dir_map.find (name) != package_dir_map.end (); +} + void load_path::dir_info::initialize (void) { @@ -1218,6 +1224,20 @@ load_path::loader::methods (const std::s return retval; } +bool +load_path::is_package (const std::string& name) const +{ + for (const_dir_info_list_iterator p = dir_info_list.begin (); + p != dir_info_list.end (); + p++) + { + if (p->is_package (name)) + return true; + } + + return false; +} + std::list load_path::do_overloads (const std::string& meth) const { diff --git a/libinterp/corefcn/load-path.h b/libinterp/corefcn/load-path.h --- a/libinterp/corefcn/load-path.h +++ b/libinterp/corefcn/load-path.h @@ -395,6 +395,8 @@ private: method_file_map_type method_file_map; package_dir_map_type package_dir_map; + bool is_package (const std::string& name) const; + private: void initialize (void); @@ -658,9 +660,11 @@ private: check_file_type (std::string& fname, int type, int possible_types, const std::string& fcn, const char *who); + bool is_package (const std::string& name) const; + loader& get_loader (const std::string& name) const { - if (! name.empty ()) + if (! name.empty () && is_package (name)) { loader_map_iterator l = loader_map.find (name); diff --git a/libinterp/octave-value/ov-classdef.cc b/libinterp/octave-value/ov-classdef.cc --- a/libinterp/octave-value/ov-classdef.cc +++ b/libinterp/octave-value/ov-classdef.cc @@ -3978,7 +3978,7 @@ cdef_manager::do_find_package_symbol (co { octave_function* retval = 0; - cdef_package pack = find_package (pack_name, false, false); + cdef_package pack = find_package (pack_name, false); if (pack.ok ()) retval = new octave_classdef_meta (pack);