Hi all, I've encountered some problems and I'm wondering if it's ok to do what I'm trying to do: can I use Inline::C with the AUTOWRAP option to call a C library whose functions take variables of Perl types? (the same way it would use them if the code were inlined in the perl script) I mean SV*, HV* etc - the ones in libperl and declared in perl.h, EXTERN.h etc. I've had no errors with compiling and building, at run time I can even call some functions that use scalar types (SV*) to receive an "int" as argument but if I'm passing a hash reference a segfault happens when trying to iterate through the keys in the hash. My idea was to be able to pass hashes and other complex types from perl to C. So I have a test function in the C library which takes a hash reference as a SV*, then converts that to a HV* and starts iterating through it (it's taken from the examples in the C CookBook):
----------------- void dumpHash(SV* hash_ref) { HV* hash; HE* hash_entry; int num_keys, i; SV* sv_key; SV* sv_val; if (! SvROK(hash_ref)) croak("hash_ref is not a reference"); hash = (HV*)SvRV(hash_ref); num_keys = hv_iterinit(hash); // <<<<<<<---- segfaults here 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); printf("%s => %s\n", SvPV(sv_key, PL_na), SvPV(sv_val, PL_na)); } return; } ----------------- Then I call the function from a perl script which uses Inline like that: (the C library "libcperlbindings.a" is built under cstuff/ directory) ----------------- #!/usr/bin/perl package CBindings; use Inline C => Config => ENABLE => AUTOWRAP => LIBS => '-L/root/aaa/perl_inline/cstuff/.libs/ -lcperlbindings', INC => '-I/root/aaa/perl_inline/cstuff/'; use Inline C => q{ void dumpHash(SV*); }; package main; my %hash = ( Author => "Brian Ingerson", Nickname => "INGY", Module => "Inline.pm", Version => "0.30", Language => "C", ); CBindings::dumpHash(\$hash); # <<<<<<----- segfaults here -------------------- When running this it gets a segfault and using a debugger I've noticed that the call that crashes is the one on the line with "num_keys = hv_iterinit(hash);" (marked in the source code too) Can anyone see the problem? Isn't this supposed to work with AUTOWRAP ? Or am I doing it the wrong way? It can iterate just fine if I inline the C function in the Perl script (without AUTOWRAP). Any help is greately apreciated, thanks! Laurentiu -- -- http://www.fastmail.fm - Access all of your messages and folders wherever you are