----- Original Message ----- 
From: "laurentiu rudeanu" <[EMAIL PROTECTED]>
To: <inline@perl.org>
Sent: Thursday, November 16, 2006 9:53 PM
Subject: Re: Inline::C with AUTOWRAP to wrap a C library which uses Perl
tools?(perl.h, XSUB.h, EXTERN.h etc)


>
>    Hi again,
>    In fact I've noticed that even if I don't use AUTOWRAP it still
> crashes. I've inlined a small C function in the pel script which simply
> delegates to the function in the library:
>
> use Inline C => <<'END_OF_C_CODE';
>   void dumpHash2(SV* hash_ref)
>   {
>     dumpHash(hash_ref); // this is the function in the C library
>   }
> END_OF_C_CODE
>
> And it still segfaults in the library, the same as as earlier.
> The C code is copied verbatim from the Cookbook. What's different when
> running inside the library? Maybe some mysterious changes that Inline::C
> does to the inlined C code ?
>

My cwd is:
D:\pscrpt\inline

plib.c (in the cwd) looks like:
--------------
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

          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);
                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;
            }

--------------

My perl header files and libperl58.a are in D:\perl58_M\5.8.8\lib\CORE

I build libplib.a in the cwd by first running:
gcc -o plib.o -c plib.c -ID:\perl58_M\5.8.8\lib\CORE
followed by:
ar rc libplib.a plib.o

try.pl (in the cwd) looks like:
---------------
use Inline C => Config =>
    LIBS =>
'-LD:\pscrpt\inline -lplib -LD:\perl58_M\5.8.8\lib\CORE -lperl58',
    BUILD_NOISY => 1; # see the compilation report

use Inline C => <<'END_OF_C_CODE';
  void dumpHash2(SV* hash_ref)
  {
    dumpHash(hash_ref); // this is the function in the C library
  }

END_OF_C_CODE

            my %hash = (
                        Author => "Brian Ingerson",
                        Nickname => "INGY",
                        Module => "Inline.pm",
                        Version => "0.30",
                        Language => "C",
                       );

            dumpHash2(\%hash);
---------------

I run 'perl try.pl' and get the usual compilation output, followed by:
---------------
Version => 0.30
Nickname => INGY
Language => C
Module => Inline.pm
Author => Brian Ingerson
---------------

No problem :-)

Cheers,
Rob

Reply via email to