Compress::Zlib 1.35
[p5sagit/p5-mst-13.2.git] / gv.c
diff --git a/gv.c b/gv.c
index e96ab50..2726840 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -37,6 +37,19 @@ Perl stores its global variables.
 static const char S_autoload[] = "AUTOLOAD";
 static const STRLEN S_autolen = sizeof(S_autoload)-1;
 
+
+#ifdef PERL_DONT_CREATE_GVSV
+GV *
+Perl_gv_SVadd(pTHX_ GV *gv)
+{
+    if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
+       Perl_croak(aTHX_ "Bad symbol for scalar");
+    if (!GvSV(gv))
+       GvSV(gv) = NEWSV(72,0);
+    return gv;
+}
+#endif
+
 GV *
 Perl_gv_AVadd(pTHX_ register GV *gv)
 {
@@ -88,15 +101,19 @@ Perl_gv_fetchfile(pTHX_ const char *name)
     if (tmplen < sizeof smallbuf)
        tmpbuf = smallbuf;
     else
-       New(603, tmpbuf, tmplen + 1, char);
+       Newx(tmpbuf, tmplen + 1, char);
     /* This is where the debugger's %{"::_<$filename"} hash is created */
     tmpbuf[0] = '_';
     tmpbuf[1] = '<';
-    strcpy(tmpbuf + 2, name);
+    memcpy(tmpbuf + 2, name, tmplen - 1);
     gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
     if (!isGV(gv)) {
        gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
-       sv_setpv(GvSV(gv), name);
+#ifdef PERL_DONT_CREATE_GVSV
+       GvSV(gv) = newSVpvn(name, tmplen - 2);
+#else
+       sv_setpvn(GvSV(gv), name, tmplen - 2);
+#endif
        if (PERLDB_LINE)
            hv_magic(GvHVn(gv_AVadd(gv)), Nullgv, PERL_MAGIC_dbfile);
     }
@@ -122,9 +139,13 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
        } else
            Safefree(SvPVX_mutable(gv));
     }
-    Newz(602, gp, 1, GP);
+    Newxz(gp, 1, GP);
     GvGP(gv) = gp_ref(gp);
+#ifdef PERL_DONT_CREATE_GVSV
+    GvSV(gv) = 0;
+#else
     GvSV(gv) = NEWSV(72,0);
+#endif
     GvLINE(gv) = CopLINE(PL_curcop);
     /* XXX Ideally this cast would be replaced with a change to const char*
        in the struct.  */
@@ -171,6 +192,14 @@ S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
     case SVt_PVHV:
        (void)GvHVn(gv);
        break;
+#ifdef PERL_DONT_CREATE_GVSV
+    case SVt_NULL:
+    case SVt_PVCV:
+    case SVt_PVFM:
+       break;
+    default:
+       (void)GvSVn(gv);
+#endif
     }
 }
 
@@ -518,8 +547,9 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
     /*
      * Inheriting AUTOLOAD for non-methods works ... for now.
      */
-    if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX) && !method &&
-       (GvCVGEN(gv) || GvSTASH(gv) != stash))
+    if (!method && (GvCVGEN(gv) || GvSTASH(gv) != stash)
+       && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)
+    )
        Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
          "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
             packname, (int)len, name);
@@ -546,10 +576,14 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
     vargv = *(GV**)hv_fetch(varstash, S_autoload, S_autolen, TRUE);
     ENTER;
 
-    if (!isGV(vargv))
+    if (!isGV(vargv)) {
        gv_init(vargv, varstash, S_autoload, S_autolen, FALSE);
+#ifdef PERL_DONT_CREATE_GVSV
+       GvSV(vargv) = NEWSV(72,0);
+#endif
+    }
     LEAVE;
-    varsv = GvSV(vargv);
+    varsv = GvSVn(vargv);
     sv_setpvn(varsv, packname, packname_len);
     sv_catpvn(varsv, "::", 2);
     sv_catpvn(varsv, name, len);
@@ -621,7 +655,7 @@ Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 create)
     if (namelen + 3 < sizeof smallbuf)
        tmpbuf = smallbuf;
     else
