SvLEN( c ) = 2;
should be
SvLEN( c ) = 0;
since Perl isn't free to free the buffer. Furthermore, you replace the buffer you created with newSV without ever deallocating it, so you are leaking.
Solution 1:
void strIter(SV* code, SV* string) { dSP; STRLEN i; char* src = SvPV(string, i); SV* c; c = newSV_type(SVt_PV); SvCUR(c) = 1; SvLEN(c) = 0; SvPOK_only(c); SAVE_DEFSV; DEFSV_set(c); while (i--) { SvPVX(c) = src++; PUSHMARK(SP); call_sv(code, G_NOARGS | G_VOID | G_DISCARD); } }
Solution 2:
void strIter(SV* code, SV* string) { dSP; STRLEN i; char* src = SvPV(string, i); char* dst; SV* c; c = newSVpvn(" ", 1); dst = SvPVX(c); SAVE_DEFSV; DEFSV_set(c); while (i--) { *dst = *(src++); PUSHMARK(SP); call_sv(code, G_NOARGS | G_VOID | G_DISCARD); } }
In reply to Re: Help me improve my XS.
by ikegami
in thread Help me improve my XS.
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |