Eliminate PL_sawalias, GPf_ALIASED_SV
authorDavid Mitchell <davem@iabyn.com>
Tue, 11 Aug 2015 15:21:07 +0000 (16:21 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 17 Aug 2015 10:16:23 +0000 (11:16 +0100)
These two commits:

    v5.21.3-759-gff2a62e "Skip no-common-vars optimisation for aliases"
    v5.21.4-210-gc997e36 "Make list assignment respect foreach aliasing"

added a run-time mechanism to detect aliased package variables,
by either "*pkg = ...," or "for $pkg (...)", and used that information
to enable the OPpASSIGN_COMMON mechanism at runtime for detecting common
elements in a list assign, e.g.

    for $alias ($a, ...) {
        ($a,$b) = (1,$alias);
    }

The previous commit but one changed the OPpASSIGN_COMMON mechanism such
that it no longer uses PL_sawalias. So this var and the mechanism for
setting it can now be removed.

This commit removes:

    * the PL_sawalias variable
    * the GPf_ALIASED_SV GP flag
    * the SAVEt_GP_ALIASED_SV and save_aliased_sv() save type.

13 files changed:
dump.c
embed.fnc
embed.h
embedvar.h
ext/B/t/b.t
gv.h
intrpvar.h
pp_ctl.c
pp_hot.c
proto.h
scope.c
scope.h
sv.c

diff --git a/dump.c b/dump.c
index 7369a9a..778e345 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -2032,7 +2032,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "    GPFLAGS = 0x%"UVxf
                                            " (%s)\n",
                               (UV)GvGPFLAGS(sv),
-                              GvALIASED_SV(sv) ? "ALIASED_SV" : "");
+                              "");
        Perl_dump_indent(aTHX_ level, file, "    LINE = %"IVdf"\n", (IV)GvLINE(sv));
        Perl_dump_indent(aTHX_ level, file, "    FILE = \"%s\"\n", GvFILE(sv));
        do_gv_dump (level, file, "    EGV", GvEGV(sv));
index 74011e0..12c0551 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1257,7 +1257,6 @@ Ap        |void   |savestack_grow_cnt     |I32 need
 Amp    |void   |save_aelem     |NN AV* av|SSize_t idx|NN SV **sptr
 Ap     |void   |save_aelem_flags|NN AV* av|SSize_t idx|NN SV **sptr \
                                 |const U32 flags
-p      |void   |save_aliased_sv|NN GV* gv
 Ap     |I32    |save_alloc     |I32 size|I32 pad
 Ap     |void   |save_aptr      |NN AV** aptr
 Ap     |AV*    |save_ary       |NN GV* gv
diff --git a/embed.h b/embed.h
index c03c0f5..0611ea9 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define rsignal_restore(a,b)   Perl_rsignal_restore(aTHX_ a,b)
 #define rsignal_save(a,b,c)    Perl_rsignal_save(aTHX_ a,b,c)
 #define rxres_save(a,b)                Perl_rxres_save(aTHX_ a,b)
-#define save_aliased_sv(a)     Perl_save_aliased_sv(aTHX_ a)
 #define save_strlen(a)         Perl_save_strlen(aTHX_ a)
 #define sawparens(a)           Perl_sawparens(aTHX_ a)
 #define scalar(a)              Perl_scalar(aTHX_ a)
index 9ed30e0..c6213c0 100644 (file)
 #define PL_savestack           (vTHX->Isavestack)
 #define PL_savestack_ix                (vTHX->Isavestack_ix)
 #define PL_savestack_max       (vTHX->Isavestack_max)
-#define PL_sawalias            (vTHX->Isawalias)
 #ifndef PL_sawampersand
 #define PL_sawampersand                (vTHX->Isawampersand)
 #endif
index 1420f91..4638c3e 100644 (file)
@@ -209,12 +209,6 @@ is($gv_ref->SAFENAME(), "gv", "Test SAFENAME()");
 like($gv_ref->FILE(), qr/b\.t$/, "Testing FILE()");
 is($gv_ref->SvTYPE(), B::SVt_PVGV, "Test SvTYPE()");
 is($gv_ref->FLAGS() & B::SVTYPEMASK, B::SVt_PVGV, "Test SVTYPEMASK");