-       New(606, tmpbuf, namelen + 3, char);
+       Newx(tmpbuf, namelen + 3, char);
     Copy(name,tmpbuf,namelen,char);
     tmpbuf[namelen++] = ':';
     tmpbuf[namelen++] = ':';
@@ -680,7 +714,8 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
     register const char *namend;
     HV *stash = 0;
     const I32 add = flags & ~SVf_UTF8;
-    (void)full_len;
+
+    PERL_UNUSED_ARG(full_len);
 
     if (*name == '*' && isALPHA(name[1])) /* accidental stringify on a GV? */
        name++;
@@ -702,7 +737,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                if (len + 3 < sizeof (smallbuf))
                    tmpbuf = smallbuf;
                else
-                   New(601, tmpbuf, len+3, char);
+                   Newx(tmpbuf, len+3, char);
                Copy(name, tmpbuf, len, char);
                tmpbuf[len++] = ':';
                tmpbuf[len++] = ':';
@@ -915,9 +950,9 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                    HV *hv;
                    I32 i;
                    if (!PL_psig_ptr) {
-                       Newz(73, PL_psig_ptr,  SIG_SIZE, SV*);
-                       Newz(73, PL_psig_name, SIG_SIZE, SV*);
-                       Newz(73, PL_psig_pend, SIG_SIZE, int);
+                       Newxz(PL_psig_ptr,  SIG_SIZE, SV*);
+                       Newxz(PL_psig_name, SIG_SIZE, SV*);
+                       Newxz(PL_psig_pend, SIG_SIZE, int);
                    }
                    GvMULTI_on(gv);
                    hv = GvHVn(gv);
@@ -1001,12 +1036,12 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            goto ro_magicalize;
 
        case ':':
-           sv_setpv(GvSV(gv),PL_chopset);
+           sv_setpv(GvSVn(gv),PL_chopset);
            goto magicalize;
 
        case '?':
 #ifdef COMPLEX_STATUS
-           SvUPGRADE(GvSV(gv), SVt_PVLV);
+           SvUPGRADE(GvSVn(gv), SVt_PVLV);
 #endif
            goto magicalize;
 
@@ -1018,7 +1053,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
               now (rather than going to magicalize)
            */
 
-           sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
+           sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
 
            if (sv_type == SVt_PVHV)
                require_errno(gv);
@@ -1038,7 +1073,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                            "$%c is no longer supported", *name);
            break;
        case '|':
