in reply to SvPV Segmentation Fault

Different platform, version and build environment, but it confirms that SvPV_nolen() should do what you think it should do:

#! perl -slw use strict; use Inline C => Config => BUILD_NOISY => 1; use Inline C => <<'END_C', NAME => '_967160', CLEAN_AFTER_BUILD => 0; void foo( SV *sv ) { if( sv ) printf( "%s\n", SvPV_nolen( sv ) ); return; } END_C foo( 'fred' ); foo( 1 ); __END__ C:\test>967160 validate Stage get_maps Stage Writing Makefile for _967160 Microsoft (R) Program Maintenance Utility Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. C:\Perl64\bin\perl.exe C:\Perl64\lib\ExtUtils\xsubpp -typ cl -c -I"C:/test" -nologo -GF -W3 -MD -Zi -Ox -GL -fp:pr _967160.c Running Mkbootstrap for _967160 () C:\Perl64\bin\perl.exe -MExtUtils::Command -e chmod -- 644 C:\Perl64\bin\perl.exe -MExtUtils::Mksymlists -e "Mksymli link -out:blib\arch\auto\_967160\_967160.dll -dll -nologo Creating library blib\arch\auto\_967160\_967160.lib and object Generating code Finished generating code if exist blib\arch\auto\_967160\_967160.dll.manifest mt -n if exist blib\arch\auto\_967160\_967160.dll.manifest del b C:\Perl64\bin\perl.exe -MExtUtils::Command -e chmod -- 755 C:\Perl64\bin\perl.exe -MExtUtils::Command -e cp -- _96716 C:\Perl64\bin\perl.exe -MExtUtils::Command -e chmod -- 644 Microsoft (R) Program Maintenance Utility Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. Files found in blib\arch: installing files in blib\lib into archit Installing C:\test\_Inline\lib\auto\_967160\_967160.dll Installing C:\test\_Inline\lib\auto\_967160\_967160.exp Installing C:\test\_Inline\lib\auto\_967160\_967160.lib Installing C:\test\_Inline\lib\auto\_967160\_967160.pdb fred 1 C:\test>967160 fred 1

It also works here on 5.14.2:

Which leaves platform and build environment to isolate, with the latter the most likely the problem I think. Perhaps you could show your build process console log?


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

The start of some sanity?

Replies are listed 'Best First'.
Re^2: SvPV Segmentation Fault
by adler187 (Initiate) on Apr 25, 2012 at 21:19 UTC

    Ok, that worked:

    ./svpv.pl Starting Build Preprocess Stage + + + Finished Build Preprocess Stage + + + + + + Starting Build Parse Stage Finished Build Parse Stage Starting Build Glue 1 Stage Finished Build Glue 1 Stage Starting Build Glue 2 Stage Finished Build Glue 2 Stage Starting Build Glue 3 Stage Finished Build Glue 3 Stage Starting Build Compile Stage Starting "perl Makefile.PL" Stage Writing Makefile for _967160 Writing MYMETA.yml Finished "perl Makefile.PL" Stage Starting "make" Stage /usr/bin/perl /usr/lib/perl5/5.14.2/ExtUtils/xsubpp -typemap /usr/lib +/perl5/5.14.2/ExtUtils/typemap _967160.xs > _967160.xsc && mv _9671 +60.xsc _967160.c cc -c -I/home/kadler -D_REENTRANT -D_GNU_SOURCE -DPERL_USE_SAFE_PUTEN +V -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D +_FILE_OFFSET_BITS=64 -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 + -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -W +all -pipe -DVERSION=\"0.00\" -DXS_VERSION=\"0.00\" -fPIC "-I/usr/li +b/perl5/5.14.2/x86_64-linux-thread-multi/CORE" _967160.c Running Mkbootstrap for _967160 () chmod 644 _967160.bs rm -f blib/arch/auto/_967160/_967160.so cc -shared -L/usr/local/lib64 -fstack-protector _967160.o -o blib/ar +ch/auto/_967160/_967160.so \ \ chmod 755 blib/arch/auto/_967160/_967160.so cp _967160.bs blib/arch/auto/_967160/_967160.bs chmod 644 blib/arch/auto/_967160/_967160.bs Finished "make" Stage Starting "make install" Stage Files found in blib/arch: installing files in blib/lib into architectu +re dependent library tree Installing /home/kadler/_Inline/lib/auto/_967160/_967160.bs Installing /home/kadler/_Inline/lib/auto/_967160/_967160.so Finished "make install" Stage Starting Cleaning Up Stage Finished Cleaning Up Stage Finished Build Compile Stage fred 1

    But, I wasn't actually using Inline::C. Just using that as an example of using SvPV and SvPV_nolen to build my XS module. There must be something wrong with building my XS module, then.

    I've been using perlxstut as a basis, specifically examples #4 and #5.

    Here's mylib.c:
    #include <stdlib.h> #include "mylib.h" PerlInterpreter *my_perl; void foo(SV * sv) { if(sv) { printf("%s\n", SvPV_nolen(sv)); } } void bar(SV * sv) { printf ("%i\n", SvPOK(sv)); }
    Here's mylib.h:
    #include "EXTERN.h" #include "perl.h" #define TESTVAL 4 void foo(SV * sv); void bar(SV * sv);
    Here's Mytest2.xs:
    #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "mylib/mylib.h" #include "const-c.inc" MODULE = Mytest2 PACKAGE = Mytest2 INCLUDE: const-xs.inc void foo(SV * sv) void bar(SV * sv)
    Everything else should be exactly as in perlxstut.
      PerlInterpreter *my_perl
      That's very wrong. I don't know why you've put that there. You need to either pass the my_perl arg to the foo/bar functions using aTHX_/pTHX, or (less efficiently), retrieve it locally using dTHX.

      Dave.

        Hmm, was wondering about that. Initially I did not have the declaration, but then I got an error about 'my_perl' undeclared. I found some code online (that I didn't read thoroughly, I see) and declared the variable.

        Apparently, that is not enough. Any good examples/tutorials on how to do this?

        Or perhaps I'm taking the wrong approach here and there is a better way. Here's what I'm trying to do. I'm trying to write a function in C that can be called from perl that takes as input, basically argc and argv. It seems you can't actually pass an array of char * from perl, you need to handle an AV *. I'd like to keep all this code in the external library, instead of writing it in the XS file, but maybe I'm just making it harder for myself that way.

      I'd start by looking for differences in the generated C files between the Inline::C and XS versions. Also, a comparison of the respective makefile.pl's might shed some light.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      The start of some sanity?