Skip to content

Conversation

iabyn
Copy link
Contributor

@iabyn iabyn commented Oct 2, 2025

Rewrite perlxs.pod

This branch completely rewrites and modernises the XS reference manual,
perlxs.pod.

The new file is about twice the size of the old one.

This branch:

  • deletes some obsolete sections;

  • reorders the existing sections into a more logical order;

  • adds a large new introductory/overview part, which explains
    all the background needed to understand what XSUBs do, including
    SVs, the stack, reference counts, magic etc.

  • includes a BNF syntax section

  • modernises: e.g. it uses "ANSI" parameter syntax throughout

  • has a fully-worked example using T_PTROBJ

Note that although each commit in this branch may have a complex-looking
diff for the updating of a particular section, in reality most sections
haver been rewritten from scratch, and the diff output is showing
paragraph breaks as fixed unchanging points, so that it appears as lots of
individual paragraph changes rather than "delete all this text, add new
text". If reviewing, it may be easier to just read the final perlxs.pod
file instead of looking at the diffs.

  • This set of changes requires a perldelta entry, and I will write one later

iabyn added 30 commits October 2, 2025 12:03
The XS parser supported an extremely obscure bit of functionality which
made use of the %v package variable to maintain state between different
bits of typemap processing. This was accidentally broken in 5.10.0:
refactoring removed the 'use vars "%v"' line, and no one seemed to
notice or care.

Also, the sole example of its use in the docs seemed to be obscure,
confusing and probably wrong.

There was a consensus in the discussion at

    http://nntp.perl.org/group/perl.perl5.porters/267667

that we should stop documenting this feature rather than trying to fix
it.
The various XS code examples had odd and inconsistent indentation (often
with 5 leading spaces) and inconsistent formatting, e.g. foo(a,b) vs
foo( a, b ) vs foo(a, b). Fix that, and also remove any tab chars.

Whitespace-only change.
This commit is a simple cut which deletes several '=head2' sections from
perlxs.pod. The next commit will tidy up and fix any broken links etc.

These sections are more tutorial-like, and aren't in line with the goal
of this branch that perlxs.pod becomes purely a reference manual for XS.
Any relevant information from these sections may be incorporated later
into new sections in perlxs.pod and/or be included in a future rewrite
of perlxstut.pod.

The sections deleted are:

    =head2 Introduction
    =head2 On The Road
    =head2 The Anatomy of an XSUB
    =head2 The Argument Stack
    =head2 The RETVAL Variable
    =head2 Returning SVs, AVs and HVs through RETVAL
    =head2 Returning Undef And Empty Lists
    =head2 Interface Strategy
    =head2 Perl Objects And C Structures
The previous commit deleted several sections from perlxs.pod. This
commit fixes things up; done as a separate commit so that the changes
aren't drowned out in the diff listing.
This big commit does a series of plain cut+pastes to reorder all the
=head2 sections within the file.

This changes the order from semi-random into roughly the order the
various XS keywords would appear within an XS file, and then within an
XSUB declaration/definition.

No changes have been made to the text: simply that all lines from a
particular '^=head2' up until the next head2 have been cut+paste as
a single unit.

No attempt has been made yet to make the text consistent with the new
ordering; that will be done by the subsequent commits of this branch.

The previous ordering in this file was:

    =head1 NAME
    =head1 DESCRIPTION
    =head2 The MODULE Keyword
    =head2 The PACKAGE Keyword
    =head2 The PREFIX Keyword
    =head2 The OUTPUT: Keyword
    =head2 The NO_OUTPUT Keyword
    =head2 The CODE: Keyword
    =head2 The INIT: Keyword
    =head2 The NO_INIT Keyword
    =head2 The TYPEMAP: Keyword
    =head2 Initializing Function Parameters
    =head2 Default Parameter Values
    =head2 The PREINIT: Keyword
    =head2 The SCOPE: Keyword
    =head2 The INPUT: Keyword
    =head2 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
    =head2 The C<length(NAME)> Keyword
    =head2 Variable-length Parameter Lists
    =head2 The C_ARGS: Keyword
    =head2 The PPCODE: Keyword
    =head2 The REQUIRE: Keyword
    =head2 The CLEANUP: Keyword
    =head2 The POSTCALL: Keyword
    =head2 The BOOT: Keyword
    =head2 The VERSIONCHECK: Keyword
    =head2 The PROTOTYPES: Keyword
    =head2 The PROTOTYPE: Keyword
    =head2 The ALIAS: Keyword
    =head2 The OVERLOAD: Keyword
    =head2 The FALLBACK: Keyword
    =head2 The INTERFACE: Keyword
    =head2 The INTERFACE_MACRO: Keyword
    =head2 The INCLUDE: Keyword
    =head2 The INCLUDE_COMMAND: Keyword
    =head2 The CASE: Keyword
    =head2 The EXPORT_XSUB_SYMBOLS: Keyword
    =head2 The & Unary Operator
    =head2 Inserting POD, Comments and C Preprocessor Directives
    =head2 Using XS With C++
    =head2 Safely Storing Static Data in XS
    =head3 MY_CXT REFERENCE
    =head1 EXAMPLES
    =head1 CAVEATS
    =head2 Use of standard C library functions
    =head2 Event loops and control flow
    =head1 XS VERSION
    =head1 AUTHOR DIAGNOSTICS
    =head1 AUTHOR

