http://www.perlmonks.org?node_id=11104951

syphilis has asked for the wisdom of the Perl Monks concerning the following question:

Hi,
In making some edits to the file mentioned in the subject line, I stumbled upon something that kept me occupied for way longer than I care to admit.
I believe that it will prove to be readily reproducible, but I'd be delighted if that turns out to *not* be the case.
Please feel free to test this.

In this ListUtil.xs you will find the following:
Line 1193: sv_setpvf(keysv, "%.15" NVgf, SvNV(arg)); Line 1194:#ifdef HV_FETCH_EMPTY_HE
I find that the code becomes uncompilable if I insert an empty line between those 2 lines:
Line 1193: sv_setpvf(keysv, "%.15" NVgf, SvNV(arg)); Line 1194: Line 1195:#ifdef HV_FETCH_EMPTY_HE
On both Ubuntu and MS Windows (perl-5.30.0 and others) that modification quickly produces the following error (during the 'make' stage of the build):
Code is not inside a function (maybe last function was ended by a blan +k line followed by a statement on column one?) in ListUtil.xs, line 1 +195 Makefile:360: recipe for target 'ListUtil.c' failed
Can someone explain that behaviour to me ?
Are XS files typically that sensitive to white space ? (I've struck nothing like it before.)

Cheers
Rob

Replies are listed 'Best First'.
Re: Puzzled by the ListUtil.xs in Scalar-List-Utils-1.52.tar.gz
by NetWallah (Canon) on Aug 24, 2019 at 18:18 UTC
    From the xs doc:
    ... The first blank line after the keyword will terminate the code block.

                    "From there to here, from here to there, funny things are everywhere." -- Dr. Seuss

      ... The first blank line after the keyword will terminate the code block

      One of the the joys of having Inline::C write your XS files for you is that you never need to read the XS docs.
      On the downside, if you then start messing around with the code in an XS file that was *not* created by Inline::C, you might end up asking a dumb question.

      Thanks NetWallah, dave_the_m.

      Cheers,
      Rob
        That certainly was NOT a dumb question.

        It made me research XS and increased my awareness and knowledge of XS by an order of magnitude.

        Unfortunately, 0 * 10 **1 still == 0.

        Your last comment made me go lookup Inline::C, to try to understand how to generate XS from that.

        I did not see any links to examples and documentation of that use case.

        There is a brief mention in the Inline::C cookbook , but I was looking for some sort of tutorial. Can anyone point to a simple module that was developed this way, so I can study that as an example ?

                        "From there to here, from here to there, funny things are everywhere." -- Dr. Seuss

Re: Puzzled by the ListUtil.xs in Scalar-List-Utils-1.52.tar.gz
by dave_the_m (Monsignor) on Aug 24, 2019 at 15:04 UTC
    I assume the XS parser is fairly simplistic in that it detects the start of a new XS function by looking for something starting in column 1 and preceded by a blank line. And the parser doesn't understand anything fancy like C syntax.

    Dave.