in reply to Re^3: XS/Inline::C concat *any* two SVs.
in thread XS/Inline::C concat *any* two SVs.
The code I posted in the OP now does what I need it to do. Basically the XS equivalent of Perl's
$scalar1 .= $scalar2;
I don't want to create a new scalar, except in the specific instance of a readonly input. The routine will be called many times and I need to accumulate the results in the scalar.
Duplicating the (already appended to), scalar in order to avoid using SvREFCOUNT_inc() is extremely wasteful and completely negates the benefits of perl's dynamically allocated string management. You have a scalar with n bytes, you call sv_catsv() to add m bytes to it. Having done that, you make a complete copy of m+n bytes in order to avoid the unreferenced scalar warning? This makes no sense to me, especially as the scalar of n bytes originates from Perl and has never gone out of scope.
My question still remains, why am I getting that warning?
The question is are there any other things that I need to test for and handle in order that I can handle any pair of SVs as input.
And if I comment out the sv_catsv() call ...
That is the (other) problem. If you call an SV that is undef as the first parameter to sv_catsv(), (which it usually will be on the first call for a particular SV), you get the warning. Hence the need for
if( !SvPOK( a ) ) // Still nothing, must be undef? sv_setpv( a, "" ); // Make it the null string to stop (one pos +sible) // Use of uninitialized value in subroutine entry from sv_cats +v
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: XS/Inline::C concat *any* two SVs.
by creamygoodness (Curate) on May 28, 2006 at 14:44 UTC | |
by BrowserUk (Patriarch) on May 28, 2006 at 15:20 UTC | |
by BrowserUk (Patriarch) on May 28, 2006 at 15:22 UTC | |
by creamygoodness (Curate) on May 28, 2006 at 15:30 UTC | |
by BrowserUk (Patriarch) on May 28, 2006 at 15:41 UTC | |
by creamygoodness (Curate) on May 28, 2006 at 15:46 UTC |