Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^4: odd line in windows

by syphilis (Chancellor)
on Sep 08, 2011 at 10:58 UTC ( #924776=note: print w/replies, xml ) Need Help??


in reply to Re^3: odd line in windows
in thread odd line in windows

So unless I'm missing something, this can only be used if you actually hold a reference to the array you return

No way to alter that particular reference count before returning the newly created AV ?

Cheers,
Rob

Replies are listed 'Best First'.
Re^5: odd line in windows
by BrowserUk (Pope) on Sep 08, 2011 at 11:12 UTC

    According to the example in the Inline C Cookbook, the correct way to return an AV* is:

    newRV_noinc( (SV*)array = newAV() )

    Which kind of makes sense given the info ikegami posted above.


    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.
      Which kind of makes sense given the info ikegami posted above

      Yes, it does make sense - yet it's not what I naively expected.
      I expected that you'd just return the AV* ... but if that can bugger up the refcount, and there's no way of twiddling it, then one certainly needs to be careful whenever one declares a function as returning AV*.

      Still, it was probably a silly question on my part.
      If there was a way to twiddle that refcount in a returning AV*, then I would think ikegami would have mentioned it.

      Cheers,
      Rob
        yet it's not what I naively expected.

        I have similar reservations about the Object Oriented Inline example in the cookbook:

        SV* new(char* class, char* name, char* rank, long serial) { Soldier* soldier; SV* obj_ref = newSViv(0); SV* obj = newSVrv(obj_ref, class); New(42, soldier, 1, Soldier); soldier->name = savepv(name); soldier->rank = savepv(rank); soldier->serial = serial; sv_setiv(obj, (IV)soldier); SvREADONLY_on(obj); return obj_ref; }

        obj_ref is an IV (set to 0), pointed at by obj which is an RV, who's IV is set to the address of the struct and then set read only. But then it is obj_ref that is returned.

        • Why is the RV called obj and the thing it points to call obj_ref?
        • Why is obj_ref returned when it is an IV that has only ever been set to 0?
        • How can we (now, since 5.14?), assign the address of the struct to the IV component of obj (which is constructed as an RV remember) without overwriting the pointer now that they are one and the same piece of memory?

        Then again, I find almost nothing about XS intuitive and the documentation is shite. If you ask questions about it you either get no answers or an answer of "Do this", with no explanation of why that works. And that smacks of the passing on of rote learnt knowledge with no true understanding. If there is anyone left who really understands this stuff, they are keeping that knowledge firmly to themselves.

        If I could get help in understanding this stuff I might have published a whole lot more of my half-finished, but dead-in-the-water projects.


        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.
      MUTABLE_SV(av) is better (SV*)av because it won't cast away const.
Re^5: odd line in windows (WONTFIX)
by ikegami (Pope) on Sep 09, 2011 at 03:20 UTC

    I filed a ticket and was told that this is documented in perlxs.


    This is quite useful as it usually improves readability. While this works fine for an SV *, it's unfortunately not as easy to have AV * or HV * as a return value. You should be able to write:

    AV * array() CODE: RETVAL = newAV(); /* do something with RETVAL */ OUTPUT: RETVAL

    But due to an unfixable bug (fixing it would break lots of existing CPAN modules) in the typemap file, the reference count of the AV * is not properly decremented. Thus, the above XSUB would leak memory whenever it is being called. The same problem exists for HV *.

Re^5: odd line in windows
by ikegami (Pope) on Sep 08, 2011 at 19:53 UTC
    No. Decrementing its refcount before returning it would free it. One would normally make it a mortal, but I tried that and it didn't work.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://924776]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (4)
As of 2017-10-19 04:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My fridge is mostly full of:

















    Results (251 votes). Check out past polls.

    Notices?