develooper Front page | perl.perl5.porters | Postings from September 2023

Re: Calling Perl subs from XS under PERL_RC_STACK

Thread Previous | Thread Next
Dave Mitchell
September 12, 2023 23:22
Re: Calling Perl subs from XS under PERL_RC_STACK
Message ID:
On Tue, Sep 12, 2023 at 07:10:45PM +0200, Lukas Mai wrote:
> I built perl 5.39.2 with PERL_RC_STACK. One of my modules,
> Function::Parameters, started failing:

Given that the PERL_RC_STACK work isn't even complete in the perl core
yet, I think you're jumping the gun a bit!

A lot of CPAN modules, including XS ones, work out of the box - some,
depending on circumstances, will require some work.

> | perl5.39.2: Parameters.xs:1367: register_info: Assertion
> `!rpp_stack_is_rc()' failed.
> Is this the expected behavior?
> I got things to work again by manually patching all the PUSHMARK/EXTEND/PUSH
> sites with lots of #ifdef PERL_RC_STACK gates:
> Is there a better way to do this? Should perlcall.pod be amended? Or am I
> doing it wrong?

In general, things get wrapped so that 'legacy' code can continue using
dSP and PUSHs etc. It's possible to rewrite such things using the new rpp_
API, which are designed to work in both PERL_RC_STACK and vanilla
environments. But the new rpp_ functions aren't in PPPort yet, so you
can't rewrite your code using them. Including them conditionally with
millions of #ifdefs is definitely not the approach to take.

In rare cases, code may be called from both refcounted stack environments
and non-refcounted environments. An example of this is perl's call_sv()
and similar, which can be called from anywhere, and so have to be
ambidextrous. Thus the body of call_sv() has a few #ifdefs.

I don't know about Function::Parameters and in particular how the
functions you've been modifying get invoked. But if there is a transition
from a refcounted stack to non-refcounted stack somewhere which isn't via
a normal XS call from pp_entersub, then it probably needs wrapping so
that it's given a temporarily non-refcounted stack to run on and so can
run unmodified.

But really, you'd be best off waiting until it's complete in core, the
rpp_() API has stabilised, and PPPort has been updated.

Diplomacy is telling someone to go to hell in such a way that they'll
look forward to the trip

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About