summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-07-25 20:15:36 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-07-25 22:08:32 -0700
commit9a0c99494cbbb7d1253332ab4ce0581e90f707a7 (patch)
tree98ceb547aaaadfecdcf45c59bb9c4b582f4af588
parent8777c9be0f45ac3c917698c1afb18e1e8507a188 (diff)
downloadperl-9a0c99494cbbb7d1253332ab4ce0581e90f707a7.tar.gz
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).
-rw-r--r--op.c3
-rw-r--r--t/comp/fold.t9
2 files changed, 10 insertions, 2 deletions
diff --git a/op.c b/op.c
index b5ebd79873..52e600ff8a 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 69d1903a43..c600067542 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";