C++ calling perl script - Not able to get the stack arguments pushedrom XPUSH in perl script

Y

Yogi

I have the below sample program which pushes the arguments to Perl stack and then calls "eval_sv". The sample perl statements get executed but i'm notable to retrieve the variables passed from C++ as Perl arguments. Please let me know what i am missing in the below program

Output of the program

Hello World

Test

100Testing complete

This line doesn't print the value of $a and $b

string three = "print 'Test\n'; my $z = 100; print $a; print $b; print $z;";

Here is my code:

#include <EXTERN.h>
#include <perl.h>
#include <string>
using namespace std;

string perlScript;

static PerlInterpreter *my_perl;

SV* my_eval_sv(I32 croak_on_error)
{
STRLEN n_a;
char *p1 = new char [perlScript.size()+1];
strcpy(p1, perlScript.c_str());
const char *p = p1;
int len = strlen(p);

dSP;
ENTER ;
SAVETMPS ;
PUSHMARK(SP) ;


int a, b;
a = 10;
b = 20;

PERL_SET_CONTEXT(my_perl);
XPUSHs(sv_2mortal(newSViv(a)));
PERL_SET_CONTEXT(my_perl);
XPUSHs(sv_2mortal(newSViv(b)));


/* Done with pushing pointers to Perl stack */

PUTBACK;

SV* sv1 = newSVpv(p, 0);
eval_sv(sv1, G_EVAL | G_KEEPERR);
SvREFCNT_dec(sv1);

SPAGAIN;
sv1 = POPs;
PUTBACK;

FREETMPS;
LEAVE;

if (croak_on_error && SvTRUE(ERRSV))
croak(SvPVx(ERRSV, n_a));
}

main (int argc, char **argv, char **env)
{
char *embedding[] = { "", "-e", "0" };
PERL_SYS_INIT3(&argc,&argv,&env);
my_perl = perl_alloc();
perl_construct(my_perl);
perl_parse(my_perl, NULL, 3, embedding, NULL);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;

/*string perlBeginScript;
static const char * perlEndScript = "\
\n\
}\n\
";

if(perlBeginScript.length()==0)
{
perlBeginScript="EmbeddedPerl";
}

perlScript = "sub ";
perlScript += perlBeginScript;
perlScript += "{\n"; */

string one = "print 'Hello World\n'; ";
string two = "my $a = shift; my $b = shift; ";
string three= "print 'Test\n'; my $z = 100; print $a; print $b; print $z;";
string four = "print 'Testing complete\n';";

perlScript += one ;
perlScript += two;
perlScript += three;
perlScript += four;

//perlScript += perlEndScript;

/* Done with perl script to be executed */
my_eval_sv(TRUE);
PL_perl_destruct_level = 1;
perl_destruct(my_perl);
perl_free(my_perl);
PERL_SYS_TERM();
}
 
P

Peter Makholm

Yogi said:
I have the below sample program which pushes the arguments to Perl
stack and then calls "eval_sv".

Just tried to make some guesses at your identical StackOverflow
question.

http://stackoverflow.com/questions/...l-sv-not-passing-arguments-to-script/12405016

The gist is that that you try to pass values by passing them on the Perl
stack, but this is only relevant if you are asking Perl the call a perl
subroutine.

Your code is roughly comparable to a script doing:

#!/usr/bin/perl

@_ = (10, 20);

eval 'my $a = shift; my $b = shift; my $z = 100; print $a; print $b; print $z;'

__END__

A bit simplified. @_ is really not the stack, but calling a subroutine
moves stuff from the stack into @_.

//Makholm
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,040
Latest member
papereejit

Latest Threads

Top