Vincent Pit [Sun, 26 Mar 2023 16:00:16 +0000 (18:00 +0200)]
This is 0.34
Vincent Pit [Sun, 26 Mar 2023 15:29:54 +0000 (17:29 +0200)]
Work around test failures in t/64-uplevel-caller.t
This is probably related to the caller behaviour change re-re-introduced
with core commit
f6387cf.
Vincent Pit [Sun, 26 Mar 2023 15:24:28 +0000 (17:24 +0200)]
Fix assertion failure on 5.37.10
Seems like PL_curpad[0] doesn't have an excessive refcount anymore.
Vincent Pit [Sun, 26 Mar 2023 12:54:19 +0000 (14:54 +0200)]
Bump copyright year
Vincent Pit [Sun, 26 Mar 2023 12:51:59 +0000 (14:51 +0200)]
Add a CONTRIBUTING guidelines file
Yves Orton [Sat, 4 Mar 2023 08:00:37 +0000 (09:00 +0100)]
Upper.xs - in 5.37.6 cop_warnings became a char * (RCVP)
It is actually a RCPV (RefCounted PV), so we can use RCPV_LEN() to
find its length.
Unfortunately there is not currently a way to "mortalize" a RCPV,
an oversight that I will correct in a future release of Perl. But
for now this should do.
Yves Orton [Sat, 4 Mar 2023 07:54:04 +0000 (08:54 +0100)]
t/ - Given is deprecated in 5.37.10, do not test it
This silences vast numbers of warnings, and will prevent the module
from breaking in 5.42.
Vincent Pit [Mon, 20 Dec 2021 20:30:57 +0000 (21:30 +0100)]
This is 0.33
Vincent Pit [Mon, 20 Dec 2021 20:23:04 +0000 (21:23 +0100)]
Update Test::Leaner to
f53f8d6
Vincent Pit [Mon, 20 Dec 2021 18:52:27 +0000 (19:52 +0100)]
Update META spec to 2.0
See you, Kent.
This fixes [RT #114816].
Vincent Pit [Mon, 20 Dec 2021 18:29:55 +0000 (19:29 +0100)]
Bump copyright year
James E Keenan [Tue, 2 Nov 2021 23:13:39 +0000 (23:13 +0000)]
Make the expected() utility more closely match context_info()
context_info() returns $warnings::Bits{all} when the warnings for
a context is pWARN_ALL, while caller() returns WARN_ALLstring.
The test tried to avoid loading any modules that registered
warning categories to avoid this making a difference, but
DynaLoader is needed to load Scope::Upper, and DynaLoader uses
vars.pm which registers a warnings category.
This wasn't a problem when the default warning mask wasn't used up to a
byte boundary, but adding the experimental category in Perl 5 commit
3b54923c did align the warning mask on a byte boundary, leading to this
test failing.
Specifically, handle case where warnings mask contains only "\x55"
bytes. Return $warnings::Bits{all} in that case. As suggested by Tony
Cook in: https://rt.cpan.org/Ticket/Display.html?id=139823
BBC ticket: https://github.com/Perl/perl5/issues/19212
Most of commit message suggested by Tony Cook in:
https://github.com/jkeenan/p5-Scope-Upper/pull/1#issuecomment-
968375955
Vincent Pit [Mon, 8 Jul 2019 12:49:08 +0000 (14:49 +0200)]
This is 0.32
Vincent Pit [Mon, 8 Jul 2019 12:40:19 +0000 (14:40 +0200)]
Bump copyright year
Vincent Pit [Mon, 8 Jul 2019 12:39:54 +0000 (14:39 +0200)]
Update Test::Leaner to
0080661
Vincent Pit [Mon, 8 Jul 2019 12:39:22 +0000 (14:39 +0200)]
Update VPIT::TestHelpers to
0bb3aa5
Vincent Pit [Mon, 8 Jul 2019 12:38:18 +0000 (14:38 +0200)]
Update contact info
Vincent Pit [Mon, 8 Jul 2019 12:34:18 +0000 (14:34 +0200)]
Fix breakage caused by core change
f14cf363
This fixes [RT #129539].
Vincent Pit [Sun, 26 Aug 2018 19:50:59 +0000 (21:50 +0200)]
This is 0.31
Vincent Pit [Sun, 26 Aug 2018 19:10:57 +0000 (21:10 +0200)]
Bump copyright year
Vincent Pit [Sun, 26 Aug 2018 19:08:19 +0000 (21:08 +0200)]
Always apply localizations at the glob level
"localize '$x', $var" used to dereference $var and apply the localization
to $x directly. This did not set the IMPORTED flag on *x when necessary.
In order to fix this, we now follow the opposite logic : $var is now
referenced when the localization target is a scalar, and that reference is
assigned to *x so that localize now really behaves like "local *x = $var".
This fixes [RT #125931].
Vincent Pit [Sat, 4 Nov 2017 15:56:05 +0000 (16:56 +0100)]
This is 0.30
Vincent Pit [Sat, 4 Nov 2017 15:44:35 +0000 (16:44 +0100)]
Update VPIT::XSHelpers to
18554226
Vincent Pit [Sat, 4 Nov 2017 15:41:35 +0000 (16:41 +0100)]
Protect against d_cplusplus perls
It's only a matter of time before someone uses this in the wild.
Vincent Pit [Sat, 4 Nov 2017 15:34:29 +0000 (16:34 +0100)]
Bump copyright year
Vincent Pit [Sat, 4 Nov 2017 14:46:44 +0000 (15:46 +0100)]
Update VPIT::TestHelpers to
15e8aee3
Vincent Pit [Mon, 6 Jun 2016 12:00:34 +0000 (14:00 +0200)]
This is 0.29
Vincent Pit [Mon, 6 Jun 2016 10:48:02 +0000 (12:48 +0200)]
Thanks, Dave
Vincent Pit [Mon, 6 Jun 2016 10:41:43 +0000 (12:41 +0200)]
Bump copyright year
Vincent Pit [Mon, 6 Jun 2016 09:48:58 +0000 (11:48 +0200)]
Minor stylistic nits
No functional changes.
Vincent Pit [Mon, 6 Jun 2016 09:28:00 +0000 (11:28 +0200)]
Rename su_debug_log() into xsh_debug_log()
As it should have been in the big refactor change.
Vincent Pit [Mon, 6 Jun 2016 09:24:40 +0000 (11:24 +0200)]
Merge perl 5.24 fixes from davem
Vincent Pit [Mon, 6 Jun 2016 09:24:19 +0000 (11:24 +0200)]
ud_ is not unused in su_yield()
Vincent Pit [Mon, 6 Jun 2016 09:18:14 +0000 (11:18 +0200)]
Avoid partially braced if/else
Vincent Pit [Mon, 6 Jun 2016 09:15:18 +0000 (11:15 +0200)]
Hide aTHX in macros
Vincent Pit [Mon, 6 Jun 2016 09:02:52 +0000 (11:02 +0200)]
Only define su_cxt_enter_count when XSH_DEBUG is set
Vincent Pit [Mon, 6 Jun 2016 08:59:07 +0000 (10:59 +0200)]
Remove a couple of unused variable
Vincent Pit [Mon, 6 Jun 2016 08:53:10 +0000 (10:53 +0200)]
Prevent a future possible declaration-after-code error
Right now SU_HAS_NEW_CXT implies defined(gv_fetchsv), but better
make this more obvious.
Vincent Pit [Mon, 6 Jun 2016 08:52:26 +0000 (10:52 +0200)]
Actually restore old_cop in su_localize()
Vincent Pit [Sun, 5 Jun 2016 18:44:33 +0000 (20:44 +0200)]
Fix the build on perl 5.8.0
PERL_DEB() was not defined at that time.
Vincent Pit [Mon, 30 May 2016 13:12:35 +0000 (15:12 +0200)]
Always define SU_HAS_NEW_CXT
Vincent Pit [Mon, 30 May 2016 13:05:54 +0000 (15:05 +0200)]
Minor whitespace changes
David Mitchell [Sun, 29 May 2016 21:20:40 +0000 (22:20 +0100)]
fixup t/13-reap-ctl.t for 5.23.8
One test in this script failed under 5.23.8 due to a change in the way
the die while leaving an eval scope is now handled.
Consider the following code, where leaving an eval scope triggers a call
to STORE to unlocalise a tied scalar, and where STORE raises an exception:
sub TIESCALAR { bless [] }
sub FETCH { 1; }
sub STORE { die "died in store\n" if $_[1] }
tie $s, 'main';
eval {
local $s;
};
warn "caught: [$@]\n";
5.23.7 and earlier die, while 5.23.8 output:
caught: [died in store
]
Similarly, one would expect the behaviour of "reap HERE" to change
in 5.23.8, with an exception raised in the reap handler to now be caught
be the innermost eval.
So fix up the test to reflect this new reality.
David Mitchell [Sun, 29 May 2016 21:06:38 +0000 (22:06 +0100)]
eliminate CX_ARGARRAY() and CX_ARGARRAY_set()
I added these earlier as a way of compiling the code under both 5.23.7 and
5.23.8, since the latter no longer has the argarray field in the context
struct. I didn't know at the time whether they were logically correct
under 5.23.8 - I just wanted the code to compile.
Having now properly fixed uplevel() to work on 5.23.8, and since uplevel
under 5.23.8 uses an entirely separate code path, only 5.23.7 and earlier
make use of CX_ARGARRAY() and _set(), so eliminate these macros and
revert back to the original usage (i.e. cx->blk_sub.argarray).
David Mitchell [Tue, 17 May 2016 08:23:00 +0000 (09:23 +0100)]
fix uplevel() under 5.23.8+
The old method of creating a new curstackinfo containing the faked-up
new context stack no longer works. This is because leave_scope() is now
called just prior to each context stack entry popping, and so a destructor
which restores the old context array leaves a dangling pointer.
E.g. pp_leavesub() on 5.23.8 onwards looks something like:
cx = CX_CUR();
....
CX_LEAVE_SCOPE(cx);
/* at this point the destructor has been called and the old context
* stack back been restored; cx now points at freed garbage
*/
cx_popsub(cx); /* SEGV */
Conversely, now that it's guaranteed that the save stack is always
processed prior to each context pop - regardless of whether its a normal
scope exit or an exception - it allows us to use a simpler method to fake
things up for uplevel(): just temporarily change the types of all the
higher contexts to CXt_NULL so that they won't be seen by caller() etc. On
scope exit the savestack destructor restores the old types, which are then
processed and popped as normal.
As well as setting each entry to CXt_NULL we set a flag,
CXp_SU_UPLEVEL_NULLED (whose bit is currently unused by the perl core)
to indicate that this is a temporarily ignored context.
We then introduce a distinction between logical and physical context stack
indices: functions like UP return a logical index which ignore all the
nulled-out contexts; when such a logical value is passed as an arg to a
function such as localize(), it is first converted back to a real index.
The other main change is how uplevel() doctors the sub's arg list as seen
by caller(): previously this was done by modifying the argarray field of
the context entry for the just-called sub. Since 5.23.8 onwards doesn't
have an argarray field, we instead modify the pad[0] of the running sub
(which is what caller() examines now). Since there's no longer a
possibility of getting argarray and pad[0] out of sync, the special fixups
formerly required in the presence of goto are no longer required.
Rather than rolling our own OP_ENTERSUB op, we just use call_sv()
instead, with a PL_runops pointing to a temporary hook that allows the
args to be fixed up on return from pp_entersub. After that, a normal
runops loop is called.
Since uplevel is so different under 5.23.8, I've split the original
functions into
su_uplevel_old/su_uplevel_new
su_uplevel_restore_old/su_uplevel_restore_new
with #defines compiling only one set.
David Mitchell [Thu, 19 May 2016 11:03:48 +0000 (12:03 +0100)]
su_uplevel: populate lower stack frames properly
When creating a temporary new argument stack, su_uplevel() copies most of
the old stack to a new one. This isn't really needed, as the new stack
will be abandoned before it ever pops back to that level. But it *is*
needed when debugging code prints out the stack, as in for example,
'perl -Dstv'.
However, the code didn't actually copy the old stack: it copied garbage
instead, since it was using PL_curstack rather than AvARRAY(PL_curstack)
as the address of of the old stack. Which was causing 'perl -Dstv' to
SEGV.
This commit fixes that.
David Mitchell [Mon, 16 May 2016 13:52:07 +0000 (14:52 +0100)]
fix unwind()
Perl 5.23.4 debugging builds added asserts to POPMARK etc that nothing
was underflowing etc. At this point 52-unwind-context.t started failing
with
Perl_pp_return: Assertion `((my_perl->Imarkstack_ptr) >
(my_perl->Imarkstack)) || !"MARK underflow"' failed.
Properly pushing a new mark for pp_return to pop rather than doing it
manually seems to fix this.
David Mitchell [Mon, 16 May 2016 12:38:21 +0000 (13:38 +0100)]
get su_init/su_pop working under 5.23.8
In 5.23.8 there are two big differences to the way perl's context system
manipulates the savestack. Firstly, pushing a scope no longer does one or
two ENTER's instead the old value of PL_savestack_ix is stored as
cx->blk_oldsaveix. This means that the boundaries of savestack frames are
now not only specified as scopestack entries, but also as blk_oldsaveix
entries.
Secondly, most values that need restoring are saved in new fields in the
CX structure rather than being pushed on the savestack; this means that it
is quite likely that two nested scopes can share the same savestack index.
This commit gets all the test scripts working that mainly test the
savestack manipulation code (su_init and su_pop).
It does this by:
*) allowing the offset by which a savestack frame boundary is adjusted to
be variable (rather than always SU_SAVE_DESTRUCTOR_SIZE), and by turning
the origin array into an array of structs, one field of which is the
offset for that depth. This allows multiple empty savestack frames
to all trigger, by ensuring that each adjusted boundary is higher than the
previous.
*) padding the savestack using SAVEt_ALLOC, which allows a variable-sized
chunk of savestack to be reserved, with minimal overhead during scope exit.
In addition,
*) the various SU_SAVE_AELEM_SIZE type macros have been rationalised and
better commented;
*) debugging output for su_init and su_pop has been improved
*) the names of context types (for debugging) have been updated for 5.23.8
and some errors fixes for older perl versions
David Mitchell [Mon, 16 May 2016 12:34:09 +0000 (13:34 +0100)]
Some basic 5.23.8 fixes
The context system has changed a lot in 5.23.8. This commit
just gets the code compiling again; it doesn';t attempt to fix any
breakage.
David Mitchell [Thu, 14 Apr 2016 14:39:37 +0000 (15:39 +0100)]
Temporarily rename xsh_debug_log to su_debug_log
In a previous commit that function was renamed, but none of its callers
were renamed. For now, revert the function back to its old name
Vincent Pit [Mon, 9 Nov 2015 17:45:27 +0000 (15:45 -0200)]
Fix off-by-one error in su_uplevel_ud->si initialization
si->si_cxmax is the last available context slot, hence should be -1 if we
don't allocate any.
Vincent Pit [Wed, 4 Nov 2015 13:36:29 +0000 (11:36 -0200)]
The Big Boilerplate Factorization
Vincent Pit [Tue, 18 Aug 2015 15:01:22 +0000 (12:01 -0300)]
This is 0.28
Vincent Pit [Tue, 18 Aug 2015 13:53:27 +0000 (10:53 -0300)]
Don't hardcode the length of NEGATIVE_INDICES_VAR
Vincent Pit [Tue, 18 Aug 2015 13:44:41 +0000 (10:44 -0300)]
Only dump debug info when $Scope::Upper::DEBUG is true
Vincent Pit [Tue, 18 Aug 2015 13:40:09 +0000 (10:40 -0300)]
Factor a part of the debugging logic into an helper function
Vincent Pit [Tue, 18 Aug 2015 13:11:50 +0000 (10:11 -0300)]
Add braces around a condition block
Vincent Pit [Tue, 18 Aug 2015 13:05:29 +0000 (10:05 -0300)]
Add a comment in the initializing loop in su_init()
Vincent Pit [Mon, 3 Aug 2015 19:22:15 +0000 (16:22 -0300)]
Document the new warnings and caveats
Vincent Pit [Mon, 3 Aug 2015 19:00:16 +0000 (16:00 -0300)]
Add some comments to the mysterious su_init()/su_pop()
Vincent Pit [Mon, 3 Aug 2015 18:21:15 +0000 (15:21 -0300)]
Remove one level of indirection in the UID internal structure
On top of the memory savings, this seems to make the UID stress test about
7% faster, even with a threaded build.
Vincent Pit [Mon, 3 Aug 2015 17:09:01 +0000 (14:09 -0300)]
Port t/79-uid-threads.t to the new threads interface
For some reason it was still calling threads->create(). This commit also
makes sure that the test is resilient to stray exits.
Vincent Pit [Mon, 3 Aug 2015 17:06:18 +0000 (14:06 -0300)]
Harden t/69-uplevel-threads.t against stray exits
Vincent Pit [Mon, 3 Aug 2015 17:04:59 +0000 (14:04 -0300)]
Harden t/59-yield-threads.t against stray exits
Vincent Pit [Mon, 3 Aug 2015 17:03:36 +0000 (14:03 -0300)]
Harden t/54-unwind-threads.t against stray exits
Vincent Pit [Mon, 3 Aug 2015 16:59:26 +0000 (13:59 -0300)]
Harden t/09-load-tests.t against stray exits
Vincent Pit [Mon, 3 Aug 2015 16:58:42 +0000 (13:58 -0300)]
Update VPIT::TestHelpers to
ba865c42
Vincent Pit [Mon, 3 Aug 2015 16:52:20 +0000 (13:52 -0300)]
Also warn when SUB() and EVAL() cannot find an appropriate target
Vincent Pit [Mon, 3 Aug 2015 16:00:08 +0000 (13:00 -0300)]
Warn when the words target a context outside of the current stack
Note that the check is done when the target context is defined and not
when the helpers use it.
This fixes RT #104751.
Vincent Pit [Mon, 3 Aug 2015 14:03:13 +0000 (11:03 -0300)]
Stop copying the reap-ed coderef
Vincent Pit [Mon, 3 Aug 2015 13:56:54 +0000 (10:56 -0300)]
Remove some extraneous SU_UD_ORIGIN(ud) initializations
Vincent Pit [Mon, 3 Aug 2015 13:42:36 +0000 (10:42 -0300)]
Revamp the different su_ud_* subtypes
For reap(), su_call() now only gets the SV cb and not the whole su_ud_reap
structure. This lets us free the ud in su_pop(), and likewise for
su_localize(). As for the uid feature, it gets its own su_ud_uid structure
instead of hijacking su_ud_reap, so that su_uid_bump() is no longer needed.
Vincent Pit [Mon, 3 Aug 2015 13:15:30 +0000 (10:15 -0300)]
Replace the su_handler[] dispatch table by a switch
This lets us inline the handlers in su_pop(), which is somewhat clearer.
Vincent Pit [Fri, 31 Jul 2015 19:01:42 +0000 (16:01 -0300)]
Remove the code coverage link
It's outdated and now covered by cpancover.
Vincent Pit [Fri, 24 Jul 2015 20:20:18 +0000 (17:20 -0300)]
Refactor the su_ud_common structure
The handler member is replaced by a small integer index into a static array.
The pad member is shrank so that it can be packed together with the type.
In the remaining space, we fit a private member that can be used to remove
the type member of su_ud_localize.
Vincent Pit [Fri, 24 Jul 2015 19:22:21 +0000 (16:22 -0300)]
Greatly simplify the depth computation in su_init()
In order to count how many scopes we will have to pop, it is enough to take
the difference between the current scope (PL_scopestack_ix) and the one
just below the target context (cxstack[cxix].blk_oldscopesp).
Vincent Pit [Wed, 22 Jul 2015 17:28:36 +0000 (14:28 -0300)]
Give a proper definition of SU_CXNAME() for non DEBUGGING builds
Vincent Pit [Wed, 22 Jul 2015 14:24:48 +0000 (11:24 -0300)]
Rewrite the origin initialization loop in su_init()
It used to iterate downward, and then the indices used were of the form
a - i and b - i.
Vincent Pit [Wed, 24 Jun 2015 13:10:17 +0000 (10:10 -0300)]
Silence a 'shadowing' warning
Vincent Pit [Mon, 20 Apr 2015 14:54:58 +0000 (11:54 -0300)]
Update t/09-load-threads.t
It now also exercises cloning.
Vincent Pit [Mon, 20 Apr 2015 14:43:32 +0000 (11:43 -0300)]
Update VPIT::TestHelpers to
2a6ac0f1
Vincent Pit [Tue, 7 Apr 2015 00:05:03 +0000 (21:05 -0300)]
Update t/09-load-threads.t
It now has better diagnostics in case of failure, and it tests asymetrical
thread termination.
Vincent Pit [Tue, 31 Mar 2015 17:34:26 +0000 (14:34 -0300)]
Add a missing volatile qualifier
Vincent Pit [Tue, 31 Mar 2015 17:24:43 +0000 (14:24 -0300)]
Improve scheduling for the parallel loading test
Vincent Pit [Fri, 27 Mar 2015 22:10:45 +0000 (19:10 -0300)]
This is 0.27
Vincent Pit [Fri, 27 Mar 2015 21:34:26 +0000 (18:34 -0300)]
Document that we can no longer die from uplevel in the debugger
Vincent Pit [Fri, 27 Mar 2015 19:45:02 +0000 (16:45 -0300)]
Also preserve PL_scopestack[cx->blk_oldscopesp - 1] in formats
Vincent Pit [Fri, 27 Mar 2015 19:08:14 +0000 (16:08 -0300)]
Correctly use $TEST_VERBOSE in the testdeb target
Vincent Pit [Fri, 27 Mar 2015 18:47:42 +0000 (15:47 -0300)]
Preserve PL_scopestack[cx->blk_oldscopesp - 1] in su_pop()
Starting from perl 5.19.4 commit
2537512, pp_leavesub does a second
leave_scope(PL_scopestack[cx->blk_oldscopesp - 1]) just after the usual
LEAVE call. However, this index in the scope stack may be overwritten
by our own "flush" leave_scope() call in su_pop(). More precisely, this
seems to happen in sv_clear() (called from sv_free2() called from
sv_unref_flags() called from sv_force_normal_flags() called from
leave_scope()) and only when the debugger is enabled.
Vincent Pit [Tue, 24 Mar 2015 20:35:00 +0000 (17:35 -0300)]
Add POSIX to build requires
Vincent Pit [Tue, 24 Mar 2015 19:54:30 +0000 (16:54 -0300)]
Update the ActivePerl/gcc-3.4 hack for EUMM 7.04
Starting from this version, PERL_ARCHIVE is quoted so we can no longer set
it to the empty string. Instead, we remove all occurrences of PERL_ARCHIVE
in the linking step section of the Makefile, which is OK since we specify
the perl DLL in other variables. This new technique is still valid for
older versions of EUMM.
Vincent Pit [Tue, 24 Mar 2015 02:30:16 +0000 (23:30 -0300)]
Don't compile su_uplevel_storage_delete() before perl 5.13.7
As it is unused on these older perls.
Vincent Pit [Tue, 24 Mar 2015 02:25:29 +0000 (23:25 -0300)]
Protect t/09-load-threads.t against old relocated perls
Vincent Pit [Tue, 24 Mar 2015 02:24:10 +0000 (23:24 -0300)]
Update VPIT::TestHelpers to
4eeb5afc
Vincent Pit [Tue, 24 Mar 2015 00:15:43 +0000 (21:15 -0300)]
Also test that the module can be loaded in the main body
Vincent Pit [Tue, 24 Mar 2015 00:14:16 +0000 (21:14 -0300)]
In t/09-load-threads.t, handle spawn() failures gracefully
Vincent Pit [Mon, 23 Mar 2015 19:21:23 +0000 (16:21 -0300)]
Thoroughly test module loading in threads
Vincent Pit [Mon, 23 Mar 2015 19:15:04 +0000 (16:15 -0300)]
Update VPIT::TestHelpers to
6ca15279
Vincent Pit [Thu, 19 Mar 2015 19:25:32 +0000 (16:25 -0300)]
Update VPIT::TestHelpers to
6cd68168
And port threads tests to its new interface. The new 'force threads test'
environment variable is PERL_FORCE_TEST_THREADS.
Vincent Pit [Thu, 19 Mar 2015 16:08:35 +0000 (13:08 -0300)]
Release UID global memory at global teardown time