diff options
Diffstat (limited to 'doio.c')
-rw-r--r-- | doio.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -1292,14 +1292,15 @@ Perl_my_stat_flags(pTHX_ const U32 flags) report_evil_fh(gv); return -1; } - else if (PL_op->op_private & OPpFT_STACKED) { - return PL_laststatval; - } else { - SV* const sv = POPs; + SV* const sv = PL_op->op_private & OPpFT_STACKING ? TOPs : POPs; + PUTBACK; + if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t)) + == OPpFT_STACKED) + return PL_laststatval; + else { const char *s; STRLEN len; - PUTBACK; if ((gv = MAYBE_DEREF_GV_flags(sv,flags))) { goto do_fstat; } @@ -1318,6 +1319,7 @@ Perl_my_stat_flags(pTHX_ const U32 flags) if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(s, '\n')) Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat"); return PL_laststatval; + } } } @@ -1345,7 +1347,10 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) } return -1; } - else if (PL_op->op_private & OPpFT_STACKED) { + sv = PL_op->op_private & OPpFT_STACKING ? TOPs : POPs; + PUTBACK; + if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t)) + == OPpFT_STACKED) { if (PL_laststype != OP_LSTAT) Perl_croak(aTHX_ no_prev_lstat); return PL_laststatval; @@ -1353,8 +1358,6 @@ Perl_my_lstat_flags(pTHX_ const U32 flags) PL_laststype = OP_LSTAT; PL_statgv = NULL; - sv = POPs; - PUTBACK; file = SvPV_flags_const_nolen(sv, flags); sv_setpv(PL_statname,file); PL_laststatval = PerlLIO_lstat(file,&PL_statcache); |