and is now:

    =head1 NAME
    =head1 DESCRIPTION
    =head2 The MODULE Keyword
    =head2 The PACKAGE Keyword
    =head2 The PREFIX Keyword
    =head2 Inserting POD, Comments and C Preprocessor Directives
    =head2 The REQUIRE: Keyword
    =head2 The VERSIONCHECK: Keyword
    =head2 The PROTOTYPES: Keyword
    =head2 The EXPORT_XSUB_SYMBOLS: Keyword
    =head2 The INCLUDE: Keyword
    =head2 The INCLUDE_COMMAND: Keyword
    =head2 The TYPEMAP: Keyword
    =head2 The BOOT: Keyword
    =head2 The FALLBACK: Keyword
    =head2 The NO_OUTPUT Keyword
    =head2 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
    =head2 Default Parameter Values
    =head2 The C<length(NAME)> Keyword
    =head2 Variable-length Parameter Lists
    =head2 The PREINIT: Keyword
    =head2 The INPUT: Keyword
    =head2 The NO_INIT Keyword
    =head2 Initializing Function Parameters
    =head2 The & Unary Operator
    =head2 The SCOPE: Keyword
    =head2 The INIT: Keyword
    =head2 The C_ARGS: Keyword
    =head2 The CODE: Keyword
    =head2 The PPCODE: Keyword
    =head2 The POSTCALL: Keyword
    =head2 The OUTPUT: Keyword
    =head2 The CLEANUP: Keyword
    =head2 The PROTOTYPE: Keyword
    =head2 The OVERLOAD: Keyword
    =head2 The ALIAS: Keyword
    =head2 The INTERFACE: Keyword
    =head2 The INTERFACE_MACRO: Keyword
    =head2 The CASE: Keyword
    =head2 Using XS With C++
    =head2 Safely Storing Static Data in XS
    =head3 MY_CXT REFERENCE
    =head1 EXAMPLES
    =head1 CAVEATS
    =head2 Use of standard C library functions
    =head2 Event loops and control flow
    =head1 XS VERSION
    =head1 AUTHOR DIAGNOSTICS
    =head1 AUTHOR
Following the previous commit's reordering of the all the =head2
sections, demote most of the =head2 headers to =head3, and add some new
=head2 headers which group together related headers.

Also add some =head3's for a few missing keywords.

Subsequent commits will flesh out the new sections.
Four commits ago, I removed most of the general text sections in
perlxs (i.e. the ones not specifically about a particular keyword).

Now this commit adds a completely new introductory part to perlxs, about
1200 lines long. It represents an attempt to write a background to what
XS and XSUBs, SVs, typemaps etc are, in a complete and modern way.
The existing reference section for each keyword follows it.

I tried to avoid getting too tutorial-like (that's what perlxstut is
for), but I may have crossed the line in various places. In particular
it has a new section which could have been titled "all the bits of
perlguts you need to know in order to write non-trivial XSUBs without
having to actually read perlguts".
Add a section which semi-formally tries to define the syntax and
structue of an XS file, using a BNF-like format.

See http://nntp.perl.org/group/perl.perl5.porters/268701 for the
discussion of this part.
Rewrite the POD for these three keywords, and in particular, treat
them as one declaration, rather than three unrelated keywords.
Populate the new

     =head2 File-scoped XS Keywords and Directives

section, partially by cannibalising (and then deleting) the old

    =head3 Inserting POD, Comments and C Preprocessor Directives

subsection. This commit only adds text about directives; subsequent
commits will update the various file-scoped keywords.
Populate the new

    =head2 The Structure of an XSUB
    =head2 An XSUB Declaration