-is($gv_ref->GPFLAGS & B::GPf_ALIASED_SV, 0, 'GPFLAGS are unset');
-{
-    local *gv = \my $x;
-    is($gv_ref->GPFLAGS & B::GPf_ALIASED_SV, B::GPf_ALIASED_SV,
-        'GPFLAGS gets GPf_ALIASED_SV set');
-}    
 
 # The following return B::SPECIALs.
 is(ref B::sv_yes(), "B::SPECIAL", "B::sv_yes()");
diff --git a/gv.h b/gv.h
index a6bb749..69414ec 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -198,12 +198,6 @@ Return the CV from the GV.
 #define GvIMPORTED_CV_on(gv)   (GvFLAGS(gv) |= GVf_IMPORTED_CV)
 #define GvIMPORTED_CV_off(gv)  (GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
 
-#define GPf_ALIASED_SV 1
-
-#define GvALIASED_SV(gv)       (GvGPFLAGS(gv) & GPf_ALIASED_SV)
-#define GvALIASED_SV_on(gv)    (GvGPFLAGS(gv) |= GPf_ALIASED_SV)
-#define GvALIASED_SV_off(gv)   (GvGPFLAGS(gv) &= ~GPf_ALIASED_SV)
-
 #ifndef PERL_CORE
 #  define GvIN_PAD(gv)         0
 #  define GvIN_PAD_on(gv)      NOOP
index 6ee88b3..142542a 100644 (file)
@@ -60,9 +60,6 @@ PERLVAR(I, markstack, I32 *)          /* stack_sp locations we're
 PERLVAR(I, markstack_ptr, I32 *)
 PERLVAR(I, markstack_max, I32 *)
 
-PERLVARI(I, sawalias,  bool,   FALSE)  /* must enable common-vars
-                                          pessimisation */
-
 #ifdef PERL_HASH_RANDOMIZE_KEYS
 #ifdef USE_PERL_PERTURB_KEYS
 PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff 0 == no-random, 1 == random, 2 == determinsitic */
index cc6a55f..5b58f47 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2145,7 +2145,6 @@ PP(pp_enteriter)
        save_pushptrptr(gv, SvREFCNT_inc(*svp), SAVEt_GVSV);
        *svp = newSV(0);
        itervar = (void *)gv;
-       save_aliased_sv(gv);
     }
     else {
        SV * const sv = POPs;
index b32a706..a6c65c2 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -47,7 +47,6 @@ PP(pp_const)
 PP(pp_nextstate)
 {
     PL_curcop = (COP*)PL_op;
-    PL_sawalias = 0;
     TAINT_NOT;         /* Each statement is presumed innocent */
     PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp;
     FREETMPS;
@@ -63,8 +62,6 @@ PP(pp_gvsv)
        PUSHs(save_scalar(cGVOP_gv));
     else
        PUSHs(GvSVn(cGVOP_gv));
-    if (GvREFCNT(cGVOP_gv) > 1 || GvALIASED_SV(cGVOP_gv))
-       PL_sawalias = TRUE;
     RETURN;
 }
 
@@ -99,9 +96,6 @@ PP(pp_gv)
 {
     dSP;
     XPUSHs(MUTABLE_SV(cGVOP_gv));
-    if (isGV(cGVOP_gv)
-     && (GvREFCNT(cGVOP_gv) > 1 || GvALIASED_SV(cGVOP_gv)))
-       PL_sawalias = TRUE;
     RETURN;
 }
 
diff --git a/proto.h b/proto.h
index 5b960a2..a3bd488 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -2659,9 +2659,6 @@ PERL_CALLCONV void        Perl_save_adelete(pTHX_ AV *av, SSize_t key);
 PERL_CALLCONV void     Perl_save_aelem_flags(pTHX_ AV* av, SSize_t idx, SV **sptr, const U32 flags);
 #define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS      \
        assert(av); assert(sptr)
-PERL_CALLCONV void     Perl_save_aliased_sv(pTHX_ GV* gv);
-#define PERL_ARGS_ASSERT_SAVE_ALIASED_SV       \
-       assert(gv)
 PERL_CALLCONV I32      Perl_save_alloc(pTHX_ I32 size, I32 pad);
 PERL_CALLCONV void     Perl_save_aptr(pTHX_ AV** aptr);
 #define PERL_ARGS_ASSERT_SAVE_APTR     \
diff --git a/scope.c b/scope.c
index 5699d7c..9768c30 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -720,16 +720,6 @@ Perl_save_alloc(pTHX_ I32 size, I32 pad)
     return start;
 }
 
