Steve
2006-05-25 19:08:37 UTC
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.
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"
===========================================================================
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.
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"
===========================================================================