in reply to Re^19: Perl crash during perl_clone
in thread Perl crash during perl_clone

Let me know if it works for you and if it makes sense.

Sorry, you lost me there ) I can't see where you could put newSVsv() in RegisterCB(); much less need to...

'fraid you'll have to draw me a picture of that one :)

Replies are listed 'Best First'.
Re^21: Perl crash during perl_clone
by perlmonk1729 (Acolyte) on Nov 09, 2010 at 04:49 UTC
    I tried to understand the errors ("undefined subroutine, not a CODE ref) and added Perl_sv_dump while the SV is being registered and before call_sv. It confirmed that a code-ref was properly being registered/cached, but by the time it came to calling the PCB, its "contents" had changed (i.e "printf sv" prints same value, but Perl_sv_dump shows changes).

    I'm a novice at the perl-internal reprenstations, but picked up enough bits that led to my theory :-)

    This is a print from my real project, as I was caching/registering a PCB. The "SV = PVCV", the correct "module-name", "subname" and the rest of the details in the sv_dump print suggested the code-ref was correct at registration time.

    SV = RV(0xa519e7c) at 0xa519e70 REFCNT = 1 FLAGS = (PADMY,ROK) RV = 0xa51a290 SV = PVCV(0xa4fd0e8) at 0xa51a290 REFCNT = 2 FLAGS = () COMP_STASH = 0x98a2d30 "module-name" ... caching perl-sub ref 173121136d in 159850504d context

    Here is the output when the PCB gets called (and gives an "not a CODE ref" error).

    context is 159850504d is calling 173121136d SV = RV(0xa519e7c) at 0xa519e70 REFCNT = 1 FLAGS = (PADSTALE,PADMY) ....

    Note the 'context' and 'sv' values printed are as expected. However, the details (e.g "FLAGS" and others not shown) are totally different. In addition, FLAGS says "STALE" (anything stale cannot be good). Also, it wasnt a "PVCV" anymore.

    That got me thinking if somehow it was "going out of scope" (not sure thats the correct term to use)

    So, I added the newSVsv() just before caching the PCB. See the revised snippet from the myModule.xs that I shared earlier.

    RegisterCB2 (SV *SubRef) CODE: cb_ptr2 = newSVsv(SubRef); printf("registered %lud\n", cb_ptr2); Perl_sv_dump(orig_perl, cb_ptr2); RETVAL = 1; OUTPUT: RETVAL

    Note: I'vent dont anything since last night, so I may still revise this based on any test failures. Also, I will experiment with the 'modname:subname' syntax with SWIG. Will update after that.

      Hm. I'm afraid that is all over my head.

      Where did you get Perl_sv_dump() from? Cos it doesn't appear to be in any of the docs I have. If I try to use it (on anything) it just crashes.

      The only relevant reference I've found is this by syphilis, but either form crashes my machine.

      And so we (I) arrive in that dead-end where most every one of my forays into XS/internals programming ends up. The one where the only option left open is trial&error combined with cargo-culting.

      The one that always reminds me of the opening lines from the A-team: If your in trouble, and if you can find it, a piece of existing working code that does something sufficiently similar to what you want to do, than you can cargo-cult it and it might work. But it probably won't work everywhere, and is likely to suffer from sporadic and random errors.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        I found this function in perlguts, section "Examining internal data structures with the dump functions".

        Thanks