Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix assorted bugs related to not having a UNIVERSAL::import
Since perl 5.0 the methods "import" and "unimport" have been special cased in gv.c (unimport was removed for a while) to not produce errors if they are called. This is partly because use Foo; is defined to be BEGIN { require Foo; Foo->import(); } which would blow up if there is no import function defined in Foo, for instance if it were defining a class and not a package which exports modules. This special case can be broken by simple code like \&UNIVERSAL::isa which will create a stub function which then blows up when it is used. Notably the module "autouse" which is shipped with perl will trigger this behavior. A related issue is that if you ask for a function to be exported from a module that does not have support for exporting there is no error, eg: use File::Spec qw(catfile); will silently succeed without exporting a catfile function. This is exacerbated on case insensitive file systems when the module name is case-mismatched, the use succeeds but the export does not, leading to confusion, eg: use LIst::Util qw(sum); will load List::Util but will not export the sum function. This patch defines UNIVERSAL::import() and UNIVERSAL::unimport() functions. This prevents the "reference to \&UNIVERSAL::import" bug. The function is defined to be a no-op unless arguments are passed into the functions, in which case a warning is thrown indicating that there is likely a problem. The error is modelled after the error produced by calling a non-existent method or function: ./perl -Ilib -le'BEGIN{ my $import_sub= \&UNIVERSAL::import;} use File::Spec qw(catfile);' Attempt to call UNIVERSAL::import() with arguments via package File::Spec (Perhaps you forgot to load "File::Spec"?) at -e line 1. BEGIN failed--compilation aborted at -e line 1. This fixes Issue #19416, Issue #19417, Issue #19418. See also Issue #19410 for discussion, however this patch does not fix that case (it may not be fixable.)
- Loading branch information