This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Osvaldo Villalon's changes to symbian_dll.cpp.=0A=
[perl5.git] / gv.c
diff --git a/gv.c b/gv.c
index 7d737de..24e11c1 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1,7 +1,7 @@
 /*    gv.c
  *
  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
 
 /*
  *   'Mercy!' cried Gandalf.  'If the giving of information is to be the cure
- * of your inquisitiveness, I shall spend all the rest of my days answering
+ * of your inquisitiveness, I shall spend all the rest of my days in answering
  * you.  What more do you want to know?'
  *   'The names of all the stars, and of all living things, and the whole
  * history of Middle-earth and Over-heaven and of the Sundering Seas,'
  * laughed Pippin.
+ *
+ *     [p.599 of _The Lord of the Rings_, III/xi: "The Palantír"]
  */
 
 /*
@@ -45,7 +47,7 @@ Perl_gv_SVadd(pTHX_ GV *gv)
 {
     PERL_ARGS_ASSERT_GV_SVADD;
 
-    if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
+    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
        Perl_croak(aTHX_ "Bad symbol for scalar");
     if (!GvSV(gv))
        GvSV(gv) = newSV(0);
@@ -58,7 +60,7 @@ Perl_gv_AVadd(pTHX_ register GV *gv)
 {
     PERL_ARGS_ASSERT_GV_AVADD;
 
-    if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
+    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
        Perl_croak(aTHX_ "Bad symbol for array");
     if (!GvAV(gv))
        GvAV(gv) = newAV();
@@ -70,7 +72,7 @@ Perl_gv_HVadd(pTHX_ register GV *gv)
 {
     PERL_ARGS_ASSERT_GV_HVADD;
 
-    if (!gv || SvTYPE((SV*)gv) != SVt_PVGV)
+    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
        Perl_croak(aTHX_ "Bad symbol for hash");
     if (!GvHV(gv))
        GvHV(gv) = newHV();
@@ -84,7 +86,7 @@ Perl_gv_IOadd(pTHX_ register GV *gv)
 
     PERL_ARGS_ASSERT_GV_IOADD;
 
-    if (!gv || SvTYPE((SV*)gv) != SVt_PVGV) {
+    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV) {
 
         /*
          * if it walks like a dirhandle, then let's assume that
@@ -97,15 +99,11 @@ Perl_gv_IOadd(pTHX_ register GV *gv)
                          PL_op->op_type ==  OP_REWINDDIR ||
                          PL_op->op_type ==  OP_CLOSEDIR ?
                          "dirhandle" : "filehandle";
+       /* diag_listed_as: Bad symbol for filehandle */
         Perl_croak(aTHX_ "Bad symbol for %s", fh);
     }
 
     if (!GvIOp(gv)) {
-#ifdef GV_UNIQUE_CHECK
-        if (GvUNIQUE(gv)) {
-            Perl_croak(aTHX_ "Bad symbol for filehandle (GV is unique)");
-        }
-#endif
        GvIOp(gv) = newIO();
     }
     return gv;
@@ -150,7 +148,7 @@ Perl_gv_fetchfile_flags(pTHX_ const char *const name, const STRLEN namelen,
 #else
        sv_setpvn(GvSV(gv), name, namelen);
 #endif
-       if (PERLDB_LINE)
+       if (PERLDB_LINE || PERLDB_SAVESRC)
            hv_magic(GvHVn(gv_AVadd(gv)), NULL, PERL_MAGIC_dbfile);
     }
     if (tmpbuf != smallbuf)
