diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-09-10 22:49:12 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-09-11 18:17:09 -0700 |
commit | 5e0adc2d665b4f3a864001f42af5b14276d630c5 (patch) | |
tree | fd8349d1b502bec1de3793a6d38410afd96f723b /pp_sys.c | |
parent | 49ef49feda58b9302137fcbf9a3954a2467002c6 (diff) | |
download | perl-5e0adc2d665b4f3a864001f42af5b14276d630c5.tar.gz |
Make truncate respect get-magic on globs and globrefs
It was ignoring get-magic for those.
Diffstat (limited to 'pp_sys.c')
-rw-r--r-- | pp_sys.c | 28 |
1 files changed, 8 insertions, 20 deletions
@@ -2188,14 +2188,14 @@ PP(pp_truncate) /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */ SETERRNO(0,0); { + SV * const sv = POPs; int result = 1; GV *tmpgv; IO *io; - if (PL_op->op_flags & OPf_SPECIAL) { - tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO); - - do_ftruncate_gv: + if ((tmpgv = PL_op->op_flags & OPf_SPECIAL + ? gv_fetchsv(sv, 0, SVt_PVIO) + : MAYBE_DEREF_GV(sv) )) { io = GvIO(tmpgv); if (!io) result = 0; @@ -2217,24 +2217,12 @@ PP(pp_truncate) } } } - else { - SV * const sv = POPs; - const char *name; - - if (isGV_with_GP(sv)) { - tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */ - goto do_ftruncate_gv; - } - else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) { - tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */ - goto do_ftruncate_gv; - } - else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) { + else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) { io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */ goto do_ftruncate_io; - } - - name = SvPV_nolen_const(sv); + } + else { + const char * const name = SvPV_nomg_const_nolen(sv); TAINT_PROPER("truncate"); #ifdef HAS_TRUNCATE if (truncate(name, len) < 0) |