Hello all, This is my first attempt at using Inline. I'm trying to write a function that duplicates this perl subroutine:
sub _init_values_perl { my ( $this, $col_vals ) = @_; while ( my ($k, $v) = each %$col_vals ) { $this->{'_col_' . $k} = $v; } } This is what I have got so far: void _init_values( SV* obj, SV* col_vals ) { HV* hash; HE* hash_entry; SV* sv_key; SV* sv_val; HV* members = SvRV(obj); SV* sv_new_key = newSVpv( "_col_", 5 ); char* key; int num_keys, i; STRLEN keylen; hash = (HV*)SvRV( col_vals ); num_keys = hv_iterinit( hash ); for ( i = 0; i < num_keys; i++ ) { hash_entry = hv_iternext( hash ); sv_key = hv_iterkeysv( hash_entry ); sv_val = hv_iterval( hash, hash_entry ); sv_setpvn( sv_new_key, "_col_", 5 ); sv_catsv( sv_new_key, sv_key ); key = SvPV( sv_new_key, keylen ); hv_store( members, key, keylen, sv_val, 0 ); } hv_iterinit( hash ); return; } When I run this, I get 'Attempt to free unreferenced scalar' warnings. If I try to run it multiple times I will eventually get segmentation fault. So after reading perlguts and scanning this list I changed the hv_store call to be: hv_store( members, key, keylen, SvREFCNT_inc(sv_val), 0 ); Now everything works, but I'm getting memory leaks. I've also tried to clone sv_val using newSVsv() but with the same results. I'm not sure what I'm doing wrong. This is how I'm calling the methods: my $t = { foo => 'bar', tom => 'bombadil', joe => 'smith', jon => 'parker', }; my $inline_d = DumpValsInline->new(); my $perl_d = DumpValsInline->new(); cmpthese( $ARGV[0], { perl => sub { $perl_d->_init_values_perl( $t ) }, inline => sub { $inline_d->_init_values( $t ) } }); Thanks in advance, Shane Corgatelli [EMAIL PROTECTED]