Steve <[EMAIL PROTECTED]> writes: >Hullo, > >I'm calling code in a perl module from C. The problem is that since I'm >loading the module via load_module() my Carp calls all break -- >apparently because there's no caller to reference back to.
If you are geting errors in the call_method() I think adding G_EVAL will provide _a_ level for caller to find. If it is the load_module() itself that is croaking then it is more tricky. > >I'd appreciate any suggestions or insight into this. > >= My C ============================================================= > > #include <EXTERN.h> > #include <perl.h> > > static PerlInterpreter *my_perl; > > EXTERN_C void xs_init(pTHX); > > int > main(int argc, char **argv, char **env) > { > > char *my_argv[] = { "", "/dev/null" }; > int count; > SV *ex; /* the object */ > > char buf[] = "some arbitrary data"; > int bufsiz; > > PERL_SYS_INIT3(&argc, &argv, &env); > my_perl = perl_alloc(); > perl_construct(my_perl); > > > /* parse the "file" */ > perl_parse(my_perl, xs_init, 2, my_argv, (char **) NULL); > > PL_exit_flags |= PERL_EXIT_DESTRUCT_END; > perl_run(my_perl); > > > dSP; > > /* Load the module */ > load_module(PERL_LOADMOD_NOIMPORT, newSVpvn("Ex", 2), >newSVnv(0.01)); > > ENTER; >/**************************************************************/ > SAVETMPS; > > /* instantiate an object */ > PUSHMARK(SP); > XPUSHs(sv_2mortal(newSVpvn("Ex", 2))); > PUTBACK; > count = call_method("new", G_SCALAR); > SPAGAIN; > if (count != 1) > croak("Something weird with Ex::new()\n"); > ex = POPs; > > /* call a method */ > bufsiz = strlen(buf); /* just an example, after all */ > PUSHMARK(SP); > XPUSHs(ex); > XPUSHs(sv_2mortal(newSVpvn(buf, bufsiz))); > XPUSHs(sv_2mortal(newSViv(bufsiz))); > PUTBACK; > count = call_method("do_something", G_SCALAR); > SPAGAIN; > if (count != 1) > croak("Something weird with $ex->do_something()\n"); > > FREETMPS; > LEAVE; >/**************************************************************/ > > > perl_destruct(my_perl); > perl_free(my_perl); > PERL_SYS_TERM(); > > } > >= My Perl module ===================================================== > > package Ex; > use warnings; > use strict; > use Data::Dumper; > use Carp; > > our $VERSION = '0.01'; > > sub new { > my $class = shift; > my %args = @_; > my $self = \%args; > bless $self, $class; > return $self; > } > > sub do_something { > my $self = shift; > > warn qq(\n"caller()"\n) . Dumper( [ caller() ] ) . "\n"; > warn qq("warn"ing); > carp qq("carp"ing); > print qq(you gave me "$_[0]"\n); > > return; > } > > 1; > >= the Output ========================================================= > > "caller()" > $VAR1 = [ > 'main', > '/dev/null', > 0 > ]; > > "warn"ing at lib/Ex.pm line 21. > "carp"ing at /dev/null line 0 > you gave me "some arbitrary data" > >===========================================================================