From: Father Chrysostomos Date: Thu, 26 Jul 2012 03:15:36 +0000 (-0700) Subject: Don’t let ?: folding affect stat X-Git-Tag: upstream/5.20.0~6025 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9a0c99494cbbb7d1253332ab4ce0581e90f707a7;p=platform%2Fupstream%2Fperl.git Don’t let ?: folding affect stat stat(${\1} ? foo : bar) and stat(1 ? foo : bar) should behave the same way, but were treated differently, due to the way ?: is folded in the latter case. Now that foldedness is recorded in the op tree (cc2ebcd7902), we can use the OPpCONST_FOLDED flag to distinguish stat(1 ? foo : bar) from stat(foo). --- diff --git a/op.c b/op.c index b5ebd79..52e600f 100644 --- a/op.c +++ b/op.c @@ -8130,7 +8130,8 @@ Perl_ck_ftst(pTHX_ OP *o) SVOP * const kid = (SVOP*)cUNOPo->op_first; const OPCODE kidtype = kid->op_type; - if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE)) { + if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE) + && !(kid->op_private & OPpCONST_FOLDED)) { OP * const newop = newGVOP(type, OPf_REF, gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO)); #ifdef PERL_MAD diff --git a/t/comp/fold.t b/t/comp/fold.t index 69d1903..c600067 100644 --- a/t/comp/fold.t +++ b/t/comp/fold.t @@ -4,7 +4,7 @@ # we've not yet verified that use works. # use strict; -print "1..23\n"; +print "1..25\n"; my $test = 0; # Historically constant folding was performed by evaluating the ops, and if @@ -132,3 +132,10 @@ package other { # hide the "ok" sub print " ", ++$test, " - print followed by const || URSINE\n"; BEGIN { $^W = 1 } } + +# or stat +print "not " unless stat(1 ? INSTALL : 0) eq stat("INSTALL"); +print "ok ", ++$test, " - stat(const ? word : ....)\n"; +# in case we are in t/ +print "not " unless stat(1 ? TEST : 0) eq stat("TEST"); +print "ok ", ++$test, " - stat(const ? word : ....)\n";