Branch: refs/heads/smoke-me/davem/rc_stack1
  Home:   https://github.com/Perl/perl5
  Commit: 89eb40296a2475bbfb66968ac3cb3834601f5de5
      
https://github.com/Perl/perl5/commit/89eb40296a2475bbfb66968ac3cb3834601f5de5
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 50c65e79e7e94c151e4b610caf2804c8723f7196
      
https://github.com/Perl/perl5/commit/50c65e79e7e94c151e4b610caf2804c8723f7196
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: b6b70047de128d8307bfd72135bf7364c16d0981
      
https://github.com/Perl/perl5/commit/b6b70047de128d8307bfd72135bf7364c16d0981
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: be8e4bfa419e83230c96e4c1b042229bd6ba0113
      
https://github.com/Perl/perl5/commit/be8e4bfa419e83230c96e4c1b042229bd6ba0113
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 6f77ff8c55088880cb82db7ec91c9693296e713b
      
https://github.com/Perl/perl5/commit/6f77ff8c55088880cb82db7ec91c9693296e713b
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 4a1c2c766c4feb55e69078827f2a76a513361506
      
https://github.com/Perl/perl5/commit/4a1c2c766c4feb55e69078827f2a76a513361506
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: a5878be771ea0beb0e9a4059dd7cf65869efd593
      
https://github.com/Perl/perl5/commit/a5878be771ea0beb0e9a4059dd7cf65869efd593
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 Feb 2023)

  Changed paths:
    M pp_ctl.c
    M pp_hot.c

  Log Message:
  -----------
  add code comments concerning grep and map markstack usage


  Commit: 77b3be41b12289cc771024fa87d0e23478912847
      
https://github.com/Perl/perl5/commit/77b3be41b12289cc771024fa87d0e23478912847
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 351b2718a315b75597f0bd727ced52a4e3461492
      
https://github.com/Perl/perl5/commit/351b2718a315b75597f0bd727ced52a4e3461492
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 Feb 2023)

  Changed paths:
    M pp_sort.c

  Log Message:
  -----------
  pp_sort(): add comments what the op flags mean


  Commit: 0255fae4d0a1b19d617f804b57b5b87feb0831f2
      
https://github.com/Perl/perl5/commit/0255fae4d0a1b19d617f804b57b5b87feb0831f2
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 6ac33a5ad1b262cd85d7e89ac1d8e2051ad97a09
      
https://github.com/Perl/perl5/commit/6ac33a5ad1b262cd85d7e89ac1d8e2051ad97a09
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: a7f736d7697a849cb809ed75ef21de2bcdbe1bde
      
https://github.com/Perl/perl5/commit/a7f736d7697a849cb809ed75ef21de2bcdbe1bde
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: a6e4e87be5426944f663e86f493726512a665752
      
https://github.com/Perl/perl5/commit/a6e4e87be5426944f663e86f493726512a665752
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 89f48240ed58190cbd514255bd0ab6414c9a4eb1
      
https://github.com/Perl/perl5/commit/89f48240ed58190cbd514255bd0ab6414c9a4eb1
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 Feb 2023)

  Changed paths:
    M ext/XS-APItest/APItest.pm
    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: 0d24fe8abff3f39c38e90826792b6fe51ec83df2
      
https://github.com/Perl/perl5/commit/0d24fe8abff3f39c38e90826792b6fe51ec83df2
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 3f74bb70200b5c425293aa2182c6978febada63a
      
https://github.com/Perl/perl5/commit/3f74bb70200b5c425293aa2182c6978febada63a
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 00132487ce0e1a959218baa2991e0f2b7b923427
      
https://github.com/Perl/perl5/commit/00132487ce0e1a959218baa2991e0f2b7b923427
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: b1725b4384cabef1a745e27b90c17630e1b6dcd0
      
https://github.com/Perl/perl5/commit/b1725b4384cabef1a745e27b90c17630e1b6dcd0
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: ead6ab6ae3a16938e5b8b9c14d7fa0c09f5b3285
      
https://github.com/Perl/perl5/commit/ead6ab6ae3a16938e5b8b9c14d7fa0c09f5b3285
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 8cfd996d6c91e3e901a1783386a7b150b3cab35d
      
https://github.com/Perl/perl5/commit/8cfd996d6c91e3e901a1783386a7b150b3cab35d
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 79a61cfeeda5f381546fded74634872c22a394be
      
https://github.com/Perl/perl5/commit/79a61cfeeda5f381546fded74634872c22a394be
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 6cfeac78c367d008951f7e169d5bfadc478b54e7
      
https://github.com/Perl/perl5/commit/6cfeac78c367d008951f7e169d5bfadc478b54e7
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 16d5429d7c8774c7002010ca28404a4cd2b555e7
      
https://github.com/Perl/perl5/commit/16d5429d7c8774c7002010ca28404a4cd2b555e7
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: e08e7ce7c715ba44f97950422d5ee06ac731b406
      
