in reply to Re^3: Perl calls C calls Perl CallBack: How Perl callback use the same interpreter/context as Perl caller?
in thread Perl calls C calls Perl CallBack: How Perl callback use the same interpreter/context as Perl caller?

Hi,

Is there a Perl syntax for getting interpreter pointer?

Making my_perl global will require a new compilation of the Perl LIB (perl514.lib).


Thanks,

Itamar

  • Comment on Re^4: Perl calls C calls Perl CallBack: How Perl callback use the same interpreter/context as Perl caller?

Replies are listed 'Best First'.
Re^5: Perl calls C calls Perl CallBack: How Perl callback use the same interpreter/context as Perl caller?
by salva (Canon) on Jul 08, 2014 at 11:21 UTC
    Is there a Perl syntax for getting interpreter pointer?

    You can pass it around from XS to C using the pTHX and aTHX (and pTHX_ and pTHX_) macros. Another option is to retrieve the current Perl interpreter calling Perl_get_context(). It is more or less explained on perlguts.

    Also, search CPAN for code containing call_sv and see how others have done it!

      Hi,

      Perl_get_context() is returning NULL.

      That leaves me with passing Perl interpreter pointer directly from Perl to C and then use it when calling the Perl callback, right?

      Can you please give a hint of how should it be done?


      Many thanks,

      Itamar

        You can find and example in the C function custom_cmp from the Sort::Packed module (https://metacpan.org/source/SALVA/Sort-Packed-0.08/Packed.xs).

        But passing the context around is done as an optimization in order to avoid calling Perl_get_context() repeatly. And it is not required unless the macro PERL_NO_GET_CONTEXT is defined. So, you are probably doing something on the wrong way.

        The first thing that chokes me is that if you start from the Perl side, you shouldn't be calling perl_alloc at all.

        Try remove any interpreter setup from your code, and calling some Perl function from the C side. It should just work.

Re^5: Perl calls C calls Perl CallBack: How Perl callback use the same interpreter/context as Perl caller?
by Corion (Patriarch) on Jul 08, 2014 at 11:39 UTC

    I thought that my_perl was a variable in your C code, but I now realize that your C code gets called from Perl. I don't find a convenient way in perlguts, perlapi or perlcall, but maybe you don't even need special things like passing the Perl interpreter around as the current Perl interpreter already is a global variable.