On Wed, May 28, 2003 at 02:51:10PM +0700, Oleg Yu. Tokarev wrote:
> An xs-function has a reference to a hash as its input, like this:
> my $h = {KEY => 123, VAL => 0};
> bla::bla( $h );
> The xs-function updates $h->{VAL} during its execution.
>
> Inside itself the xs-function call a C-library function.
> Its prototype is: int cbla (int key, int *val);
>
> The question:
> Can i get a pointer to int-value saved in the hash?
> Or in other words: I can get SV saved in the hash. Can i get a pointer
> to a memory slot in the SV where 'int' saved?
>
> '&(SvIV(something))' does not work!
Once you know that SvIV is a macro defined like this in sv.h:
#define SvIV(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv))
It's hardly surprising, is it? :-)
> May be there is another way to resolve a such problem, is there?
I'm not quite sure of the best way to do this.
I'm loathe to suggest:
(void) SvIV(something);
&(SvIVX(something));
as I believe that it's wrong to assume that the side effect of SvIV()
is that a SV now has a valid IV slot. But I suspect that it will work
for all the values that you can throw at it from a hash
(eg it's not possible to give it a literal undef - PL_sv_undef, as an
accessible SV value)
I believe that SvIVX() is the correct way to get at the IV slot, but I think
that someone else needs to suggest better (more "correct") logic to
ensure an upgrade sufficient to ensure that an IV slot exists.
Nicholas Clark