@@ -256,7 +254,7 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
     if (old_type < SVt_PVGV) {
        if (old_type >= SVt_PV)
            SvCUR_set(gv, 0);
-       sv_upgrade((SV*)gv, SVt_PVGV);
+       sv_upgrade(MUTABLE_SV(gv), SVt_PVGV);
     }
     if (SvLEN(gv)) {
        if (proto) {
@@ -272,7 +270,7 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
     GvGP(gv) = Perl_newGP(aTHX_ gv);
     GvSTASH(gv) = stash;
     if (stash)
-       Perl_sv_add_backref(aTHX_ (SV*)stash, (SV*)gv);
+       Perl_sv_add_backref(aTHX_ MUTABLE_SV(stash), MUTABLE_SV(gv));
     gv_name_set(gv, name, len, GV_ADD);
     if (multi || doproto)              /* doproto means it _was_ mentioned */
        GvMULTI_on(gv);
@@ -297,7 +295,7 @@ Perl_gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi)
        CvFILE_set_from_cop(GvCV(gv), PL_curcop);
        CvSTASH(GvCV(gv)) = PL_curstash;
        if (proto) {
-           sv_usepvn_flags((SV*)GvCV(gv), proto, protolen,
+           sv_usepvn_flags(MUTABLE_SV(GvCV(gv)), proto, protolen,
                            SV_HAS_TRAILING_NUL);
        }
     }
@@ -588,7 +586,7 @@ S_gv_get_super_pkg(pTHX_ const char* name, I32 namelen)
     gv_init(gv, stash, "ISA", 3, TRUE);
     superisa = GvAVn(gv);
     GvMULTI_on(gv);
-    sv_magic((SV*)superisa, (SV*)gv, PERL_MAGIC_isa, NULL, 0);
+    sv_magic(MUTABLE_SV(superisa), MUTABLE_SV(gv), PERL_MAGIC_isa, NULL, 0);
 #ifdef USE_ITHREADS
     av_push(superisa, newSVpv(CopSTASHPV(PL_curcop), 0));
 #else
@@ -618,7 +616,7 @@ Perl_gv_fetchmethod_flags(pTHX_ HV *stash, const char *name, U32 flags)
     GV* gv;
     HV* ostash = stash;
     const char * const origname = name;
-    SV *const error_report = (SV *)stash;
+    SV *const error_report = MUTABLE_SV(stash);
     const U32 autoload = flags & GV_AUTOLOAD;
     const U32 do_croak = flags & GV_CROAK;
 
@@ -669,7 +667,7 @@ Perl_gv_fetchmethod_flags(pTHX_ HV *stash, const char *name, U32 flags)
     gv = gv_fetchmeth(stash, name, nend - name, 0);
     if (!gv) {
        if (strEQ(name,"import") || strEQ(name,"unimport"))
-           gv = (GV*)&PL_sv_yes;
+           gv = MUTABLE_GV(&PL_sv_yes);
        else if (autoload)
            gv = gv_autoload4(ostash, name, nend - name, TRUE);
        if (!gv && do_croak) {
@@ -739,7 +737,7 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
        return NULL;
     if (stash) {
        if (SvTYPE(stash) < SVt_PVHV) {
-           packname = SvPV_const((SV*)stash, packname_len);
+           packname = SvPV_const(MUTABLE_SV(stash), packname_len);
            stash = NULL;
        }
        else {
@@ -996,7 +994,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                tmpbuf[len++] = ':';
                gvp = (GV**)hv_fetch(stash,tmpbuf,len,add);
                gv = gvp ? *gvp : NULL;
-               if (gv && gv != (GV*)&PL_sv_undef) {
+               if (gv && gv != (const GV *)&PL_sv_undef) {
                    if (SvTYPE(gv) != SVt_PVGV)
                        gv_init(gv, stash, tmpbuf, len, (add & GV_ADDMULTI));
                    else
@@ -1004,7 +1002,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                }
                if (tmpbuf != smallbuf)
                    Safefree(tmpbuf);
-               if (!gv || gv == (GV*)&PL_sv_undef)
+               if (!gv || gv == (const GV *)&PL_sv_undef)
                    return NULL;
 
                if (!(stash = GvHV(gv)))
@@ -1019,7 +1017,8 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            name_cursor++;
            name = name_cursor;
            if (name == name_end)
-               return gv ? gv : (GV*)*hv_fetchs(PL_defstash, "main::", TRUE);
+               return gv
+                   ? gv : MUTABLE_GV(*hv_fetchs(PL_defstash, "main::", TRUE));
        }
     }
     len = name_cursor - name;
@@ -1080,7 +1079,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                {
                    gvp = (GV**)hv_fetch(stash,name,len,0);
                    if (!gvp ||
-                       *gvp == (GV*)&PL_sv_undef ||
+                       *gvp == (const GV *)&PL_sv_undef ||
                        SvTYPE(*gvp) != SVt_PVGV)
                    {
                        stash = NULL;
@@ -1089,6 +1088,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                             (sv_type == SVt_PVAV && !GvIMPORTED_AV(*gvp)) ||
                             (sv_type == SVt_PVHV && !GvIMPORTED_HV(*gvp)) )
                    {
+                       /* diag_listed_as: Variable "%s" is not imported%s */
                        Perl_warn(aTHX_ "Variable \"%c%s\" is not imported",
                            sv_type == SVt_PVAV ? '@' :
                            sv_type == SVt_PVHV ? '%' : '$',
@@ -1120,7 +1120,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            if (USE_UTF8_IN_NAMES)
                SvUTF8_on(err);
            qerror(err);
-           gv = gv_fetchpvn_flags("<none>::", 8, GV_ADDMULTI, SVt_PVHV);
+           gv = gv_fetchpvs("<none>::", GV_ADDMULTI, SVt_PVHV);
            if(!gv) {
                /* symbol table under destruction */
                return NULL;
@@ -1135,7 +1135,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        return NULL;
 
     gvp = (GV**)hv_fetch(stash,name,len,add);
-    if (!gvp || *gvp == (GV*)&PL_sv_undef)
+    if (!gvp || *gvp == (const GV *)&PL_sv_undef)
        return NULL;
     gv = *gvp;
     if (SvTYPE(gv) == SVt_PVGV) {
@@ -1204,22 +1204,22 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                if (strEQ(name2, "SA")) {
                    AV* const av = GvAVn(gv);
                    GvMULTI_on(gv);
-                   sv_magic((SV*)av, (SV*)gv, PERL_MAGIC_isa, NULL, 0);
+                   sv_magic(MUTABLE_SV(av), MUTABLE_SV(gv), PERL_MAGIC_isa,
+                            NULL, 0);
                    /* NOTE: No support for tied ISA */
                    if ((add & GV_ADDMULTI) && strEQ(nambeg,"AnyDBM_File::ISA")
                        && AvFILLp(av) == -1)
                        {
-                           const char *pname;
-                           av_push(av, newSVpvn(pname = "NDBM_File",9));
-                           gv_stashpvn(pname, 9, GV_ADD);
-                           av_push(av, newSVpvn(pname = "DB_File",7));
-                           gv_stashpvn(pname, 7, GV_ADD);
-                           av_push(av, newSVpvn(pname = "GDBM_File",9));
-                           gv_stashpvn(pname, 9, GV_ADD);
-                           av_push(av, newSVpvn(pname = "SDBM_File",9));
-                           gv_stashpvn(pname, 9, GV_ADD);
-                           av_push(av, newSVpvn(pname = "ODBM_File",9));
-                           gv_stashpvn(pname, 9, GV_ADD);
+                           av_push(av, newSVpvs("NDBM_File"));
+                           gv_stashpvs("NDBM_File", GV_ADD);
+                           av_push(av, newSVpvs("DB_File"));
+                           gv_stashpvs("DB_File", GV_ADD);
+                           av_push(av, newSVpvs("GDBM_File"));
+                           gv_stashpvs("GDBM_File", GV_ADD);
+                           av_push(av, newSVpvs("SDBM_File"));
+                           gv_stashpvs("SDBM_File", GV_ADD);
+                           av_push(av, newSVpvs("ODBM_File"));
+                           gv_stashpvs("ODBM_File", GV_ADD);
                        }
                }
                break;
@@ -1234,10 +1234,22 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                if (strEQ(name2, "IG")) {
                    HV *hv;
                    I32 i;
-                   if (!PL_psig_ptr) {
-                       Newxz(PL_psig_ptr,  SIG_SIZE, SV*);
-                       Newxz(PL_psig_name, SIG_SIZE, SV*);
+                   if (!PL_psig_name) {
+                       Newxz(PL_psig_name, 2 * SIG_SIZE, SV*);
                        Newxz(PL_psig_pend, SIG_SIZE, int);
+                       PL_psig_ptr = PL_psig_name + SIG_SIZE;
+                   } else {
+                       /* I think that the only way to get here is to re-use an
+                          embedded perl interpreter, where the previous
+                          use didn't clean up fully because
+                          PL_perl_destruct_level was 0. I'm not sure that we
+                          "support" that, in that I suspect in that scenario
+                          there are sufficient other garbage values left in the
+                          interpreter structure that something else will crash
+                          before we get here. I suspect that this is one of
+                          those "doctor, it hurts when I do this" bugs.  */
+                       Zero(PL_psig_name, 2 * SIG_SIZE, SV*);
+                       Zero(PL_psig_pend, SIG_SIZE, int);
                    }
                    GvMULTI_on(gv);
                    hv = GvHVn(gv);
@@ -1246,9 +1258,6 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                        SV * const * const init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
                        if (init)
                            sv_setsv(*init, &PL_sv_undef);
-                       PL_psig_ptr[i] = 0;
-                       PL_psig_name[i] = 0;
-                       PL_psig_pend[i] = 0;
                    }
                }
                break;
@@ -1342,7 +1351,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            GvMULTI_on(gv);
            /* If %! has been used, automatically load Errno.pm. */
 
-           sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
+           sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
 
             /* magicalization must be done before require_tie_mod is called */
            if (sv_type == SVt_PVHV || sv_type == SVt_PVGV)
@@ -1354,10 +1363,10 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        GvMULTI_on(gv); /* no used once warnings here */
         {
             AV* const av = GvAVn(gv);
-           SV* const avc = (*name == '+') ? (SV*)av : NULL;
+           SV* const avc = (*name == '+') ? MUTABLE_SV(av) : NULL;
 
-           sv_magic((SV*)av, avc, PERL_MAGIC_regdata, NULL, 0);
-            sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
+           sv_magic(MUTABLE_SV(av), avc, PERL_MAGIC_regdata, NULL, 0);
+            sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
             if (avc)
                 SvREADONLY_on(GvSVn(gv));
             SvREADONLY_on(av);
@@ -1387,6 +1396,7 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        ro_magicalize:
            SvREADONLY_on(GvSVn(gv));
            /* FALL THROUGH */
+       case '0':
        case '1':
        case '2':
        case '3':
@@ -1406,7 +1416,6 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        case ')':
        case '<':
        case '>':
-       case ',':
        case '\\':
        case '/':
        case '\001':    /* $^A */
@@ -1421,15 +1430,15 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        case '\024':    /* $^T */
        case '\027':    /* $^W */
        magicalize:
-           sv_magic(GvSVn(gv), (SV*)gv, PERL_MAGIC_sv, name, len);
+           sv_magic(GvSVn(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, name, len);
            break;
 
        case '\014':    /* $^L */
-           sv_setpvn(GvSVn(gv),"\f",1);
+           sv_setpvs(GvSVn(gv),"\f");
            PL_formfeed = GvSVn(gv);
            break;
        case ';':
-           sv_setpvn(GvSVn(gv),"\034",1);
+           sv_setpvs(GvSVn(gv),"\034");
            break;
        case ']':
        {
@@ -1499,7 +1508,7 @@ Perl_newIO(pTHX)
 {
     dVAR;
     GV *iogv;
-    IO * const io = (IO*)newSV_type(SVt_PVIO);
+    IO * const io = MUTABLE_IO(newSV_type(SVt_PVIO));
     /* This used to read SvREFCNT(io) = 1;
        It's not clear why the reference count needed an explicit reset. NWC
     */
@@ -1531,14 +1540,14 @@ Perl_gv_check(pTHX_ const HV *stash)
             register GV *gv;
             HV *hv;
            if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
-               (gv = (GV*)HeVAL(entry)) && isGV(gv) && (hv = GvHV(gv)))
+               (gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv)))
            {
                if (hv != PL_defstash && hv != stash)
                     gv_check(hv);              /* nested package */
            }
            else if (isALPHA(*HeKEY(entry))) {
                 const char *file;
-               gv = (GV*)HeVAL(entry);
+               gv = MUTABLE_GV(HeVAL(entry));
                if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv))
                    continue;
                file = GvFILE(gv);
@@ -1646,7 +1655,7 @@ Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg)
        for (i = 1; i < NofAMmeth; i++) {
            CV * const cv = amtp->table[i];
            if (cv) {
-               SvREFCNT_dec((SV *) cv);
+               SvREFCNT_dec(MUTABLE_SV(cv));
                amtp->table[i] = NULL;
            }
        }
@@ -1660,7 +1669,7 @@ bool
 Perl_Gv_AMupdate(pTHX_ HV *stash)
 {
   dVAR;
-  MAGIC* const mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
+  MAGIC* const mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table);
   AMT amt;
   const struct mro_meta* stash_meta = HvMROMETA(stash);
   U32 newgen;
@@ -1674,7 +1683,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
          && amtp->was_ok_sub == newgen) {
          return (bool)AMT_OVERLOADED(amtp);
       }
-      sv_unmagic((SV*)stash, PERL_MAGIC_overload_table);
+      sv_unmagic(MUTABLE_SV(stash), PERL_MAGIC_overload_table);
   }
 
   DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME_get(stash)) );
@@ -1773,7 +1782,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
       AMT_AMAGIC_on(&amt);
       if (have_ovl)
          AMT_OVERLOADED_on(&amt);
-      sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
+      sv_magic(MUTABLE_SV(stash), 0, PERL_MAGIC_overload_table,
                                                (char*)&amt, sizeof(AMT));
       return have_ovl;
     }
@@ -1781,7 +1790,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
   /* Here we have no table: */
   /* no_table: */
   AMT_AMAGIC_off(&amt);
-  sv_magic((SV*)stash, 0, PERL_MAGIC_overload_table,
+  sv_magic(MUTABLE_SV(stash), 0, PERL_MAGIC_overload_table,
                                                (char*)&amt, sizeof(AMTS));
   return FALSE;
 }
@@ -1802,11 +1811,11 @@ Perl_gv_handler(pTHX_ HV *stash, I32 id)
     stash_meta = HvMROMETA(stash);
     newgen = PL_sub_generation + stash_meta->pkg_gen + stash_meta->cache_gen;
 
-    mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
+    mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table);
     if (!mg) {
       do_update:
        Gv_AMupdate(stash);
-       mg = mg_find((SV*)stash, PERL_MAGIC_overload_table);
+       mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table);
     }
     assert(mg);
     amtp = (AMT*)mg->mg_ptr;
@@ -1851,9 +1860,30 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 
   PERL_ARGS_ASSERT_AMAGIC_CALL;
 
+  if ( PL_curcop->cop_hints & HINT_NO_AMAGIC ) {
+      SV *lex_mask = Perl_refcounted_he_fetch(aTHX_ PL_curcop->cop_hints_hash,
+                                             0, "overloading", 11, 0, 0);
+
+      if ( !lex_mask || !SvOK(lex_mask) )
+         /* overloading lexically disabled */
+         return NULL;
+      else if ( lex_mask && SvPOK(lex_mask) ) {
+         /* we have an entry in the hints hash, check if method has been
+          * masked by overloading.pm */
+         STRLEN len;
+         const int offset = method / 8;
+         const int bit    = method % 8;
+         char *pv = SvPV(lex_mask, len);
+
+         /* Bit set, so this overloading operator is disabled */
+         if ( (STRLEN)offset < len && pv[offset] & ( 1 << bit ) )
+             return NULL;
+      }
+  }
+
   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
       && (stash = SvSTASH(SvRV(left)))
-      && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
+      && (mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table))
       && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
                        ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
                        : NULL))
