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!
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.