https://github.com/Perl/perl5/commit/e08e7ce7c715ba44f97950422d5ee06ac731b406
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 58ba0bdd20746db35e15a6642e5040edf7996ea1
      
https://github.com/Perl/perl5/commit/58ba0bdd20746db35e15a6642e5040edf7996ea1
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 8252c5f8bf94fd9a12ce5435fe5f8576c43a58e9
      
https://github.com/Perl/perl5/commit/8252c5f8bf94fd9a12ce5435fe5f8576c43a58e9
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 1af02157a57096e359a35f4176899a42aac0836b
      
https://github.com/Perl/perl5/commit/1af02157a57096e359a35f4176899a42aac0836b
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 1a7df541a29e0ff6035afc84d80ef71ce558056b
      
https://github.com/Perl/perl5/commit/1a7df541a29e0ff6035afc84d80ef71ce558056b
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 1350c3660e5ed4de8d10dffddec6254f1c2f7828
      
https://github.com/Perl/perl5/commit/1350c3660e5ed4de8d10dffddec6254f1c2f7828
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 3c3d93ac2c9f8db4b804b5979425d15128666649
      
https://github.com/Perl/perl5/commit/3c3d93ac2c9f8db4b804b5979425d15128666649
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 51e5fc8b0023c875613997e7403b8e66bc3e2e1a
      
https://github.com/Perl/perl5/commit/51e5fc8b0023c875613997e7403b8e66bc3e2e1a
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 3f46af92053fef64001cc6603464a3f95f291629
      
https://github.com/Perl/perl5/commit/3f46af92053fef64001cc6603464a3f95f291629
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: e4eeccb2f96aaee0769c02cabb1fda4b5abd26d4
      
https://github.com/Perl/perl5/commit/e4eeccb2f96aaee0769c02cabb1fda4b5abd26d4
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 6d580effb7c64a794b294fa35738c41745e2198b
      
https://github.com/Perl/perl5/commit/6d580effb7c64a794b294fa35738c41745e2198b
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 0be9a574bcaf15076202b52e7a5e95b244e2c8bf
      
https://github.com/Perl/perl5/commit/0be9a574bcaf15076202b52e7a5e95b244e2c8bf
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: c989996d99c8c4807a39c4fc5105242ac2ff2573
      
https://github.com/Perl/perl5/commit/c989996d99c8c4807a39c4fc5105242ac2ff2573
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 0f278e6ae85f3dee49802808314ea6c125df0772
      
https://github.com/Perl/perl5/commit/0f278e6ae85f3dee49802808314ea6c125df0772
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: a1967500320f7f67fe2ad7bfba6c7fbe11e63fcc
      
https://github.com/Perl/perl5/commit/a1967500320f7f67fe2ad7bfba6c7fbe11e63fcc
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: aebfe70940b558f8e00c0014d3d0bdf298564413
      
https://github.com/Perl/perl5/commit/aebfe70940b558f8e00c0014d3d0bdf298564413
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: d2180f6d14895438e61a6b1419a1c103486894d9
      
https://github.com/Perl/perl5/commit/d2180f6d14895438e61a6b1419a1c103486894d9
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 99b0dcf322a1316b2e27e4fcf7bff470a9d89122
      
https://github.com/Perl/perl5/commit/99b0dcf322a1316b2e27e4fcf7bff470a9d89122
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 381256d3c5215e8b0536b76eb6ab3e6d396b39a2
      
https://github.com/Perl/perl5/commit/381256d3c5215e8b0536b76eb6ab3e6d396b39a2
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 84abcf083bcdd09b3e170f5049139e2872c6165c
      
https://github.com/Perl/perl5/commit/84abcf083bcdd09b3e170f5049139e2872c6165c
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: b5fdf232ac621341c7f6af897e3dfadbf6fbeaf4
      
https://github.com/Perl/perl5/commit/b5fdf232ac621341c7f6af897e3dfadbf6fbeaf4
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 964080aa33d00f0f61a2c6ebb40ecfc8ebded5a5
      
https://github.com/Perl/perl5/commit/964080aa33d00f0f61a2c6ebb40ecfc8ebded5a5
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 5067f84ff25f3cdff86ec835c5196ada9a4f9b48
      
https://github.com/Perl/perl5/commit/5067f84ff25f3cdff86ec835c5196ada9a4f9b48
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 2726c2f7eeab97e40c7abf6e6333599d8666a3df
      
https://github.com/Perl/perl5/commit/2726c2f7eeab97e40c7abf6e6333599d8666a3df
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 15343814e344ed5c17237738f758fb8a74d5317f
      
https://github.com/Perl/perl5/commit/15343814e344ed5c17237738f758fb8a74d5317f
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 9eb4eca52ed86ffca8e43d20f7fcd5ec90441ce4
      
https://github.com/Perl/perl5/commit/9eb4eca52ed86ffca8e43d20f7fcd5ec90441ce4
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 5f490858667e1d2f5a3435fea6e05996bfd1ec12
      
https://github.com/Perl/perl5/commit/5f490858667e1d2f5a3435fea6e05996bfd1ec12
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 761738cfbf0229ab0f88b79808278b9558bc2223
      