@@ -1960,6 +1990,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
           break;
         case int_amg:
         case iter_amg:                 /* XXXX Eventually should do to_gv. */
+        case ftest_amg:                /* XXXX Eventually should do to_gv. */
             /* FAIL safe */
             return NULL;       /* Delegate operation to standard mechanisms. */
             break;
@@ -1977,7 +2008,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
         if (!cv) goto not_found;
     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
               && (stash = SvSTASH(SvRV(right)))
-              && (mg = mg_find((SV*)stash, PERL_MAGIC_overload_table))
+              && (mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table))
               && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
                          ? (amtp = (AMT*)mg->mg_ptr)->table
                          : NULL))
@@ -2151,10 +2182,10 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
       PUSHs(newSVpvn_flags(AMG_id2name(method + assignshift),
                           AMG_id2namelen(method + assignshift), SVs_TEMP));
     }
-    PUSHs((SV*)cv);
+    PUSHs(MUTABLE_SV(cv));
     PUTBACK;
 
-    if ((PL_op = Perl_pp_entersub(aTHX)))
+    if ((PL_op = PL_ppaddr[OP_ENTERSUB](aTHX)))
       CALLRUNOPS(aTHX);
     LEAVE;
     SPAGAIN;
@@ -2208,25 +2239,6 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 /*
 =for apidoc is_gv_magical_sv
 
-Returns C<TRUE> if given the name of a magical GV. Calls is_gv_magical.
-
-=cut
-*/
-
-bool
-Perl_is_gv_magical_sv(pTHX_ SV *name, U32 flags)
-{
-    STRLEN len;
-    const char * const temp = SvPV_const(name, len);
-
-    PERL_ARGS_ASSERT_IS_GV_MAGICAL_SV;
-
-    return is_gv_magical(temp, len, flags);
-}
-
-/*
-=for apidoc is_gv_magical
-
 Returns C<TRUE> if given the name of a magical GV.
 
 Currently only useful internally when determining if a GV should be
@@ -2241,13 +2253,15 @@ pointers returned by SvPV.
 
 =cut
 */
+
 bool
-Perl_is_gv_magical(pTHX_ const char *name, STRLEN len, U32 flags)
+Perl_is_gv_magical_sv(pTHX_ SV *const name_sv, U32 flags)
 {
-    PERL_UNUSED_CONTEXT;
-    PERL_UNUSED_ARG(flags);
+    STRLEN len;
+    const char *const name = SvPV_const(name_sv, len);
 
-    PERL_ARGS_ASSERT_IS_GV_MAGICAL;
+    PERL_UNUSED_ARG(flags);
+    PERL_ARGS_ASSERT_IS_GV_MAGICAL_SV;
 
     if (len > 1) {
        const char * const name1 = name + 1;
@@ -2325,7 +2339,6 @@ Perl_is_gv_magical(pTHX_ const char *name, STRLEN len, U32 flags)
        case ')':
        case '<':
        case '>':
-       case ',':
        case '\\':
        case '/':
        case '|':