Don’t pass PL_glob_index to glob overrides
authorFather Chrysostomos <sprout@cpan.org>
Sun, 9 Dec 2012 00:38:59 +0000 (16:38 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 10 Dec 2012 02:47:19 +0000 (18:47 -0800)
This magic second argument is undocumented and unused on CPAN and in
the core (as of the last few commits).

It could also get in the way of making glob truly overridable in the
future (e.g., allowing File::Glob to take a list).

op.c
pp_sys.c

index 6240225..0a747a7 100644 (file)
--- a/op.c
+++ b/op.c
@@ -8980,12 +8980,10 @@ Perl_ck_glob(pTHX_ OP *o)
         *                 \ mark - glob - rv2cv
         *                             |        \ gv(CORE::GLOBAL::glob)
         *                             |
-        *                              \ null - const(wildcard) - const(ix)
+        *                              \ null - const(wildcard)
         */
        o->op_flags |= OPf_SPECIAL;
        o->op_targ = pad_alloc(OP_GLOB, SVs_PADTMP);
-       op_append_elem(OP_GLOB, o,
-                   newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
        o = newLISTOP(OP_LIST, 0, o, NULL);
        o = newUNOP(OP_ENTERSUB, OPf_STACKED,
                    op_append_elem(OP_LIST, o,
index 06699d9..06b3684 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -359,15 +359,19 @@ PP(pp_glob)
     dVAR;
     OP *result;
     dSP;
+    GV * const gv = (PL_op->op_flags & OPf_SPECIAL) ? NULL : (GV *)POPs;
+
+    PUTBACK;
+
     /* make a copy of the pattern if it is gmagical, to ensure that magic
      * is called once and only once */
-    if (SvGMAGICAL(TOPm1s)) TOPm1s = sv_2mortal(newSVsv(TOPm1s));
+    if (SvGMAGICAL(TOPs)) TOPs = sv_2mortal(newSVsv(TOPs));
 
-    tryAMAGICunTARGETlist(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
+    tryAMAGICunTARGETlist(iter_amg, 0, (PL_op->op_flags & OPf_SPECIAL));
 
     if (PL_op->op_flags & OPf_SPECIAL) {
        /* call Perl-level glob function instead. Stack args are:
-        * MARK, wildcard, csh_glob context index
+        * MARK, wildcard
         * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
         * */
        return NORMAL;
@@ -375,7 +379,8 @@ PP(pp_glob)
     /* stack args are: wildcard, gv(_GEN_n) */
 
     if (PL_globhook) {
-       SETs(GvSV(TOPs));
+       PUSHs(GvSV(gv));
+       PUTBACK;
        PL_globhook(aTHX);
        return NORMAL;
     }
@@ -398,7 +403,7 @@ PP(pp_glob)
 #endif /* !VMS */
 
     SAVESPTR(PL_last_in_gv);   /* We don't want this to be permanent. */
-    PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
+    PL_last_in_gv = gv;
 
     SAVESPTR(PL_rs);           /* This is not permanent, either. */
     PL_rs = newSVpvs_flags("\000", SVs_TEMP);