Perl to C++, pass by reference parameters on a method
[email protected] (Nikola Viktorov)
| Newsgroups | perl.xs |
|---|---|
| Message-ID | <CAGuyOpN9q6DbgrKnD5ifJXaNVR_k+mcQ=sE15CC1fgkR+H4mHQ@mail.gmail.com> |
Hi,
I'm working on an application written in C++ which incorporates Apache's
Thrift, PHP, Perl and some other tools.
My problem is that when I call C++ function from Perl (as XS) and pass the
arguments by reference I cannot change their values in the C++ code
so that the changes will persist in the Perl code too.
I would like to illustrate my problem with the following Perl and C++
snippets and the results I get.
*This is the example Perl code I use:*
---- SNIP SNIP ----
sub process {
my ($self, $input, $output) = @_;
my $weight = 80;
print "[PERL] before read() : weight = $weight \n";
$input->read(\$weight);
print "[PERL] after read() : weight = $weight \n";
return 1;
}
---- SNIP SNIP ----
*This is the C++ code:*
---- SNIP SNIP ----
XS(TMultiplexedProtocolRead_read) {
dXSARGS;
{
cout << "[C++] what was received: " << endl;
sv_dump(ST(1));
sv_setref_pv(ST(1), NULL, (void *) 4545);
cout << "[C++] after the new value was set: " << endl;
sv_dump(ST(1));
}
};
---- SNIP SNIP ----
*In some point in the C++ code I have the following:*
---- SNIP SNIP ----
dSP;
ENTER;
SAVETMPS;
PUSHMARK(sp);
XPUSHs(ref_to_obj_protocol_read);
PUTBACK;
call_method("Dispatch::init", G_DISCARD);
FREETMPS;
LEAVE;
---- SNIP SNIP ----
and the Dispatch::init() will call the process() (the code of the process()
you can find in the beginning of this message) .
*What I get after the whole execution is this:*
[PERL] before read() : weight = 80
[C++] what was received:
SV = IV(0x2c21d50) at 0x2c21d58
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x2c46318
SV = PVIV(0x2850b60) at 0x2c46318
REFCNT = 2
FLAGS = (PADMY,IOK,POK,pIOK,pPOK)
IV = 80
PV = 0x2c19a80 "80"\0
CUR = 2
LEN = 8
[C++] after the new value was set:
SV = IV(0x2c21d50) at 0x2c21d58
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x2c17d18
SV = IV(0x2c17d10) at 0x2c17d18
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 4545
[PERL] after read() : weight = 80
What should I do in order to change the $weight's value so that it will
persist in the Perl code after the $input->read(\$weight); is executed ?
Thank you in advance,
Have a nice day!