ch(dir|mod|own) should also call FETCH on refs to tied globs
authorFather Chrysostomos <sprout@cpan.org>
Sat, 10 Sep 2011 13:17:53 +0000 (06:17 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 10 Sep 2011 13:43:49 +0000 (06:43 -0700)
Following on from commit 935647290357b277, which corrected the beha-
viour for tied globs, this commit corrects the behaviour for refer-
ences to tied globs.

(With tests by Nicholas Clark.)

doio.c
pp_sys.c
t/op/tie_fetch_count.t

diff --git a/doio.c b/doio.c
index 7cb0096..e2c879c 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -1619,10 +1619,7 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
            tot = sp - mark;
            while (++mark <= sp) {
                 GV* gv;
-                SvGETMAGIC(*mark);
-                if (isGV_with_GP(*mark)) {
-                    gv = MUTABLE_GV(*mark);
-               do_fchmod:
+                if ((gv = MAYBE_DEREF_GV(*mark))) {
                    if (GvIO(gv) && IoIFP(GvIOp(gv))) {
 #ifdef HAS_FCHMOD
                        APPLY_TAINT_PROPER();
@@ -1636,10 +1633,6 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
                        tot--;
                    }
                }
-               else if (SvROK(*mark) && isGV_with_GP(SvRV(*mark))) {
-                   gv = MUTABLE_GV(SvRV(*mark));
-                   goto do_fchmod;
-               }
                else {
                    const char *name = SvPV_nomg_const_nolen(*mark);
                    APPLY_TAINT_PROPER();
@@ -1660,10 +1653,7 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
            tot = sp - mark;
            while (++mark <= sp) {
                 GV* gv;
-                SvGETMAGIC(*mark);
-                if (isGV_with_GP(*mark)) {
-                    gv = MUTABLE_GV(*mark);
-               do_fchown:
+               if ((gv = MAYBE_DEREF_GV(*mark))) {
                    if (GvIO(gv) && IoIFP(GvIOp(gv))) {
 #ifdef HAS_FCHOWN
                        APPLY_TAINT_PROPER();
@@ -1677,10 +1667,6 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
                        tot--;
                    }
                }
-               else if (SvROK(*mark) && isGV_with_GP(SvRV(*mark))) {
-                   gv = MUTABLE_GV(SvRV(*mark));
-                   goto do_fchown;
-               }
                else {
                    const char *name = SvPV_nomg_const_nolen(*mark);
                    APPLY_TAINT_PROPER();
index e92d13d..50c1a12 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -3466,18 +3466,8 @@ PP(pp_chdir)
        if (PL_op->op_flags & OPf_SPECIAL) {
            gv = gv_fetchsv(sv, 0, SVt_PVIO);
        }
-        else {
-           SvGETMAGIC(sv);
-           if(isGV_with_GP(sv)) {
-               gv = MUTABLE_GV(sv);
-           }
-           else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
-               gv = MUTABLE_GV(SvRV(sv));
-           }
-           else {
+        else if (!(gv = MAYBE_DEREF_GV(sv)))
                tmps = SvPV_nomg_const_nolen(sv);
-           }
-       }
     }
 
     if( !gv && (!tmps || !*tmps) ) {
index d55ab50..b62f66d 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib';
     require './test.pl';
-    plan (tests => 223);
+    plan (tests => 226);
 }
 
 use strict;
@@ -222,9 +222,15 @@ $var8->bolgy            ; check_count '->method';
 $var8 = *dummy; $dummy = $var8; $count = 0;
 eval { chdir $var8 }    ; check_count 'chdir $tied_glob';
 $var8 = *dummy; $dummy = $var8; $count = 0;
+eval { chdir \$var8 }    ; check_count 'chdir \$tied_glob';
+$var8 = *dummy; $dummy = $var8; $count = 0;
 eval { chmod 0, $var8 } ; check_count 'chmod 0,$tied_glob';
 $var8 = *dummy; $dummy = $var8; $count = 0;
+eval { chmod 0,\$var8 } ; check_count 'chmod 0,\$tied_glob';
+$var8 = *dummy; $dummy = $var8; $count = 0;
 eval { chown 0,0,$var8 }; check_count 'chown 0,0,$tied_glob';
+$var8 = *dummy; $dummy = $var8; $count = 0;
+eval { chown 0,0,\$var8}; check_count 'chown 0,0,\$tied_glob';
 
 
 ###############################################