• Tom Lane's avatar
    PL/Perl portability fix: avoid including XSUB.h in plperl.c. · bebe174b
    Tom Lane authored
    In Perl builds that define PERL_IMPLICIT_SYS, XSUB.h defines macros
    that replace a whole lot of basic libc functions with Perl functions.
    We can't tolerate that in plperl.c; it breaks at least PG_TRY and
    probably other stuff.  The core idea of this patch is to include XSUB.h
    only in the .xs files where it's really needed, and to move any code
    broken by PERL_IMPLICIT_SYS out of the .xs files and into plperl.c.
    
    The reason this hasn't been a problem before is that our build techniques
    did not result in PERL_IMPLICIT_SYS appearing as a #define in PL/Perl,
    even on some platforms where Perl thinks it is defined.  That's about to
    change in order to fix a nasty portability issue, so we need this work to
    make the code safe for that.
    
    Rather unaccountably, the Perl people chose XSUB.h as the place to provide
    the versions of the aTHX/aTHX_ macros that are needed by code that's not
    explicitly aware of the MULTIPLICITY API conventions.  Hence, just removing
    XSUB.h from plperl.c fails miserably.  But we can work around that by
    defining PERL_NO_GET_CONTEXT (which would make the relevant stanza of
    XSUB.h a no-op anyway).  As explained in perlguts.pod, that means we need
    to add a "dTHX" macro call in every C function that calls a Perl API
    function.  In most of them we just add this at the top; but since the
    macro fetches the current Perl interpreter pointer, more care is needed
    in functions that switch the active interpreter.  Lack of the macro is
    easily recognized since it results in bleats about "my_perl" not being
    defined.
    
    (A nice side benefit of this is that it significantly reduces the number
    of fetches of the current interpreter pointer.  On my machine, plperl.so
    gets more than 10% smaller, and there's probably some performance win too.
    We could reduce the number of fetches still more by decorating the code
    with pTHX_/aTHX_ macros to pass the interpreter pointer around, as
    explained by perlguts.pod; but that's a task for another day.)
    
    Formatting note: pgindent seems happy to treat "dTHX;" as a declaration
    so long as it's the first thing after the left brace, as we'd already
    observed with respect to the similar macro "dSP;".  If you try to put
    it later in a set of declarations, pgindent puts ugly extra space
    around it.
    
    Having removed XSUB.h from plperl.c, we need only move the support
    functions for spi_return_next and util_elog (both of which use PG_TRY)
    out of the .xs files and into plperl.c.  This seems sufficient to
    avoid the known problems caused by PERL_IMPLICIT_SYS, although we
    could move more code if additional issues emerge.
    
    This will need to be back-patched, but first let's see what the
    buildfarm makes of it.
    
    Patch by me, with some help from Ashutosh Sharma
    
    Discussion: https://postgr.es/m/CANFyU97OVQ3+Mzfmt3MhuUm5NwPU=-FtbNH5Eb7nZL9ua8=rcA@mail.gmail.com
    bebe174b
Util.xs 3.82 KB