Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^3: When to (and not to) use sv_2mortal()

by BrowserUk (Pope)
on Oct 28, 2011 at 22:23 UTC ( #934525=note: print w/ replies, xml ) Need Help??


in reply to Re^2: When to (and not to) use sv_2mortal()
in thread When to (and not to) use sv_2mortal()

Did your posted code compile for you? Cos I get this lot:

junk.c junk.xs(21) : error C2275: 'SV' : illegal use of this type as an expre +ssion C:\Perl64\lib\CORE\perl.h(2400) : see declaration of 'SV' junk.xs(21) : error C2065: 'sp' : undeclared identifier junk.xs(21) : error C2100: illegal indirection junk.xs(23) : error C2143: syntax error : missing ';' before 'type' junk.xs(30) : error C2065: 'sp' : undeclared identifier junk.xs(30) : error C2113: '-' : pointer can only be subtracted from a +nother pointer junk.xs(33) : error C2065: 'sp' : undeclared identifier junk.xs(33) : warning C4047: '<' : 'SV **' differs in levels of indire +ction from 'int' junk.xs(33) : error C2065: 'sp' : undeclared identifier junk.xs(33) : error C2065: 'sp' : undeclared identifier junk.xs(33) : warning C4047: 'function' : 'SV **' differs in levels of + indirection from 'int' junk.xs(33) : warning C4024: 'Perl_stack_grow' : different types for f +ormal and actual parameter 2 junk.xs(33) : error C2065: 'sp' : undeclared identifier junk.xs(33) : warning C4047: 'function' : 'SV **' differs in levels of + indirection from 'int' junk.xs(33) : warning C4024: 'Perl_stack_grow' : different types for f +ormal and actual parameter 3 junk.xs(33) : warning C4047: '=' : 'int' differs in levels of indirect +ion from 'SV **' junk.xs(33) : error C2065: 'sp' : undeclared identifier junk.xs(33) : error C2100: illegal indirection junk.xs(33) : warning C4047: '=' : 'int' differs in levels of indirect +ion from 'SV *' junk.xs(33) : error C2106: '=' : left operand must be l-value junk.xs(36) : error C2065: 'sp' : undeclared identifier junk.xs(36) : warning C4047: '=' : 'SV **' differs in levels of indire +ction from 'int' junk.xs(40) : error C2065: 'count' : undeclared identifier junk.xs(44) : error C2065: 'sp' : undeclared identifier junk.xs(44) : warning C4047: '=' : 'int' differs in levels of indirect +ion from 'SV **' junk.xs(49) : error C2065: 'count' : undeclared identifier junk.xs(52) : error C2065: 'sp' : undeclared identifier junk.xs(52) : error C2100: illegal indirection junk.xs(52) : warning C4047: '=' : 'SV *' differs in levels of indirec +tion from 'int' junk.xs(52) : warning C4244: '=' : conversion from 'IV' to 'int', poss +ible loss of data junk.xs(56) : error C2065: 'sp' : undeclared identifier junk.xs(56) : warning C4047: '=' : 'SV **' differs in levels of indire +ction from 'int' NMAKE : fatal error U1077: '"c:\Program Files (x86)\Microsoft Visual S +tudio 9.0\VC\Bin\amd64\cl.EXE"' : return code '0x2' Stop.

Maybe your compiler allows you to take liberties with the C rule that declarations must come before executable statements?

Anyway, I've always felt that placing dSP; and similar XS declarations at the very top of the function is probably best. I also had to move int rv; above the printf. That fixed up all the errors and warnings except for:

rv = POPi; junk.xs(51) : warning C4244: '=' : conversion from 'IV' to 'int', poss +ible loss of data

which is because I'm using 64-bit.

It runs clean showing no signs of memory leaks.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
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.


Comment on Re^3: When to (and not to) use sv_2mortal()
Select or Download Code
Re^4: When to (and not to) use sv_2mortal()
by davido (Archbishop) on Oct 28, 2011 at 22:40 UTC

    Yes, it compiles for me, but to your point I'll clean up the declarations within the post. I've been using C++ a lot more than C lately, and given the similarities in syntax between the two it starts to get easy to let one leak into the other. I learned Portuguese as a second language, and then picked up Spanish along the way a few years later. Both being romance languages, there are enough similarities that I found it necessary to concentrate on not slipping a Portuguese-specific word into my Spanish.

    Thanks for taking a look at it. This is the sort of thing that if I'm going to invest the time in learning it, I want to learn it right.

    I considered picking up the Extending and Embedding Perl book, but given that it came along before 5.8.8 (I think), there have been changes to XS since then that might make the book more trouble than it's worth. If anyone reading this knows otherwise let me know and I'll probably go pick up a copy somewhere. Meanwhile, POD, tinker, and more POD.


    Dave

      This is the sort of thing that if I'm going to invest the time in learning it, I want to learn it right.

      Once you get past the initial get something working stage is when it gets interesting and then frustrating.

      For example, in this version of your code I've stripped out a whole bunch of macros and it still compiles clean and runs leak-free. Unsuprisingly, it is a tad quicker:

      int test_perlcall( int input ) { dSP; /* Declare and initialize local copy of Perl stack ptr */ PUSHMARK(SP); XPUSHs(sv_2mortal(newSViv( input ))); PUTBACK; if( call_pv( "return_input", G_SCALAR ) != 1 ) croak( "Well, THAT failed to work.\n" ); return (int)POPi; /* Inline::C handles this typemap automatically. + */ }

      But then you start wondering why all those apparently unneeded macros are used in the samples. They obviously are required on some occasions, but when? And why?

      It is answers to these questions that are much harder to obtain.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://934525]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (7)
As of 2014-11-24 09:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (137 votes), past polls