So, new problem I have found based on the change to restoring $@, $!, and
$?.
perl-bleads ext/XS-APItest/t/svpeek.t has 2 test failures.
One tests $! and it *looks like* it assumes something recently looked at $!
from a string context:
like (DPeek ($!), qr'^PVMG\("', '$!');
I can fix the test like this:
# This tests expects that $! will have been used as a string recently.
> my $foo = "$!";
> like (DPeek ($!), qr'^PVMG\("', '$!');
The other checks $? and *looks like* it verifies it has not been looked at
by anything:
if ($^O eq 'VMS') {
> # VMS defines COMPLEX_STATUS and upgrades $? to PVLV
> is (DPeek ($?), 'PVLV()', '$?');
> } else {
> is (DPeek ($?), 'PVMG()', '$?');
> }
This can be fixed by a similar trick (not tested in vms as I have no vms
system):
if ($^O eq 'VMS') {
> local $?; # Reset anything Test::* has done to it.
> # VMS defines COMPLEX_STATUS and upgrades $? to PVLV
> is (DPeek ($?), 'PVLV()', '$?');
> } else {
> local $?; # Reset anything Test::* has done to it.
> is (DPeek ($?), 'PVMG()', '$?');
> }
This was never a problem when we localized $! and $@. But now that we are
reading the current value, then restoring it, we no longer preserve the
internals of the variables, just the surface values.
This is the only test I have found broken by this. A test in the perl test
suite itself. I have not found anything on cpan broken by this, but my
testing is not a full smoke.
I am just reaching out to see if anyone predicts this is an *actual*
problem? Is it just as simple as updating the 1 failing test and calling it
good, or is this actually a scary thing? If it is scary, then I would love
pointers on how I can actually preserve the internal state of the variables
as well as their value, but I would really prefer not to do that if I do
not have to.
-Chad
On Mon, Jan 18, 2016 at 12:39 AM, Aristotle Pagaltzis <[email protected]>
wrote:
> * Chad Granum <[email protected]> [2016-01-18 06:55]:
> > Which behavior do you want, preserve one, preserve all, preserve what
> > is requested in arguments?
>
> I didn’t consider that. I was thinking ->release would take an optional
> bool flag and that’s all. But you’re right that this would not be enough
> and that providing enough interface to cover all the cases makes it too
> complicated to be worth it.
>
> > my $err = $@;
> > $ctx->release();
> > $@ = $err;
>
> Heh, which implies an obvious and amusing improvement:
>
> { local $@; $ctx->release }
>
> Which is *easier* than any special interface, too. So, scrap that.
>
> Regards,
> --
> Aristotle Pagaltzis // <http://plasmasturm.org/>
>