This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Return fresh scalar from join(const,const)
authorFather Chrysostomos <sprout@cpan.org>
Fri, 5 Dec 2014 00:07:45 +0000 (16:07 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 5 Dec 2014 02:56:12 +0000 (18:56 -0800)
commit6d4eed2136c73d9331ed2edb2e7650c90b974ea7
tree76655c4fa4e84d2b439e501caa33ebd856132b5d
parent2310e17474d466b55500d4967d2d30e25058760c
Return fresh scalar from join(const,const)

$ perl5.20.1 -Ilib  -le 'for(1,2) { push @_, \join "x", 1 } print for @_'
SCALAR(0x7fb131005438)
SCALAR(0x7fb131005648)
$ ./perl -Ilib  -le 'for(1,2) { push @_, \join "x", 1 } print for @_'
SCALAR(0x7fe612831b30)
SCALAR(0x7fe612831b30)

Notice how we now get two references to the same scalar.  I broke this
accidentally in 987c9691.  If join has two arguments, it gets con-
verted to a stringify op.  The stringify op might get constant-folded,
and folding of stringify is special, because the parser uses it
itself to implement qq().  So I had ck_join set op_folded to flag
the op as being a folded join.  Only that came too late, because
op_convert_list(OP_STRINGIFY,...) folds the op before it returns it.
Hence, the folded constant was flagged the wrong way, and stopped
being implicitly copied by refgen (\).
op.c
op.h
t/op/join.t