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


in reply to Re^2: ExtUtils::ParseXS has changed (PREINIT:)
in thread ExtUtils::ParseXS has changed

Being the guy who did the changes to ExtUtils::ParseXS, let me add my support for what tye said: The code in question worked purely by accident. The proper way to declare or initialize variables in an XSUB is in a PRE_INIT block! ExtUtils::ParseXS 3.XX just became strict in telling you about the problem in your code. It could have instead broken your code to segfault because of the old behaviour being an accidental misfeature and side-effect of the horrors that lurk in EU::ParseXS' code generation.
  • Comment on Re^3: ExtUtils::ParseXS has changed (PREINIT:)

Replies are listed 'Best First'.
Re^4: ExtUtils::ParseXS has changed (PREINIT:)
by syphilis (Archbishop) on Aug 24, 2011 at 07:53 UTC
    let me add my support for what tye said

    Yep - the file in question has now been amended in line with tye's recommendation, and all is well.
    Interestingly enough, that file had been in that state since 1998, and had produced no ill effects (afawk). There was even one abomination that did essentially this:
    void foo(x,dims) pdl *x PDL_Long *dims = NO_INIT CODE: dims = bar(ST(1)); ...
    'dims' (the 2nd argument supplied to foo) is an SV* ... but then there's a second 'dims' which is a PDL_Long*.
    Dunno how that worked ...

    ExtUtils::ParseXS 3.XX just became strict in telling you about the problem in your code

    Which is a good thing - though it didn't exactly complain in the right way.
    It merely told us that there was no typemap entry for PDL_Long*. And, sure enough, inserting a typemap entry for PDL_Long* fixed the problem, though that's the wrong fix.

    Cheers,
    Rob