Vincent Pit [Sat, 8 Oct 2011 20:55:31 +0000 (22:55 +0200)]
Don't rely on accessing the values of Perl_runops_{standard,debug}
This doesn't work on Windows, so we have to use PL_runops_{std,dbg} instead.
But those two variables are not available before perl 5.8, so we have to
forbid the whole goto handling altogether on those perls for consistency.
Vincent Pit [Sun, 2 Oct 2011 21:00:53 +0000 (23:00 +0200)]
Fix goto &xsub in uplevel
The old debugging hack has been removed, because it could not cope at all
with the XSUB case. It is replaced by an runloop hijack.
Note that a side effect of this change is that su_uplevel_ud tokens are no
longer freed by su_uplevel_restore on pre-5.13.7 perls. This is needed in
order to ensure that the topmost token is available at all time for our
runloop replacement.
Vincent Pit [Mon, 19 Sep 2011 10:35:15 +0000 (12:35 +0200)]
Create the renamed CV as a shallow copy of the original one
From now they share the exact same pad, without any refcount bump. This
means that we have to handle the renamed CV destruction ourselves by
clearing its padlist entry before freeing it, but we need to reset its
depth anyway before that (or that would cause "still in use" warnings).
This allows us to call pp_entersub directly with the renamed CV as we were
doing earlier, and to remove the exotic destruction dance from
su_uplevel_restore().
Vincent Pit [Tue, 13 Sep 2011 21:10:36 +0000 (23:10 +0200)]
Don't rely on being able to access the old context in su_uplevel_restore()
It will be overwritten if the callback gotos into another subroutine.
This also fixes "Attempt to free unreferenced scalar" warning when the
debugger is enabled.
Vincent Pit [Tue, 13 Sep 2011 10:42:15 +0000 (12:42 +0200)]
Inline Perl_cv_clone() and Perl_new_pad()
What we really need to fake the callback's GV is a pure copy of it, but
Perl_cv_clone does not do this : it creates a new copy with a depth of 1
and an empty pad, which is appropriate for pp_anoncode but not for our
situation. The easiest way to fix this is simply to inline Perl_cv_clone()
in our code, set up the copy's depth from the original, and crudely copy
the old pad into a new one.
This fixes closures defined in the uplevel callback that captures lexical
from outside of the uplevel call, and also allows us to remove all the
hacks from the previous su_cv_clone().
Vincent Pit [Fri, 9 Sep 2011 23:53:13 +0000 (01:53 +0200)]
Activate the correct pad when calling the uplevel'd code
This fixes at least two issues :
- closures defined inside the uplevel callback can now wrap around
lexicals from inside (but not outside yet, this will be fixed by the
next commit).
- state variables in the uplevel callback now work properly.
Vincent Pit [Sun, 4 Sep 2011 14:10:38 +0000 (16:10 +0200)]
Move the unwind()-related members of the global context in their own struct
Also correct the third argument to Zero() calls used to initialize the
return_op and proxy_op members : the size was passed, while it is supposed
to be the type.
Vincent Pit [Mon, 20 Dec 2010 00:25:57 +0000 (01:25 +0100)]
Skip threads tests unless perl version is 5.13.4 or greater
There was a long standing bug in the handling of GV <-> CV double linkage
that could (and explicitely did with a poisonous perl) cause segfaults at
thread destruction. It got fixed by Dave in commit 803f274 which went in
5.13.3, but the fix was amended for 5.13.4 in commit 09aad8f. Since it's
not really fair for the user to not be able to install the module because
of this, we skip the threads tests unless perl is at least 5.13.4.