https://github.com/Perl/perl5/commit/761738cfbf0229ab0f88b79808278b9558bc2223
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 Feb 2023)

  Changed paths:
    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: b17f0330879fe2bfd6186383e8d9ad84f99990c9
      
https://github.com/Perl/perl5/commit/b17f0330879fe2bfd6186383e8d9ad84f99990c9
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 04afd8cf4bf0d9ee87b1d7b8cba87c0eb37bb1cf
      
https://github.com/Perl/perl5/commit/04afd8cf4bf0d9ee87b1d7b8cba87c0eb37bb1cf
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: b334b64a126ef65af612a2b8776cc26beea38fd8
      
https://github.com/Perl/perl5/commit/b334b64a126ef65af612a2b8776cc26beea38fd8
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 2767bcd4056c6ba4d38d4ebac4cbf6e2b44c5c4e
      
https://github.com/Perl/perl5/commit/2767bcd4056c6ba4d38d4ebac4cbf6e2b44c5c4e
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 0ec3acf7b95bda4e45bda8531e0104f97eae8f39
      
https://github.com/Perl/perl5/commit/0ec3acf7b95bda4e45bda8531e0104f97eae8f39
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: f1403efde88182f69fed98afb9c852b3b7ee6f30
      
https://github.com/Perl/perl5/commit/f1403efde88182f69fed98afb9c852b3b7ee6f30
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 5de45d93fe29c83fcdb2404dd24e44c6f112e9ad
      
https://github.com/Perl/perl5/commit/5de45d93fe29c83fcdb2404dd24e44c6f112e9ad
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: bd2428c098a94b6676268e597d0b14b84946bf7d
      
https://github.com/Perl/perl5/commit/bd2428c098a94b6676268e597d0b14b84946bf7d
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 8320688cbd29f920c57e7702b680b933bedd2963
      
https://github.com/Perl/perl5/commit/8320688cbd29f920c57e7702b680b933bedd2963
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 319ca01308a78fd1afdbc7c0b04da8b9015e4a75
      
https://github.com/Perl/perl5/commit/319ca01308a78fd1afdbc7c0b04da8b9015e4a75
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 471f8ac057df65a43375a40fcb7d0de92ce70167
      
https://github.com/Perl/perl5/commit/471f8ac057df65a43375a40fcb7d0de92ce70167
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 95cf8210b17dd61800db65f23c6db7dd2f454df6
      
https://github.com/Perl/perl5/commit/95cf8210b17dd61800db65f23c6db7dd2f454df6
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 6e8288eb9b3e56e4533fec29c874f9cb5340b5a4
      
https://github.com/Perl/perl5/commit/6e8288eb9b3e56e4533fec29c874f9cb5340b5a4
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 31f84d966a4a1c522a962b6524da1e39a1a76d66
      
https://github.com/Perl/perl5/commit/31f84d966a4a1c522a962b6524da1e39a1a76d66
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 59a251235adbc850d7c4c77d279199317dc71929
      
https://github.com/Perl/perl5/commit/59a251235adbc850d7c4c77d279199317dc71929
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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


  Commit: f3e3f88dd0fb95dad64ddef70826df85f9faeab0
      
https://github.com/Perl/perl5/commit/f3e3f88dd0fb95dad64ddef70826df85f9faeab0
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: fa90ad8e92cef5c80b895ec011501d293f38de81
      
https://github.com/Perl/perl5/commit/fa90ad8e92cef5c80b895ec011501d293f38de81
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 1d8f13d30794a2e5dd9b24d999fb6880f102d632
      
https://github.com/Perl/perl5/commit/1d8f13d30794a2e5dd9b24d999fb6880f102d632
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: ef22a781b1ab93c739644d2ba4c9f2ca3105e161
      
https://github.com/Perl/perl5/commit/ef22a781b1ab93c739644d2ba4c9f2ca3105e161
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: dd3d818a0c28014930311bc56645ce97e6fb0d81
      
https://github.com/Perl/perl5/commit/dd3d818a0c28014930311bc56645ce97e6fb0d81
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 9aab56736542c5dba4972c5e8ffae47d77ab89fd
      
https://github.com/Perl/perl5/commit/9aab56736542c5dba4972c5e8ffae47d77ab89fd
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 08e8719b8f9c472f39de17ab261e8891720dabed
      
https://github.com/Perl/perl5/commit/08e8719b8f9c472f39de17ab261e8891720dabed
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 7bc62c6dfaced85a422aa89d7f3a19da07e116d8
      
https://github.com/Perl/perl5/commit/7bc62c6dfaced85a422aa89d7f3a19da07e116d8
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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: 0665833b13940c97e95c55b494b96b340283cb8b
      
https://github.com/Perl/perl5/commit/0665833b13940c97e95c55b494b96b340283cb8b
  Author: David Mitchell <[email protected]>
  Date:   2023-02-19 (Sun, 19 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/89eb40296a24%5E...0665833b1394

Reply via email to