-           sv_setiv(GvSV(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0);
+           sv_setiv(GvSVn(gv), (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0);
            goto magicalize;
 
        case '+':
@@ -1059,7 +1094,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        case '8':
        case '9':
        ro_magicalize:
-           SvREADONLY_on(GvSV(gv));
+           SvREADONLY_on(GvSVn(gv));
            /* FALL THROUGH */
        case '[':
        case '^':
@@ -1087,19 +1122,19 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        case '\024':    /* $^T */
        case '\027':    /* $^W */
        magicalize:
-           sv_magic(GvSV(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
+           sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
            break;
 
        case '\014':    /* $^L */
-           sv_setpvn(GvSV(gv),"\f",1);
-           PL_formfeed = GvSV(gv);
+           sv_setpvn(GvSVn(gv),"\f",1);
+           PL_formfeed = GvSVn(gv);
            break;
        case ';':
-           sv_setpvn(GvSV(gv),"\034",1);
+           sv_setpvn(GvSVn(gv),"\034",1);
            break;
        case ']':
        {
-           SV * const sv = GvSV(gv);
+           SV * const sv = GvSVn(gv);
            if (!sv_derived_from(PL_patchlevel, "version"))
                (void *)upg_version(PL_patchlevel);
            GvSV(gv) = vnumify(PL_patchlevel);
@@ -1109,7 +1144,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        break;
        case '\026':    /* $^V */
        {
-           SV * const sv = GvSV(gv);
+           SV * const sv = GvSVn(gv);
            GvSV(gv) = new_version(PL_patchlevel);
            SvREADONLY_on(GvSV(gv));
            SvREFCNT_dec(sv);
@@ -1156,10 +1191,8 @@ Perl_gv_fullname3(pTHX_ SV *sv, const GV *gv, const char *prefix)
 void
 Perl_gv_efullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain)
 {
-    const GV *egv = GvEGV(gv);
-    if (!egv)
-       egv = gv;
-    gv_fullname4(sv, egv, prefix, keepmain);
+    const GV * const egv = GvEGV(gv);
+    gv_fullname4(sv, egv ? egv : gv, prefix, keepmain);
 }
 
 void
@@ -1379,6 +1412,11 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
 
     if (!gv)
        lim = DESTROY_amg;              /* Skip overloading entries. */
+#ifdef PERL_DONT_CREATE_GVSV
+    else if (!sv) {
+       /* Equivalent to !SvTRUE and !SvOK  */
+    }
+#endif
     else if (SvTRUE(sv))
        amt.fallback=AMGfallYES;
     else if (SvOK(sv))
@@ -1414,17 +1452,17 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
                   knowing *which* methods were declared as overloaded. */
                /* GvSV contains the name of the method. */
                GV *ngv = Nullgv;
+               SV *gvsv = GvSV(gv);
 
                DEBUG_o( Perl_deb(aTHX_ "Resolving method \"%"SVf256\
                        "\" for overloaded \"%s\" in package \"%.256s\"\n",
                             GvSV(gv), cp, hvname) );
-               if (!SvPOK(GvSV(gv))
-                   || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(GvSV(gv)),
+               if (!gvsv || !SvPOK(gvsv)
+                   || !(ngv = gv_fetchmethod_autoload(stash, SvPVX_const(gvsv),
                                                       FALSE)))
                {
                    /* Can be an import stub (created by "can"). */
-                   SV *gvsv = GvSV(gv);
-                   const char * const name = SvPOK(gvsv) ?  SvPVX_const(gvsv) : "???";
+                   const char * const name = (gvsv && SvPOK(gvsv)) ?  SvPVX_const(gvsv) : "???";
                    Perl_croak(aTHX_ "%s method \"%.256s\" overloading \"%s\" "\
                                "in package \"%.256s\"",
                               (GvCVGEN(gv) ? "Stub found while resolving"
@@ -1488,7 +1526,7 @@ Perl_gv_handler(pTHX_ HV *stash, I32 id)
               "Inherited AUTOLOAD for a non-method deprecated", since
               our caller is going through a function call, not a method call.
               So return the CV for AUTOLOAD, setting $AUTOLOAD. */
-           GV *gv = gv_fetchmethod(stash, PL_AMG_names[id]);
+           GV * const gv = gv_fetchmethod(stash, PL_AMG_names[id]);
 
            if (gv && GvCV(gv))
                return GvCV(gv);
@@ -1573,13 +1611,13 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                  * SV* ref causes confusion with the interpreter variable of
                  * the same name
                  */
-            SV* tmpRef=SvRV(left);
+            SV* const tmpRef=SvRV(left);
             if (!SvROK(tmpRef) && SvTYPE(tmpRef) <= SVt_PVMG) {
                /*
                 * Just to be extra cautious.  Maybe in some
                 * additional cases sv_setsv is safe, too.
                 */
-               SV* newref = newSVsv(tmpRef);
+               SV* const newref = newSVsv(tmpRef);
                SvOBJECT_on(newref);
                SvSTASH_set(newref, (HV*)SvREFCNT_inc(SvSTASH(tmpRef)));
                return newref;
@@ -1589,13 +1627,13 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
         case abs_amg:
           if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
               && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
-            SV* nullsv=sv_2mortal(newSViv(0));
+            SV* const nullsv=sv_2mortal(newSViv(0));
             if (off1==lt_amg) {
-              SV* lessp = amagic_call(left,nullsv,
+              SV* const lessp = amagic_call(left,nullsv,
                                       lt_amg,AMGf_noright);
               logic = SvTRUE(lessp);
             } else {
-              SV* lessp = amagic_call(left,nullsv,
+              SV* const lessp = amagic_call(left,nullsv,
                                       ncmp_amg,AMGf_noright);
               logic = (SvNV(lessp) < 0);
             }
@@ -1859,7 +1897,7 @@ bool
 Perl_is_gv_magical_sv(pTHX_ SV *name, U32 flags)
 {
     STRLEN len;
-    const char *temp = SvPV_const(name, len);
+    const char * const temp = SvPV_const(name, len);
     return is_gv_magical(temp, len, flags);
 }