Front page | perl.perl5.porters |
Postings from February 2018
Re: [perl #132783] Blead Breaks CPAN: ADAMK/SQL-String-0.02.tar.gz
Thread Previous
|
Thread Next
From:
Dave Mitchell
Date:
February 20, 2018 09:20
Subject:
Re: [perl #132783] Blead Breaks CPAN: ADAMK/SQL-String-0.02.tar.gz
Message ID:
20180220092003.GD3216@iabyn.com
On Wed, Jan 31, 2018 at 01:10:33PM +0000, Zefram wrote:
> Smylers wrote:
> >Why is it wrong for that to warn?
>
> The question is whether .= stringifies its rhs in this case. If it
> stringifies, passing an actual string to the lhs overload, then it is
> correct to gripe about undef. If it does not stringify, and so passes
> the rhs value to the lhs overload as-is, then it is up to the overload
> method to determine what operand values are valid, and .= has no business
> opining on the matter.
>
> In fact both 5.26.0 and 5.27.8 are agreed: .= does not stringify the rhs
> in this case. They do not call stringification overloads, and do not
> flatten references. They pass the rhs value to the lhs overload as-is.
Now fixed in blead with:
commit af39014264c90cfc5a35e4f6e39ba038a8fb0c29
Author: David Mitchell <davem@iabyn.com>
AuthorDate: Sat Feb 10 15:27:59 2018 +0000
Commit: David Mitchell <davem@iabyn.com>
CommitDate: Mon Feb 19 22:06:49 2018 +0000
redo magic/overload handing in pp_multiconcat
The way pp_multiconcat handles things like tieing and overloading
doesn't work very well at the moment. There's a lot of code to handle
edge cases, and there are still open bugs.
The basic algorithm in pp_multiconcat is to first stringify (i.e. call
SvPV() on) *all* args, then use the obtained values to calculate the total
length and utf8ness required, then do a single SvGROW and copy all the
bytes from all the args.
This ordering is wrong when variables with visible side effects, such as
tie/overload, are encountered. The current approach is to stringify args
up until such an arg is encountered, concat all args up until that one
together via the normal fast route, then jump to a special block of code
which concats any remaining args one by one the "hard" way, handling
overload etc.
This is problematic because we sometimes need to go back in time. For
example in ($undef . $overloaded), we're supposed to call
$overloaded->concat($undef, reverse=1)
so to speak, but by the time of the method call, we've already tried to
stringify $undef and emitted a spurious 'uninit var' warning.
The new approach taken in this commit is to:
1) Bail out of the stringify loop under a greater range of problematical
variable classes - namely we stop when encountering *anything* which
might cause external effects, so in addition to tied and overloaded vars,
we now stop for any sort of get magic, or any undefined value where
warnings are in scope.
2) If we bail out, we throw away any stringification results so far,
and concatenate *all* args the slow way, even ones we're already
stringified. This solves the "going back in time" problem mentioned above.
It's safe because the only vars that get processed twice are ones for which
the first stringification could have no side effects.
The slow concat loop now uses S_do_concat(), which is a new static inline
function which implements the main body of pp_concat() - so they share
identical code.
An intentional side-effect of this commit is to fix three tickets:
RT #132783
RT #132827
RT #132595
so tests for them are included in this commit.
One effect of this commit is that string concatenation of magic or
undefined vars will now be slower than before, e.g.
"pid=$$"
"value=$undef"
but they will probably still be faster than before pp_multiconcat was
introduced.
--
print+qq&$}$"$/$s$,$a$d$g$s$@$.$q$,$:$.$q$^$,$@$a$~$;$.$q$m&if+map{m,^\d{0\,},,${$::{$'}}=chr($"+=$&||1)}q&10m22,42}6:17a2~2.3@3;^2dg3q/s"&=~m*\d\*.*g
Thread Previous
|
Thread Next