Branch: refs/heads/smoke-me/davem/rc_stack2 Home: https://github.com/Perl/perl5 Commit: 1c225879cac659926264ddb4d152f0389746ccc7 https://github.com/Perl/perl5/commit/1c225879cac659926264ddb4d152f0389746ccc7 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023)
Changed paths: M dump.c Log Message: ----------- perl -DsR: display PADMTPs as <P> The R modifier to the stack debugging switch -Ds already indicates if an SV's refcount is > 1 or SvTEMP is set (T), or the SV is on the temps stack without SvTEMP set (t), e.g.: => IV(101), <2>IV(102), <T>IV(103) <3t>IV(104) With this commit, it displays SVs with the SvPADTMP flag set as <P>, e.g. => <P>IV(101), <2P>IV(102), <PT>IV(103) Commit: 429e57e4e3355a76c0c5518684dc71bc2a58d550 https://github.com/Perl/perl5/commit/429e57e4e3355a76c0c5518684dc71bc2a58d550 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sys.c Log Message: ----------- fix check order for filetest overload The tryAMAGICftest_MG() macro was doing two checks: 1) seeing whether the filetest operator's arg (*PL_stack_sp) looks to have magic or be a reference, 2) and if the op has children (which will have pushed an arg, unlike (-X _), If both are true, then do full-on magic and/or overload processing. The problem with this is that it checks the arg *before* checking whether there's even an arg. Thus in the case of (-X _), it is actually examining a random SV on the stack (or in the case of nothing on the stack, examining the PL_sv_undef pointer always stored at PL_stack_base[0] as a guard.) It turns out this was harmless - the test for (1) will examine a random (but real) SV and get garbage results, but then the 2nd test will fail anyway, so overloading won't be called. So the fix is to swap the (1) and (2) test order. In addition, I changed the 'has an argument' test from OPf_KIDS to !OPf_REF. These should be mutually exclusive, but the OPf_REF flag formally indicates (-X _), i.e. that no arg has been pushed on the stack. Whether the op has children or not could potentially change in the future, independent of whether it's the (-X _) form. So overall this commit makes no visible functional difference, but may make the code more robust against future changes. Commit: edcab74489addbd4f86c130bca40383eef7bc162 https://github.com/Perl/perl5/commit/edcab74489addbd4f86c130bca40383eef7bc162 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M sv.c Log Message: ----------- NULL sv->sv_debug_file when freed This field is used on DEBUG_LEAKING_SCALARS builds to track the file where the SV was allocated. When freeing the SV, the string was freed but the pointer was left pointing at the freed string. So NULL it out. Commit: 25c077444430f02dcabec37e315ff9c36721d464 https://github.com/Perl/perl5/commit/25c077444430f02dcabec37e315ff9c36721d464 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp.c M pp_ctl.c Log Message: ----------- don't call pp_pushmark() to push a mark A few places were calling pp_pushmark(), when they should have been just directly doing a PUSHMARK() Commit: 2d560f5750cb72fa335969c112f30ce25aac7c96 https://github.com/Perl/perl5/commit/2d560f5750cb72fa335969c112f30ce25aac7c96 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- simplify scope-exit empty scalar context Perl_leave_adjust_stacks(), which is called by all the scope-exiting ops (pp_leave, pp_leavesub etc), handles scalar context by updating the list of SVs on the stack to be returned to be just the one-item list at the top of the stack (all other items on the stack being discarded). For the special case of scalar context and no items on the return list, it instead puts &PL_sv_undef at the lowest point on the stack and skips most of the rest of the function. The rest of the function includes things like shuffling down any args to be returned, which obliterates any other stuff on that stack that needs discarding. For example in for (qw(a b c)) { ....; return qw(x y z); ... } the stack contains a b c x y z; the a,b,c need discarding and the x,y,z shifting down. This commit removes the 'skip rest' special behaviour, and makes scalar return of an empty list behave the same as a scalar return of a non-empty list. So it pushes &PL_sv_undef at the top of the stack, then goes through the normal "shift and copy the top arg down the stack" code path. This is slightly less efficient, but this is relatively rare condition, and will make converting Perl_leave_adjust_stacks() to handle a reference-counted stack easier. Commit: 002c5f31c0e63ec76fccb94105508e40913541d4 https://github.com/Perl/perl5/commit/002c5f31c0e63ec76fccb94105508e40913541d4 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M inline.h M pp_ctl.c M t/op/for.t Log Message: ----------- for loops: protect GV/LVREF from premature free In something like for $package_var (....) { ... } or more experimentally, for \$lvref (....) { ... } when entering the loop in pp_enteriter, perl would pop the GV/LVREF off the stack, but didn't bump its refcount. Thus it was possible (if unlikely) that it could be freed during the loop. In particular this crashed: $f = "foo"; for ${*$f} (1,2) { delete $main::{$f}; # delete the glob *foo ...; } This will become more serious when the stack becomes refcounted, as popping something off the stack will trigger a refcount decrement on it and thus a possible immediate free of the GV. This commit future-proofs for loops against this by ensuring that the refcount of the SV referred to by cx->blk_loop.itervar_u.svp is appropriately bumped up / down on entering / exiting the loop. Commit: 740366783ec72ff403868053a616897bac552265 https://github.com/Perl/perl5/commit/740366783ec72ff403868053a616897bac552265 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c M pp_hot.c Log Message: ----------- add code comments concerning grep and map markstack usage Commit: c40a3b669862513883253f62a25a8c732c7b8b70 https://github.com/Perl/perl5/commit/c40a3b669862513883253f62a25a8c732c7b8b70 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- rationalise S_unwind_loop() This function is a bit of mess. It gets the label string either from the op, or for OPf_STACKED, from the SV at the top of the stack. This commit reduces the amount of OPf_STACKED tests and repeated stack accesses for the label SV (even after it's notionally been popped off the stack!) By simplifying the code, it will also make it easier to make the changes necessary for a reference-counted stack. Commit: 1ba93dafc8106c38cd2bc032cf30b0135205c5c9 https://github.com/Perl/perl5/commit/1ba93dafc8106c38cd2bc032cf30b0135205c5c9 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sort.c Log Message: ----------- pp_sort(): add comments what the op flags mean Commit: eda8934f283879153dd0938119e88f156050ce4f https://github.com/Perl/perl5/commit/eda8934f283879153dd0938119e88f156050ce4f Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sort.c Log Message: ----------- pp_sort(): rename a duplicated variable 'av' is in scope both for the whole function, and for a small block within that function. Rename the inner variable to av0 to avoid confusion. Commit: 4503cd1c75a54297fc03298b2d76163a91097679 https://github.com/Perl/perl5/commit/4503cd1c75a54297fc03298b2d76163a91097679 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M t/op/sub.t M t/run/fresh_perl.t Log Message: ----------- move test out of fresh_perl.t into sub.t This test looks for a 'Use of freed value in iteration' warning, which will soon disappear when this branch makes the stack reference counted. Make the test more modifiable so that it can be made conditional on build options. Commit: f72fdcfe222d383a0e08e64b567d4c1b04a24408 https://github.com/Perl/perl5/commit/f72fdcfe222d383a0e08e64b567d4c1b04a24408 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M gv.c M perl.c Log Message: ----------- call_sv, amagic_call: call pp_entersub via runops These two functions do a slightly odd thing (which has been present since 5.000) when calling out to a CV: they half fake up an OP_ENTERSUB, then call pp_entersub() directly, and only then if it returns a non-null PL_op value, execute the rest of the ops of the sub within a CALLRUNOPS() loop. I can't find any particular reason for this. I guess it might make calling XS subs infinitesimally faster by not have to invoke the runops loop when only a single op is executed (the entersub), but hardly seems worth the effort. Conversely, eliminating this special-case makes the code cleaner, and it will allow the workarounds planned to be added shortly (to the runops loops for reference-counted stacks) to work uniformly. Without this commit, pp_entersub() would get called before runops() has had a chance to fix up the stack if necessary. So this commit *fully* populates the fake OP_ENTERSUB (including type and pp address) then causes pp_entersub to be invoked implicitly from the runops loop rather than explicitly. Commit: 16ee50e3957d700ee63074708ef5b5d66d091364 https://github.com/Perl/perl5/commit/16ee50e3957d700ee63074708ef5b5d66d091364 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M lib/B/Op_private.pm M opcode.h M perl.c M pp_ctl.c M regen/op_private Log Message: ----------- eval_sv(): call pp_entereval() via runops Like the previous commit which did it for amagic_call() and call_sv(), this commit makes executing the faked-up OP_ENTEREVAL be executed as part of the runops loop rather than as a separate call. This is to allow shortly fixing up for a reference-counted stack. (CALLRUNOPS() will reify the stack if necessary, while the raw call to pp_entereval() won't fix up the stack unless its part of the runops loop too.) However, this is a bit more complex than call_sv() etc in that there is a good reason for calling pp_entereval() separately. The faked up OP_ENTEREVAL has its op_next set to NULL - this is the op which would normally be returned on failure of the eval compilation. By seeing whether the retuned value from pp_entereval() is NULL or not, eval_sv() can tell whether compilation failed. On the other hand, if pp_entereval() was made to be called as part of the runops loop, then the runops loop *always* finishes with PL_op set to NULL. So we can no lo longer distinguish between compile-failed and compile-succeeded-and-eval-ran-to-completion. This commit moves the entereval into the runops loop, but restores the ability to distinguish in a slightly hacky way. It adds a new private flag for OP_ENTEREVAL - OPpEVAL_EVALSV - which indicates to pp_entereval() that it was called from eval_sv(). And of course eval_sv() sets this flag on the OPpEVAL_EVALSV op it fakes up. If pp_entereval() fails to compile, then if that flag is set, it pushes a null pointer onto the argument stack before returning. Thus by checking whether *PL_stack_sp is NULL or not on return from CALLRUNOPS(), eval_sv() regains the ability to distinguish the two cases. Commit: 787cdc073a71fd4e2efae696834feac345b9b3f3 https://github.com/Perl/perl5/commit/787cdc073a71fd4e2efae696834feac345b9b3f3 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/XS-APItest/APItest.xs Log Message: ----------- XS::APItest::test_EXTEND(): fixups This XS function is for testing the stack-extending EXTEND() macro. This commit fixes two issues. 1) it uses a nested 'sp' variable declaration in addition to the one declared implicitly, which is confusing. Use a separate variable called new_sp instead. This changes the logic slightly, since the EXTEND() macro messes implicitly with sp, including updating it after a realloc. We have to do that manually now with new_sp. 2) The test function NULLs a couple of items near the top of the (potentially just extended) stack. Where the extend size is zero, it could be NULLing out one or two of the passed arguments on the stack. At the moment these values aren't used any more and are discarded on return; but it will get messy once the stack becomes reference-counted, so only NULL addresses if they're above PL_stack_sp. Commit: 7ae127a0c8090dd7263986732ca898e379f76376 https://github.com/Perl/perl5/commit/7ae127a0c8090dd7263986732ca898e379f76376 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/XS-APItest/t/magic.t Log Message: ----------- ext/XS-APItest/t/magic.t: simplify recent test A test recently added to check reference count of a stored AV element had to account for extra reference counts from the temporary refs generated by if (\$a[0] == \$j) { ... } Instead, calculate this boolean value in a separate statement so the ref counts are easier to understand. Commit: acb9c73c585033f051d89e44b5164891d283e0b3 https://github.com/Perl/perl5/commit/acb9c73c585033f051d89e44b5164891d283e0b3 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M deb.c Log Message: ----------- Perl_deb_stack_all() - handle empty CX stack This function handles perl -Dsv, producing output like STACK 0: MAIN CX 0: BLOCK => CX 1: SUB => UNDEF PV("main"\0) retop=leave STACK 1: MAGIC CX 0: SUB => IV(1) When a CX stack had zero contexts pushed (like can sometimes happen when something has just done a PUSHSTACKi() and no op has pushed a BLOCK or SUB or whatever yet), then the code for determining where the next markstack pointer is (by peeking ahead into the first CX of the next SI) was accessing random garbage at cx[0]. This commit fixes that. Commit: db8d6f8aa15d6fb996944475622b542407fa730c https://github.com/Perl/perl5/commit/db8d6f8aa15d6fb996944475622b542407fa730c Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M perl.c M perl.h Log Message: ----------- add PERL_RC_STACK define (not yet defined) This macro turns on stack reference counting. Add the macro, but commented out for now. In addition, temporarily define and enable PERL_XXX_TMP_NORC. This is a temporary transition measure: even in the presence of PERL_RC_STACK, do not actually modify reference counts yet. So PERL_RC_STACK will still define all the new static functions and code behaviour, except for the bits that actually modify reference counts in ways that assume the stack is reference counted. It allows this branch to have many commits which incrementally deal with adding support for PERL_RC_STACK, with each individual commit still working while half of the core is still not yet "ref count aware". Commit: 043f8b1bfe4cf2e4d5db194fc9d0f1379fff1e34 https://github.com/Perl/perl5/commit/043f8b1bfe4cf2e4d5db194fc9d0f1379fff1e34 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M lib/Internals.pod M universal.c Log Message: ----------- add Internals::stack_refcounted() This indicates whether perl has been built with PERL_RC_STACK. For now this should only be used by core; It's not yet decided whether CPAN modules have a use case too. Commit: 54af9849255e0ef4368cae5ca0ea6f52ef78bd61 https://github.com/Perl/perl5/commit/54af9849255e0ef4368cae5ca0ea6f52ef78bd61 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/Devel-Peek/t/Peek.t Log Message: ----------- ext/Devel-Peek/t/Peek.t: fixup top refcount There are a few 'expected' Dump() output patterns which expect the refcount of the top-most SV in the tree to be fixed number like REFCNT = 1 Change all those occurrences to REFCNT = \d+ or similar, since a reference-counted stack will cause higher values Commit: 8b4b83d8f691d02ca388ed284b749fe3a540be51 https://github.com/Perl/perl5/commit/8b4b83d8f691d02ca388ed284b749fe3a540be51 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c M scope.c Log Message: ----------- pp_dbstate: skip SAVESTACK_POS() On PERL_RC_STACK builds, skip the call to SAVESTACK_POS(). I suspect that saving the stack position is no longer required. It was added in 5.001 by: NETaa13155: &DB::DB left trash on the stack. From: Thomas Koenig Files patched: lib/perl5db.pl pp_ctl.c The call by pp_dbstate() to &DB::DB left trash on the stack. It now calls DB in list context, and DB returns (). but the details of what bug it fixed are long lost to history. SAVESTACK_POS() doesn't work well with stacks which may be split into partly reference-counted and partly not halves, so skip it and hope it doesn't cause any problems. Also, assert that SAVEt_STACK_POS isn't used anywhere any more. Commit: 169244ada75081376375d17c7b958ad9c0598a99 https://github.com/Perl/perl5/commit/169244ada75081376375d17c7b958ad9c0598a99 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- pp_mapwhile(): null out holes in stack >From time to time, pp_mapwhile() shifts up any remaining args on the stack, in order to leave enough space to add the current results to any accumulated results. This leaves a hole in the stack, which might not be fully filled until the last iteration. As well as making the output of perl -Ds confusing, any garbage left in the hole will double-count towards the reference count of each SV once the stack becomes reference-counted. So fill the newly-created hole in the stack with NULL pointers. Commit: 00afe5be90f002de5374ba4d4b9f49255396a9ab https://github.com/Perl/perl5/commit/00afe5be90f002de5374ba4d4b9f49255396a9ab Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M av.c M embed.fnc M embed.h M inline.h M proto.h Log Message: ----------- Add av_remove_offset() core-only function This function abstracts away removing any AvARRAY(av) - AvALLOC(av) offset from an array (previously added by av_shift()). Also use Zero() rather than a loop to NULL out any elements in the offset area. Commit: 92e7e708ca6fdb4a488fa041a613890957b0b3d2 https://github.com/Perl/perl5/commit/92e7e708ca6fdb4a488fa041a613890957b0b3d2 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M embed.fnc M embed.h M op.c M perl.c M pp_ctl.c M proto.h Log Message: ----------- create_eval_scope(): parameterise the stack pos Rather than always using PL_stack_sp to pass to cx_pushblock(), allow the caller of create_eval_scope() to specify what stack position is to be saved. This will be used shortly to fix a bug. Commit: 9edf4303dcd36bf21556b533c5cebd6340798ad9 https://github.com/Perl/perl5/commit/9edf4303dcd36bf21556b533c5cebd6340798ad9 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M perl.c Log Message: ----------- Perl_call_sv(G_EVAL): set oldsp correctly call_sv(cv, G_EVAL) pushes a CXt_EVAL context, fakes up an entersub op, then runs it, letting entersub consume the arguments pushed onto the current stack frame by call_sv()'s caller. So the C-level PUSHMARK(): PUSHs(arg1); ... PUSHs(argN); call_sv(cv, G_EVAL); is about equivalent to the perl-level: eval { cv($arg1,..$argN) } Except that in the latter, when the CXt_EVAL is pushed, it is done *before* any of the arguments have been pushed, so the eval context's blk_oldsp points to just before the arguments. Conversely in the case of call_sv(), blk_oldsp gets set to just *after* the arguments. During an exception, the context stack gets unwound until the CXt_EVAL is reached, then PL_stack_sp is restored to the blk_oldsp value. The difference currently makes no real functional difference, as call_sv() resets PL_stack_sp immediately after an exception anyway, so the bad just-restored value is discarded. But it does mean that PL_stack_sp briefly points to junk on the stack. When the stack becomes reference-counted, this will start to become important. So fix now. This commit changes it so that call_sv()'s blk_oldsp gets set to just before the arguments too. It also asserts that the stack was cleared back to blk_oldsp. Commit: 0b6fa12c381d749a079b2e3f262cdbf2cac7d19d https://github.com/Perl/perl5/commit/0b6fa12c381d749a079b2e3f262cdbf2cac7d19d Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M inline.h Log Message: ----------- assert that cxstack[i].oldsp are increasing The saved stack positions cxstack[0].oldsp cxstack[1].oldsp cxstack[2].oldsp ... effectively divide the argument stack into a series of stack frames. This unravels if an earlier oldsp is actually greater than a later one. It didn't really matter before, but for a reference-counted stack it becomes a mess when trying to unwind the stack after an exception. So assert that oldsp never decreases. This assert found one failure in core, which was fixed by the previous commit. Commit: a1d8310f6b6bd45ed7f0fcf9ca907433feb25def https://github.com/Perl/perl5/commit/a1d8310f6b6bd45ed7f0fcf9ca907433feb25def Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M autodoc.pl M embed.fnc M embed.h M inline.h M proto.h Log Message: ----------- add rpp_foo() refcounted-stack manipulation fns The various new inline functions like rpp_push_1() are intended to be (approximate) replacements for the traditional PUSHs(), POPs() etc macros, except that when compiled under PERL_RC_STACK, they understand a reference-counted stack. Except currently they assume the stack is still not reference-counted in the presence of PERL_XXX_TMP_NORC. This will be turned off in a few commits' time. Commit: 4f5352243c0eebb85c224a568b1057383551d683 https://github.com/Perl/perl5/commit/4f5352243c0eebb85c224a568b1057383551d683 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- use new rpp_is_lone() function This inline function checks for whether an SV is only referenced from the stack or temps stack. (Well, it only checks TEMPs currently, but will shortly handle a ref-counted stack too). In particular it tests for: SvTEMP(sv) && && SvREFCNT(sv) == 1 This commit uses it in various places to replace where the conditions are currently written out in full. This will allow those places to still work correctly when the stack becomes reference-counted. Commit: 9902f51455d87137e6b229fda657384e0fe71ec2 https://github.com/Perl/perl5/commit/9902f51455d87137e6b229fda657384e0fe71ec2 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M doop.c M embed.fnc M pp.c M pp.h M pp_ctl.c M pp_hot.c M pp_pack.c M pp_sys.c M proto.h Log Message: ----------- wrap normal non-RC-stack-aware pp functions In the presence of PERL_RC_STACK, wrap most pp functions with a function that calls the real pp function with a (non-reference-counted) copy of the stack arguments. On return, the wrapper bumps up the reference count of the returned list and, as appropriate, shifts them down the stack. This allows a pp function which is not aware of a reference-counted stack to be called in a reference-counted stack environment. About 250 such functions are wrappable; the remaining 50 or so need individual handling and will be dealt with in the following few commits. This is a temporary band-aid which slows down calls to pp() functions. It is expected that over time these functions will be unwrapped and updated to to understand a reference-counted stack. But by temporarily wrapping them now, it allows perl to be (experimentally) shifted over to a reference-counted stack without having to review and modify all 30K lines of pp code first. (Except currently, the wrapper assumes the stack is still not reference-counted in the presence of PERL_XXX_TMP_NORC. This will be turned off in a few commits' time.) Note also that pp_wrap() is not yet complete. It simulates wrapping by making a copy of the args on entry to the wrapped function and shifting any returned values back down. But as well as being temporarily inhibited from actually modifying reference counts by PERL_XXX_TMP_NORC, there are extra considerations which will be taken account of by the "Allow stacks to be reference-counted" commit coming later. Commit: cb9e0c39fe9a781591c127e2635cbd96c5838347 https://github.com/Perl/perl5/commit/cb9e0c39fe9a781591c127e2635cbd96c5838347 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- pp_method*: fixup wrapping The various method ops are sometimes naughty and substitute a different object at the base of the current stack frame. This is "below" the area of the stack normally processed by pp_wrap(), so the reference count adjusting must be done manually. Commit: 60faf44b84c95b04b4109310335845b57b9ac67f https://github.com/Perl/perl5/commit/60faf44b84c95b04b4109310335845b57b9ac67f Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: regcomp Update pp_regcomp() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 936a2e4ba45fd4477586b0a567ab87794d71fd2c https://github.com/Perl/perl5/commit/936a2e4ba45fd4477586b0a567ab87794d71fd2c Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M embed.fnc M pp_hot.c M proto.h Log Message: ----------- make RC-stack-aware: entersub Update pp_entersub() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. As well as the expected changes to pp_entersub(), this commit also adds a function, xs_wrap(), which is similar in concept to pp_wrap(), but which makes a non-reference-counted copy of the arguments on the stack before calling any XS function which isn't RC-stack-aware yet (which is currently all of them). xs_wrap() will soon be used by pp_goto() too. In the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Note also that xs_wrap() is not yet complete. It simulates wrapping by making a copy of the args on entry to the wrapped function and shifting any returned values back down. But as well as being temporarily inhibited from actually modifying reference counts by PERL_XXX_TMP_NORC, there are extra considerations which will be taken account of by the "Allow stacks to be reference-counted" commit coming later. Commit: 9fb9468c3e63aafaf77627b49a12e172306c6739 https://github.com/Perl/perl5/commit/9fb9468c3e63aafaf77627b49a12e172306c6739 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c M pp_hot.c Log Message: ----------- make RC-stack-aware: db/nextstate, unstack Update pp_dbstate(), pp_nextstate() and pp_unstack() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 5c396de1181c6d7a441a3b3fb1f2ab3ffa69f713 https://github.com/Perl/perl5/commit/5c396de1181c6d7a441a3b3fb1f2ab3ffa69f713 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c M pp_hot.c M t/op/grep.t Log Message: ----------- make RC-stack-aware: map and grep Update pp_grepstart(), pp_grepwhile() and pp_mapwhile() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Also add some tests to op/grep.t to check for stuff being freed at an appropriate time (they weren't being at one iteration of this commit). Commit: 38a203be53208aeebbf605854d6da760efd0ddbb https://github.com/Perl/perl5/commit/38a203be53208aeebbf605854d6da760efd0ddbb Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: enteriter, leaveloop Update pp_enteriter() and pp_leveloop() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 6ed4edefc6a387e22aa81e773cfb1c7d787569ce https://github.com/Perl/perl5/commit/6ed4edefc6a387e22aa81e773cfb1c7d787569ce Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c M pp_hot.c Log Message: ----------- make RC-stack-aware: pp_leavefoo() Update some pp_leavefoo() functions to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 2c9e97c4fc986ab098d4d40d27103e4024c4e156 https://github.com/Perl/perl5/commit/2c9e97c4fc986ab098d4d40d27103e4024c4e156 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: last Update pp_last() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 6eb62102bfbaf3069bf709d26898c779ce31b85a https://github.com/Perl/perl5/commit/6eb62102bfbaf3069bf709d26898c779ce31b85a Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: goto Update pp_goto() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 244901b7686c04f789009e16902c5a9e6f1f71a3 https://github.com/Perl/perl5/commit/244901b7686c04f789009e16902c5a9e6f1f71a3 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: require,eval Update pp_entereval() et al to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: d4faa1722292cd32c37c8eb4a7f734749a52aff7 https://github.com/Perl/perl5/commit/d4faa1722292cd32c37c8eb4a7f734749a52aff7 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: enter/leavegiven etc Update pp_entrgiven() et al to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 8a15e18e8c9761c06c01d078f1aff17a0cc295d1 https://github.com/Perl/perl5/commit/8a15e18e8c9761c06c01d078f1aff17a0cc295d1 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sys.c Log Message: ----------- make RC-stack-aware: enter/leavewrite Update pp_enterwrite() and pp_leavewrite() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 2149967c1086caadc49ef8e087f4a4b878d95379 https://github.com/Perl/perl5/commit/2149967c1086caadc49ef8e087f4a4b878d95379 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sort.c M t/op/sort.t Log Message: ----------- make RC-stack-aware: pp_sort() Update pp_sort() to handle a reference-counted stack environment in the presence of PERL_RC_STACK. (But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time.) In addition to replacing all the POPs type stuff with rpp_foo() inline function calls, three slight functional changes were done to make this work. 1) The stack entry pointing to the SV containing the sort function name is now NULLed out rather than being left on the stack, just after being freed. It is usually overwritten later on in the process. 2) For an in-place sort (@a = sort @a), the AV is now left on the stack so that it isn't prematurely freed. This is okay, because... 3) Also for an in-place sort, after the results are stored in @a, the stack frame is cleared. This is safe because the optimisation is only ever done in void context. Previously the stack would be be cleared by the following nextstate op or similar anyway. Commit: f6dc01d7640f89d839e022d538ea21da8b819b46 https://github.com/Perl/perl5/commit/f6dc01d7640f89d839e022d538ea21da8b819b46 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_sort.c Log Message: ----------- make RC-stack-aware: sort cmp function invokers Update S_sortcv() etc to handle a reference-counted stack environment in the presence of PERL_RC_STACK. These three static functions are used by pp_sort() to invoke a suitable comparison subroutine. (But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time.) Commit: 7a0808bcc6232f55cf38d7926d7296e7746dd9e7 https://github.com/Perl/perl5/commit/7a0808bcc6232f55cf38d7926d7296e7746dd9e7 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M doio.c M pp_sys.c Log Message: ----------- make RC-stack-aware: stat and filetest ops Update the pp functions which do stat and filetest operations to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 4b23ad1cdd2938810ef82fb3e2bf427b3db79b5b https://github.com/Perl/perl5/commit/4b23ad1cdd2938810ef82fb3e2bf427b3db79b5b Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M inline.h M pp.c Log Message: ----------- make RC-stack-aware: misc pp() functions Update the remaining miscellaneous pp() functions to handle a reference-counted stack environment in the presence of PERL_RC_STACK. But in the presence of PERL_XXX_TMP_NORC, don't actually manipulate reference counts yet. This will be turned off in a few commits' time. Commit: 0d26ccdde9a8382a3288c21a46dcaeeae2f16140 https://github.com/Perl/perl5/commit/0d26ccdde9a8382a3288c21a46dcaeeae2f16140 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M perl.c Log Message: ----------- make RC-stack-aware: call_sv() and similar Update the functions which directly or indirectly call a CV, to handle a reference-counted stack environment. Note that call_sv(), eval_pv() etc are slightly unusual in that they can be called from either a reference-counted or non-RC stack environment, so must be able to handle either case. This is done mostly by relying on CALLRUNOPS() to fix things up, but for anything pushed/pulled around that, by checking rpp_stack_is_rc(): which currently always returns false, but once ref-counting is enabled in a few commits' time, may start returning true. Commit: 88fabd6dfc8f17ea1408861cb235488a9d441af9 https://github.com/Perl/perl5/commit/88fabd6dfc8f17ea1408861cb235488a9d441af9 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M perl.c Log Message: ----------- make RC-stack-aware: eval_sv() Similar to the previous commit which fixed up call_sv() and similar, the commit updates eval_sv() to handle a reference-counted stack environment. Note that these functions are slightly unusual in that they can be called from either a reference-counted or non-RC stack environment, so must be able to handle either case. This is done mostly by relying on CALLRUNOPS() to fix things up, but for anything pushed/pulled around that, by checking rpp_stack_is_rc(): which currently always returns false, but once ref-counting is enabled in a few commits' time, may start returning true. Commit: 5c96b746b707231c00118634e16a16b827f75a4c https://github.com/Perl/perl5/commit/5c96b746b707231c00118634e16a16b827f75a4c Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- make RC-stack-aware: defer The defer keyword saves the address of an optree, which is then run during leave_scope(). Since that can happen in unpredictable places (e.g. during a croak), we won't know until runtime where the stack is currently reference-counted. So handle both cases. Commit: 91fc45831fe71aa551922098cd6232b7e48dc2d6 https://github.com/Perl/perl5/commit/91fc45831fe71aa551922098cd6232b7e48dc2d6 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- make RC-stack-aware: unwrap pp_add() Remove the temporary wrapper from pp_add() and update it to directly work in a refcounted-stack environment. This is mainly a proof of concept to check that all the new rpp_foo() inline functions and macros are suitable for working with a typical binary operator. Commit: 0e244d7fac4335d394fa256ac24c887a89e5e187 https://github.com/Perl/perl5/commit/0e244d7fac4335d394fa256ac24c887a89e5e187 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp.c Log Message: ----------- make RC-stack-aware: unwrap pp_not() Remove the temporary wrapper from pp_not() and update it to directly work in a refcounted-stack environment. This is mainly a proof of concept to check that rpp_tryAMAGICun_MG() and its underlying Perl_try_amagic_un() work ok. Commit: d526077d257502f288f31ec5faf1a2931410787e https://github.com/Perl/perl5/commit/d526077d257502f288f31ec5faf1a2931410787e Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M op.c Log Message: ----------- make RC-stack-aware: S_fold_constants() The folded SV it pops off the stack should be treated as reference counted. Commit: ffd948cbb946152bfd5feb08e9493757e1845cce https://github.com/Perl/perl5/commit/ffd948cbb946152bfd5feb08e9493757e1845cce Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/Devel-Peek/Peek.pm M ext/Devel-Peek/Peek.xs Log Message: ----------- make RC-stack-aware: Devel::Peek::Dump() This function is implemented as a custom op rather than as a function call, so it wasn't getting wrapped for reference-count purposes by either pp_wrap() nor xs_wrap(). This commit makes it directly handle a reference-counted stack. This was a particularly confusing one, as a failing test in t/op/eval.t was reduced to use Devel::Peek; Dump($@); eval { die "boo\n"; }; Dump($@); which showed the ref count of $@ increasing after the eval {}. But it was actually Dump(), not eval{} which was messing with the ref count. Commit: 80dc6c91024b2dce25ee887c62e268a75c7bc691 https://github.com/Perl/perl5/commit/80dc6c91024b2dce25ee887c62e268a75c7bc691 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M sv.c Log Message: ----------- make RC-stack-aware: perl_clone() It has some code that calls out to PACKAGE::CLONE(). Depending on how the interpreter is being cloned, the code which assembles the args on the stack for the CLONE() call may be operating on either a reference-counted stack, or a non-RC one. So handle both cases Commit: d16cdb48c255dc6c47e0756eb7a01c7ee5aff1c7 https://github.com/Perl/perl5/commit/d16cdb48c255dc6c47e0756eb7a01c7ee5aff1c7 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M gv.c Log Message: ----------- make RC-stack-aware: Perl_try_amagic_un() & _bin() Note that these two functions may be called both from PP functions aware of a reference-counted stack and from wrapped (non-aware) functions, hence the RC manipulation is runtime conditional. Commit: 400477768f6f8710a02a8ad6092e890c539c0a4b https://github.com/Perl/perl5/commit/400477768f6f8710a02a8ad6092e890c539c0a4b Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M dist/threads/lib/threads.pm M dist/threads/threads.xs Log Message: ----------- make RC-stack-aware: threads.xs S_ithread_run() starts running a new top-level perl interpreter, which will have a ref-counted stack. So treat the stack a ref-counted. Commit: f359370678cf29d5c4d1cf5b12913552dc8b2f5d https://github.com/Perl/perl5/commit/f359370678cf29d5c4d1cf5b12913552dc8b2f5d Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M t/cmd/for.t Log Message: ----------- make RC-stack-aware: t/cmd/for.t A test that expects to fail on a non reference-counted stack should no longer do so if the stack is fully reference-counted Commit: 9d6365c4683ab8fda76e9562704801b6d611f7f8 https://github.com/Perl/perl5/commit/9d6365c4683ab8fda76e9562704801b6d611f7f8 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M op.c Log Message: ----------- make RC-stack-aware: invoking DB::postponed() Various places in core call DB::postponed(). This all happens in places where the stack will be reference-counted, so fix the callers. Commit: fda72a9b600312fb8c5486bb8079f6954b1dd2c5 https://github.com/Perl/perl5/commit/fda72a9b600312fb8c5486bb8079f6954b1dd2c5 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/XS-APItest/APItest.xs M ext/XS-APItest/t/magic.t Log Message: ----------- make RC-stack-aware: ext/XS-APItest/ APItest.xs mainly consists of XS functions - which are not aware of a ref counted stack - but such functions are called via xs_wrap(), so that's ok. However, THX_pp_establish_cleanup() is actually a PP function attached to an op, rather than an XS function - so it doesn't get automatically wrapped. Update it to handle a reference-counted stack. Also, use the standard CALLRUNOPS() macro to call a runos loop rather than invoking directly; the former will allow a wrapper to be inserted. Finally, parameterise the expected ref count in t/magic.t, as it will change if the stack is ref counted. Commit: 6b978db646b3947ae7afcff8ff551b2fe8d24cb1 https://github.com/Perl/perl5/commit/6b978db646b3947ae7afcff8ff551b2fe8d24cb1 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M av.c M inline.h M pp_hot.c Log Message: ----------- make shift(@a) leave old pointer Generally shifting is done by adjusting the start position of the array, so that AvALLOC() and AvARRAY() no longer align. Previously if the array was AvREAL(), perl NULL-ed out the old pointer at the same time, i.e. doing the equivalent of AvARRAY(av)[-1] = NULL. This commit changes it so that on PERL_RC_STACK builds, perl instead keeps the old pointer there on AvREAL() arrays too, even if it now points to a freed SV; and instead makes av_clear() and av_unshift() responsible for NULL-ing out the slot only when actually reclaiming any unused slots between AvALLOC() and AvARRAY(). The reason for this is because of the mechanism whereby @DB::args is sometimes populated by caller(), as used by Carp.pm to display function arguments in stack traces etc. For the common idiom of sub f { my $self = shift; ....; } then previously, since @_ wasn't AvREAL(), the old pointer in @_ to argument 0 was kept around and thus the hidden pointer value was still available for caller() to add to @DB::args. But since the next commit will change @_ to be AvREAL(), this will no longer work. Thus to keep the ability to debug stack traces etc (via the awful @DB::args hack), we make shift keep the pointer even for the AvREAL() case. Commit: 0857381327c3ca5c777edcc28ea3f12bd96dff1d https://github.com/Perl/perl5/commit/0857381327c3ca5c777edcc28ea3f12bd96dff1d Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M cop.h M embed.fnc M embed.h M inline.h M pad.c M pp_ctl.c M pp_hot.c M pp_sort.c M proto.h M t/op/sub.t Log Message: ----------- make @_ AvREAL() on RC-stack Traditionally, the @_ AV has been marked as AvREAL_off(), but AvREIFY_on(). This commit changes it so that on PERL_RC_STACK builds, @_ is AvREAL(). This will mean that when the stack is ref-counted, the stack frame can be directly moved to @_ while maintaining the correct ref count for each argument (in the same way that !AvREAL() worked well with a non-ref-counted stack). Note that the stack will not actually be reference-counted for a few more commits yet. In the meantime, this commit allows for that by bumping up the reference count of SVs being transferred from the stack to @_. This extra step will soon be skipped. Commit: c6c8d419bbd4b0c979b944a0810b2d4d3358c1c4 https://github.com/Perl/perl5/commit/c6c8d419bbd4b0c979b944a0810b2d4d3358c1c4 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M cop.h M embed.fnc M embed.h M inline.h M pp.h M pp_sort.c M proto.h Log Message: ----------- add switch_argstack(), push/pop_stackinfo() fns These new inline functions are supposed to be near-identical replacements for these macros: PUSHSTACKi(type) push_stackinfo(type) POPSTACK() pop_stackinfo() SWITCHSTACK(from,to) switch_argstack(to) // assumes (from == PL_curstack) except that they don't require dSP to be in scope (they operate on PL_stack_sp rather than sp) and their names more clearly specify what sort of stack they manipulate. The macros are now thin wrappers around the functions. I've kept most of their uses in core for now as they are still used in places with dSP present. Commit: b2245e8490653c45989951b76da07d8d52868b6c https://github.com/Perl/perl5/commit/b2245e8490653c45989951b76da07d8d52868b6c Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M cop.h M embed.fnc M embed.h M inline.h M perl.c M pp_sort.c M proto.h M scope.c Log Message: ----------- allow argument stack to be AvREAL() Add a _flags() variant of new_stackinfo() which indicates whether the new stack AV should be created real or not. Modify the new push_stackinfo() function to have a similar flag. Then make the backcompat macros like PUSHSTACKi() still push a non-real stack, while functions which have been updated to use the new push_stackinfo() etc will be able get a real AV. The next commit makes use of that. This means that existing code (core and XS) which hasn't been updated to the new ref-counted stack regime can do stuff like: PUSHSTACKi(FOO); PUSHMARK(sp) XPUSHs(sv); call_sv(); where call_sv() (or rather, the runops loop it invokes) will be able to determine that it's been called from a non-RC environment and that the args on the stack aren't reference-counted. The next commit will update the runops loops etc to do exactly that. Commit: 3bf22e3deab76f4a934ae1f52ce0cae2deee6d4e https://github.com/Perl/perl5/commit/3bf22e3deab76f4a934ae1f52ce0cae2deee6d4e Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M cop.h M embed.fnc M embed.h M inline.h M perl.c M perl.h M pp_ctl.c M pp_hot.c M pp_pack.c M pp_sort.c M proto.h M run.c M scope.c M sv.c Log Message: ----------- Allow argument stacks to be reference-counted When built with PERL_RC_STACK, this substantial commit: * makes stacks AvREAL() by default. * adds the si_stack_nonrc_base field to the stackinfo structure. * adds the runops_wrap() wrapper It also adds rpp_obliterate_stack_to() for clearing the stack on exceptions Collectively, this allows each stack to be in one of three states: 1) AvREAL(PL_curstack) && PL_curstackinfo->si_stack_nonrc_base == 0 (the new default) all the SVs pointed to from the stack are reference-counted. 2) AvREAL(PL_curstack) && PL_curstackinfo->si_stack_nonrc_base > 0 items on the stack are reference-counted only below si_stack_nonrc_base. 3) !AvREAL(PL_curstack) (existing behaviour) no items on the stack are reference-counted. The way it generally works is that runops loops assume that all the PP functions they call out to are reference-count-aware. Where this isn't yet the case, the recently-added pp_wrap() and xs_wrap() functions assume a reference-counted stack, but use the si_stack_nonrc_base mechanism to call out to PP or XS functions which aren't aware of a reference-counted stack. Conversely, the runops_wrap() function added by this commit wraps calls to runops loops, since such loops work only with an RC stack. So if called with a non-RC or partially-RC stack, the wrapper temporarily fixes up the stack to be fully-RC, calls the real runops loop, then on return reverts the stack back to it's non-RC ways, mortalising any return values if necessary. This downgrading and upgrading by pp_wrap()/xs_wrap() and runops_wrap() allows handling of multiple nesting of when, for example, perl calls pp_entersub(), which calls XS code, which calls call_sv(), which calls a runops loop, which calls pp_entersub(), which calls XS code, and so on. For si_stack_nonrc_base, this index value marks the lowest position on the argument stack which is not reference-counted. The special (and normal) value of 0 indicates that *all* items on the stack are reference-counted. The new function rpp_obliterate_stack_to() is a bit like rpp_popfree_to(), except that it can handle stacks in all three of the states listed above. It's intended to be used when dying, throwing exceptions or exiting, since the stack could be in any state when that happens. Note that as of this commit, PERL_XXX_TMP_NORC is still defined, which means that even in the presence of AvREAL(PL_curstack) etc, the stack isn't yet actually reference counted. So with this commit, perl goes through all the motions, (calling wrappers like runops_wrap() etc), but skips actually manipulating any reference counts. There will be a few more commits, fixing up a few more things, before PERL_XXX_TMP_NORC will be removed. Commit: aa9d75b5ccf1906dd66010ab5456f62bc4a5754d https://github.com/Perl/perl5/commit/aa9d75b5ccf1906dd66010ab5456f62bc4a5754d Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_ctl.c Log Message: ----------- add stack extend to Perl_die_unwind() When invoked via a scalar-context eval, die_unwind() was pushing &PL_sv_undef without extending the stack first. It's been this way for many years. Spotted by visual inspection while adding rpp_() code. I could get a SEGV with the following code, but I haven't added it as a test as it's highly sensitive to exactly what size stack is initially allocated and the OS's malloc(). my $x; my @a = ($x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, $x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x,$x, scalar eval { die }, ); Commit: 53fd4ffa99d94d25e1a3fac93aa145c74ad8620b https://github.com/Perl/perl5/commit/53fd4ffa99d94d25e1a3fac93aa145c74ad8620b Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M toke.c Log Message: ----------- make RC-stack-aware: Perl_filter_read() This function in toke.c calls out to a random C-level filter function for each source input chunk. Because that function may in turn invoke a Perl function via call_sv() - and may itself push stuff onto or off the stack for that call - present that function with a non-reference-counted stack environment for backwards compatibility. Commit: 52aa5c53dfa902cd1a37ad51ae8a0697ff328dfe https://github.com/Perl/perl5/commit/52aa5c53dfa902cd1a37ad51ae8a0697ff328dfe Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M inline.h Log Message: ----------- rpp_is_lone(): allow non-temp SV too This function indicates whether an SV on the stack is kept alive only by a single ref from the temps stack - which is often the case with stuff pushed onto the stack by PP functions. Often this means that the SV can be passed through rather then copied in places like returning from a subroutine. With a ref-counted stack, it's possible for a *non* SvTEMP SV to also be stealable, if it has a refcount of 1, since that SV is being kept alive purely by its (now refcounted) link from the stack. So this commit adds that condition too (and also simplifies the condition for efficiency). In summary: originally perl (and then this function) did: if (SvTEMP(sv) && SvREFCNT(sv) == 1) { ... steal it ... } Now this function's condition is the equivalent of #ifdef PERL_RC_STACK ( (SvREFCNT(sv) == 1) || (SvTEMP(sv) && SvREFCNT(sv) == 2)) #else (SvTEMP(sv) && SvREFCNT(sv) == 1) #endif Commit: 07ba9a4ff23b0e2ff21afcb4b4f69e1d1a2a1e8f https://github.com/Perl/perl5/commit/07ba9a4ff23b0e2ff21afcb4b4f69e1d1a2a1e8f Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M deb.c M embed.fnc M embed.h M proto.h Log Message: ----------- Perl_debstack(): indicate stack refcount status When displaying the stack with perl -Ds or -Dsv, put a vertical bar (|) at the boundary between the reference-counted part of the stack and the non-reference-counted part, if any. In addition with -Dsv, for each stack show its status; (real) all items on the stack are reference-counted (partial real) items below si->si_stack_nonrc_base are RCed blank no items are RCed This commit switches to invoking S_deb_stack_n() directly, rather than via the deb_stack_n() macro, as some compilers can't cope with the 'ifdef' amongst the calling args. Commit: 9865d2e3aedbf48e32bc8ce9c4a889ec8288829d https://github.com/Perl/perl5/commit/9865d2e3aedbf48e32bc8ce9c4a889ec8288829d Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M perl.h Log Message: ----------- disable PERL_XXX_TMP_NORC This macro was just a temporary crutch that disabled actually adjusting the reference count of things being pushed and popped off the stack, even on PERL_RC_STACK builds. It allowed the core to be converted to support a reference-counted stack as a bunch of incremental changes. This commit turns it off, enabling the stack to become actually reference-counted on PERL_RC_STACK builds. In a few commits' time, this macro will be completely eliminated from the source code. Commit: eff10516aefdefff6f7b7781b3643b18077e2ccb https://github.com/Perl/perl5/commit/eff10516aefdefff6f7b7781b3643b18077e2ccb Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M inline.h M pp.h Log Message: ----------- stack push/pops: assert rpp_stack_is_rc() state On perls built with both -DPERL_RC_STACK and -DDEBUG_LEAKING_SCALARS, add asserts to the various old-style PUSHs() etc macros and new-style rpp_push_1() etc functions that they're operating on the right sort of stack. In particular: PUSHs() and POPs() should only be used on stacks where rpp_stack_is_rc() is false, since they don't modify the reference count of the SVs they are pushing or popping. Conversely, rpp_push_1(), rpp_popfree_1() etc should only be used on stacks where rpp_stack_is_rc() is true, since they modify the reference counts of the SVs they push and pop. On perls not compiled with PERL_RC_STACK, the rpp_ functions don't modify the reference counts, but on such builds the rpp_stack_is_rc() assertions in the rpp_ functions are disabled, so it all works out still. Commit: 0e538aa2c67ea0cfe8b21ac2c7e9cb97525c1134 https://github.com/Perl/perl5/commit/0e538aa2c67ea0cfe8b21ac2c7e9cb97525c1134 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M dump.c Log Message: ----------- runops_debug(): add RC-stack assertions on PERL_RC_STACK builds, 1) assert that the stack is reference-counted (rpp_stack_is_rc()). 2) assert the any split point (si_stack_nonrc_base) isn't above the top of the stack. Commit: cdccbca1a9c595693ac6e7b2e6b3cd3fa9259868 https://github.com/Perl/perl5/commit/cdccbca1a9c595693ac6e7b2e6b3cd3fa9259868 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- pp_wrap(), xs_wrap(): extract some common code and put it in a static function, S_pp_xs_wrap_return(). Commit: b26202220906f73c57e4c1f8143dbf9c008710c2 https://github.com/Perl/perl5/commit/b26202220906f73c57e4c1f8143dbf9c008710c2 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pp_hot.c Log Message: ----------- tweak pp_wrap() and xs_wrap() After bumping up the reference counts of the returned values, reset si_stack_nonrc_base earlier, so that if perl dies while decrementing the original args, all reference counts will be properly accounted for. Also in xs_wrap(), only bother doing PL_markstack_ptr[0] += nargs; in the branch where nargs > 0. Commit: e4093fa0cbf9d357691944a425b8ca4539357dec https://github.com/Perl/perl5/commit/e4093fa0cbf9d357691944a425b8ca4539357dec Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M MANIFEST M ext/XS-APItest/APItest.xs A ext/XS-APItest/t/xsppwrap.t Log Message: ----------- add tests for XSPP_wrapped() macro This new macro allows an old-style non-reference-counted PP-style function to be used on a PERL_RC_STACK builds. It's intended for non-core PP functions which are typically in an XS file and are used to replace the PP function of an existing op, or to be attached to a custom op. It's virtually identical to the PP_wrapped() macro, except that it uses the name as-is rather than prepending Perl_ to the name Commit: 9a79bc2b08a9fdfa8a02a1c315740d919b75968c https://github.com/Perl/perl5/commit/9a79bc2b08a9fdfa8a02a1c315740d919b75968c Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M ext/XS-APItest/APItest.xs Log Message: ----------- XS::APItest::clone_with_stack(); check SI RC state In this test function, push a couple of stackinfos, one with a ref-counted stack, and one without. After cloning, pop the cloned stackinfos and assert that the cloned argument stacks are also appropriately RC or non-RC. This should probably have been done properly as some new tests rather than a couple of asserts, but that would have involved a lot more effort. Commit: 31dfe8593185f051aa6f0938635f296c77440d91 https://github.com/Perl/perl5/commit/31dfe8593185f051aa6f0938635f296c77440d91 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M dist/threads/threads.xs M ext/XS-APItest/t/magic.t M inline.h M op.c M perl.c M perl.h M pp_ctl.c M pp_hot.c M pp_pack.c M pp_sort.c M run.c M t/cmd/for.t M universal.c Log Message: ----------- Eliminate PERL_XXX_TMP_NORC This macro was disabled a few commits ago. Now remove all use of it from the core. It was just a temporary crutch that disabled actually adjusting the reference count of things being pushed and popped off the stack, even on PERL_RC_STACK builds. It allowed the core to be converted to support a reference-counted stack as a bunch of incremental changes. Commit: 8f5afbaad9e15cf8c2e780b3c5fd77a3aeb09e86 https://github.com/Perl/perl5/commit/8f5afbaad9e15cf8c2e780b3c5fd77a3aeb09e86 Author: David Mitchell <da...@iabyn.com> Date: 2023-02-26 (Sun, 26 Feb 2023) Changed paths: M pod/perlguts.pod Log Message: ----------- add perlguts section on a reference-counted stack Explain what all the new rpp_foo() functions are for. Compare: https://github.com/Perl/perl5/compare/1c225879cac6%5E...8f5afbaad9e1