This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Invalidate method cache on C<local *subname>
[perl5.git] / t / op / method.t
index e957d82..f1b1888 100755 (executable)
@@ -4,7 +4,7 @@
 # test method calls and autoloading.
 #
 
-print "1..20\n";
+print "1..26\n";
 
 @A::ISA = 'B';
 @B::ISA = 'C';
@@ -25,6 +25,14 @@ test( A->d, "C::d");         # Update hash table;
 test (A->d, "D::d");           # Update hash table;
 
 {
+    local @A::ISA = qw(C);     # Update hash table with split() assignment
+    test (A->d, "C::d");
+    $#A::ISA = -1;
+    test (eval { A->d } || "fail", "fail");
+}
+test (A->d, "D::d");
+
+{
     local *B::d;
     eval 'sub B::d {"B::d1"}'; # Import now.
     test (A->d, "B::d1");      # Update hash table;
@@ -58,32 +66,38 @@ test (A->d, "B::d4");               # Update hash table;
 delete $B::{d};                        # Should work without any help too
 test (A->d, "C::d");
 
+{
+    local *C::d;
+    test (eval { A->d } || "nope", "nope");
+}
+test (A->d, "C::d");
+
 *A::x = *A::d;                 # See if cache incorrectly follows synonyms
 A->d;
 test (eval { A->x } || "nope", "nope");
 
 eval <<'EOF';
 sub C::e;
+BEGIN { *B::e = \&C::e }       # Shouldn't prevent AUTOLOAD in original pkg
 sub Y::f;
 $counter = 0;
 
-@Y::ISA = 'B';
-*Y::AUTOLOAD = *B::AUTOLOAD;
-
 @X::ISA = 'Y';
-*X::AUTOLOAD = *Y::AUTOLOAD;
+@Y::ISA = 'B';
 
 sub B::AUTOLOAD {
   my $c = ++$counter;
   my $method = $B::AUTOLOAD; 
-  *$B::AUTOLOAD = sub { "B: In $method, $c" };
-  goto &$B::AUTOLOAD;
+  my $msg = "B: In $method, $c";
+  eval "sub $method { \$msg }";
+  goto &$method;
 }
 sub C::AUTOLOAD {
   my $c = ++$counter;
   my $method = $C::AUTOLOAD; 
-  *$C::AUTOLOAD = sub { "C: In $method, $c" };
-  goto &$C::AUTOLOAD;
+  my $msg = "C: In $method, $c";
+  eval "sub $method { \$msg }";
+  goto &$method;
 }
 EOF
 
@@ -109,3 +123,6 @@ test(Y->f(), "B: In Y::f, 3");      # Which sticks
 
 test(A->eee(), "new B: In A::eee, 4"); # We get a correct $autoload
 test(A->eee(), "new B: In A::eee, 4"); # Which sticks
+
+# this test added due to bug discovery
+test(defined(@{"unknown_package::ISA"}) ? "defined" : "undefined", "undefined");