-void
-Perl_save_aliased_sv(pTHX_ GV *gv)
-{
-    dSS_ADD;
-    PERL_ARGS_ASSERT_SAVE_ALIASED_SV;
-    SS_ADD_PTR(gp_ref(GvGP(gv)));
-    SS_ADD_UV(SAVEt_GP_ALIASED_SV | cBOOL(GvALIASED_SV(gv)) << 8);
-    SS_ADD_END(2);
-}
-
 
 
 #define ARG0_SV  MUTABLE_SV(arg0.any_ptr)
@@ -1252,24 +1242,6 @@ Perl_leave_scope(pTHX_ I32 base)
        case SAVEt_READONLY_OFF:
            SvREADONLY_off(ARG0_SV);
            break;
-       case SAVEt_GP_ALIASED_SV: {
-           /* The GP may have been abandoned, leaving the savestack with
-              the only remaining reference to it.  */
-           GP * const gp = (GP *)ARG0_PTR;
-           if (gp->gp_refcnt == 1) {
-               GV * const gv = (GV *)sv_2mortal(newSV_type(SVt_PVGV));
-               isGV_with_GP_on(gv);
-               GvGP_set(gv,gp);
-               gp_free(gv);
-               isGV_with_GP_off(gv);
-           }
-           else {
-               gp->gp_refcnt--;
-               if (uv >> 8) gp->gp_flags |=  GPf_ALIASED_SV;
-               else         gp->gp_flags &= ~GPf_ALIASED_SV;
-           }
-           break;
-       }
        default:
            Perl_croak(aTHX_ "panic: leave_scope inconsistency %u", type);
        }
diff --git a/scope.h b/scope.h
index 97ef3fa..0de5b77 100644 (file)
--- a/scope.h
+++ b/scope.h
@@ -21,7 +21,7 @@
 
 /* one arg */
 
-#define SAVEt_GP_ALIASED_SV    4
+/*** SPARE                     4 ***/
 #define SAVEt_BOOL             5
 #define SAVEt_COMPILE_WARNINGS 6
 #define SAVEt_COMPPAD          7
diff --git a/sv.c b/sv.c
index 79d2719..cd1bbf5 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -4119,18 +4119,7 @@ Perl_gv_setref(pTHX_ SV *const dstr, SV *const sstr)
            && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
            GvFLAGS(dstr) |= import_flag;
        }
-       if (import_flag == GVf_IMPORTED_SV) {
-           if (intro) {
-               save_aliased_sv((GV *)dstr);
-           }
-           /* Turn off the flag if sref is not referenced elsewhere,
-              even by weak refs.  (SvRMAGICAL is a pessimistic check for
-              back refs.)  */
-           if (SvREFCNT(sref) <= 2 && !SvRMAGICAL(sref))
-               GvALIASED_SV_off(dstr);
-           else
-               GvALIASED_SV_on(dstr);
-       }
+
        if (stype == SVt_PVHV) {
            const char * const name = GvNAME((GV*)dstr);
            const STRLEN len = GvNAMELEN(dstr);
@@ -14163,13 +14152,6 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
            ptr = POPPTR(ss,ix);
            TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
            break;
-       case SAVEt_GP_ALIASED_SV: {
-           GP * gp_ptr = (GP *)POPPTR(ss,ix);
-           GP * new_gp_ptr = gp_dup(gp_ptr, param);
-           TOPPTR(nss,ix) = new_gp_ptr;
-           new_gp_ptr->gp_refcnt++;
-           break;
-       }
        default:
            Perl_croak(aTHX_
                       "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
@@ -14404,7 +14386,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
     PL_minus_F         = proto_perl->Iminus_F;
     PL_doswitches      = proto_perl->Idoswitches;
     PL_dowarn          = proto_perl->Idowarn;
-    PL_sawalias                = proto_perl->Isawalias;
 #ifdef PERL_SAWAMPERSAND
     PL_sawampersand    = proto_perl->Isawampersand;
 #endif