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.
In reply to Re^3: When to (and not to) use sv_2mortal()
by BrowserUk
in thread When to (and not to) use sv_2mortal()
by davido
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |