[patch] xsub AUTOLOAD fix/optimization
Doug MacEachern [Sat, 6 Jan 2001 09:30:05 +0000 (01:30 -0800)]
Message-ID: <Pine.LNX.4.10.10101060924280.24460-100000@mojo.covalent.net>

Allow AUTOLOAD to be an xsub and allow such xsubs
to avoid use of $AUTOLOAD.

p4raw-id: //depot/perl@8362

gv.c

diff --git a/gv.c b/gv.c
index 04a365f..f2931ae 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -412,7 +412,7 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
        return Nullgv;
     cv = GvCV(gv);
 
-    if (!CvROOT(cv))
+    if (!(CvROOT(cv) || CvXSUB(cv)))
        return Nullgv;
 
     /*
@@ -424,6 +424,20 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
          "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
             HvNAME(stash), (int)len, name);
 
+#ifndef USE_THREADS
+    if (CvXSUB(cv)) {
+        /* rather than lookup/init $AUTOLOAD here
+         * only to have the XSUB do another lookup for $AUTOLOAD
+         * and split that value on the last '::',
+         * pass along the same data via some unused fields in the CV
+         */
+        CvSTASH(cv) = stash;
+        SvPVX(cv) = (char *)name; /* cast to loose constness warning */
+        SvCUR(cv) = len;
+        return gv;
+    }
+#endif
+
     /*
      * Given &FOO::AUTOLOAD, set $FOO::AUTOLOAD to desired function name.
      * The subroutine's original name may not be "AUTOLOAD", so we don't