sections
Add some initial text for this new section, and also add a new
subsection "XSUB Parameter Placeholders".
Rewrite (and retitle) these three subsections:

    =head3 Default Parameter Values
    =head3 The C<length(NAME)> Keyword
    =head3 Variable-length Parameter Lists
Add text for the new '=head2 The XSUB Input Part' section, and rewrite
the existing entry for the PREINIT keyword.
This commit completely rewrites this section and subsections:

    =head3 The INPUT: Keyword
        =head4 The NO_INIT Keyword
        =head4 Initializing Function Parameters
        =head4 The & Unary Operator

It de-emphasises the INPUT keyword and suggests using ANSI XS signatures
etc instead.
Add text for the new '=head2 The XSUB Init Part' section, and rewrite
the existing entry for the INIT keyword.
Add text to the new

    =head2 The XSUB Code Part
    =head3 Auto-calling a C function

sections, and rewrite the existing

    =head4 The C_ARGS: Keyword

section
Rewrite these sections:

    =head3 The CODE: Keyword
    =head3 The PPCODE: Keyword
This keyword formerly wasn't documented. The docs now say "this is what
it is, but don't use it".
Add text to the new

    =head2 The XSUB Output Part

section, and rewrite the text in these existing sections:

    =head3 The POSTCALL: Keyword
    =head3 The OUTPUT: Keyword
Add text to the new

    =head2 The XSUB Cleanup Part

section, and rewrite the text in this existing section:

 =head3 The CLEANUP: Keyword
Add text to the new

    =head2 XSUB Generic Keywords

section, and rewrite the text in this existing section:

    =head3 The PROTOTYPE: Keyword
iabyn added 12 commits October 2, 2025 12:03
Explain that a 'C' parameter type in an XSUB declaration can actually
be a Perl package name or similar, e.g.

    Foo::Bar
    f(Foo::Bar obj, char *s)
First, add a new subsection

    =head3 T_PTROBJ and opaque handles

to the TYPEMAPs section explaining how this typemap can be used to
map between Perl objects and C library handles. It provides a
fully-worked example of wrapping a simple arithmetic library.

Then completely rewrite the

    =head3 The OVERLOAD: Keyword

section. In particular, it now refers to the new T_PTROBJ example and
shows how it can be extended to use overloading.
This keyword was undocumented, even though it had been added 25 years
ago.
Populate the introduction to this new section.
Rewrite this section:

    =head3 The ALIAS: Keyword
Rewrite these sections:

 =head3 The INTERFACE: Keyword
 =head3 The INTERFACE_MACRO: Keyword

also demote the second to be a head4 child of the first. Then expand
the T_PTROBJ example to use INTERFACE as an alternative to ALIAS.
Rewrite this section:

    =head3 The CASE: Keyword
Populate this new section (except for the T_PTROBJ subsection, which had
already been added by an earlier commit within this branch).

Note that the "Common typemaps" subsection could probably benefit
from some further expansion by someone familiar with which built-in
T_FOO entries are useful.
Rewrite this section:

 =head2 Using XS With C++

Disclaimer: I've never written a proper C++ program. I had to
(literally) dust off my 34-year old copy of Stroustrup(*) and also do
some Googling. Hopefully what I've written is sane.

(*) This was bought back in the days when people used to to learn things
by buying books, and when I thought that I ought to know something about
this newfangled C++ thing. I never got round to reading all of it: I
discovered Perl around the same time, which looked to be a lot more fun.
Revise the text in this section:

    =head2 Safely Storing Static Data in XS
Rewrite this section:

     =head1 EXAMPLES

Basically, delete the one big example in this section and instead
provide links to various other examples already present in this document
instead.
Tweak the final few sections of perlxs.pod.
Comment on lines +350 to +356
L<perlcall>: this describes how to call Perl functions and do the
equivalent of C<eval ""> from C.

=item *

L<perlembed>: this describes how to embed a complete Perl interpreter
within another application.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

perlcall barely mentions eval_pv, perlembed provides much better documentation for eval_pv/eval_sv.


There is a standard system typemap file which contains rules for common C
and Perl types, but you can add your own typemap file in addition, and
from perl 5.16.0 onwards you can also add typemap declarations inline
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this refer to the version of EU::PXS that added embedded typemaps (3.01) instead of the perl version?

Comment on lines +918 to +919
If you need to coerce an SV to a string (e.g. before modifying its string
value) then use C<SvPV_force()> or one of its variants. For example if
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps "before directly modifying its string buffer".

You don't need to force normal before calling sv_setpvn().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants