# The following was supposedly scribed by
# Marvin Humphrey
# on Wednesday 29 June 2005 09:30 pm:

>SV* return_a_scalar (SV* input_sv) {
>     if (return_the_input_unchanged) {
>          SvREFCNT_inc(input_sv); /* otherwise it goes to zero */
>          return input_sv;
>     }
>     else {
>         SV* new_scalar = newSVpvn("foo", 3);
>         return new_scalar;
>     }
>}
>
>The crux of the biscuit is that Perl doesn't know that the scalar  
>it's getting back is the same one it sent to C.  Perl decrements the  
>reference count for that scalar and cleans it up.  The next time you  
>try to access it, BAM!  Invalid SV and segfault.

Something sounds really wrong with that.  When does a perl function ever 
return the same scalar that it was passed?

sub return_a_scalar {
  my $s = shift;
  return($s);
}

Returns a *list* with the *value* of $s as the first element.

I'm thinking sv_mortalcopy() (or maybe sv_setsv_flags()) is the way to 
go here.  (I use sv_2mortal() when I'm pushing to a list, you maybe 
want the latter.)

Particularly if you're doing something like:

  $var = return_a_scalar($var);

Perl is going to handle the refcounting here, so I don't see why you 
need to mess with it.  I'm pretty sure you shouldn't return(input_sv) 
at all, regardless of what you do with refcounts.

--Eric
-- 
"Insert random misquote here"
---------------------------------------------
    http://scratchcomputing.com
---------------------------------------------

Reply via email to