Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: How get PV address?

by dave_the_m (Monsignor)
on Aug 05, 2019 at 09:56 UTC ( [id://11103921]=note: print w/replies, xml ) Need Help??


in reply to How get PV address?

In XS code, SvPVX(sv) is correct if you're sure that sv is a valid PV value; otherwise one of the SvPV() or SvPV_force() functions/macros would be more appropriate. You're seeing a truncated version of the SvPVX() value because you're coercing it to an integer. You should be returning a suitable pointer type instead, or using an integer type like UV, which is large enough to hold a pointer.

Dave.

Replies are listed 'Best First'.
Re^2: How get PV address?
by xiaoyafeng (Deacon) on Aug 05, 2019 at 10:38 UTC
    I use SvPVX is for test, since I know PV is hello world.:) The issue is I checked typemap,,in there,unsigned int int will convert to T_UV, so I don't think UV could hold this PV address. But If I change return type to char*, typemap will convert it to SV by sv_setpv.
      Well it all depends on what you want to do with the address. Are you passing it back to perl? Should perl see it as a (suitably large) integer value - i.e. the XS code returns an SVIV? What will perl do with the address?

      Dave.

        Thanks, I set return type to UV, it works and I can call it back and forth in C:

        use strict; use warnings; use Devel::Peek; my $dd = "hello world\n"; Dump $dd; my $ee = cc($dd); printf("the dd string address is %x \n", cc($dd)); dd($ee); use Inline Config => BUILD_NOISY => 1, CLEAN_AFTER_BUILD => 0; use Inline 'C' => <<'CODE'; int dd(UV x){ printf("string is %s \n", (char*)x); return 0; } UV cc(SV* a){ return SvPVX(a); } CODE ###############output########### andy@andyhome:~/one-off$ perl abe.pl SV = PV(0x56386170b050) at 0x56386172f008 REFCNT = 1 FLAGS = (POK,IsCOW,pPOK) PV = 0x5638617addf0 "hello world\n"\0 CUR = 12 LEN = 14 COW_REFCNT = 1 the dd string address is 5638617addf0 string is hello world

        I pass it back to perl, But I got little confused: in typemap, both unsigned int and UV refer to T_UV and in OUTPUT it does convert to UV:

        int T_IV unsigned T_UV unsigned int T_UV UV T_UV T_UV sv_setuv($arg, (UV)$var);
        why seems perl neglect typemap file but use config?
        Platform: osname=linux osvers=4.15.0-52-generic archname=x86_64-linux uname='linux andyhome 4.15.0-52-generic #56-ubuntu smp tue jun 4 2 +2:49:08 utc 2019 x86_64 x86_64 x86_64 gnulinux ' config_args='-de -Dprefix=/home/andy/perl5/perlbrew/perls/perl-5.3 +0.0 -Aeval:scriptdir=/home/andy/perl5/perlbrew/perls/perl-5.30.0/bin' hint=recommended useposix=true d_sigaction=define useithreads=undef usemultiplicity=undef use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cc' ccflags ='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-str +ong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' optimize='-O2' cppflags='-fwrapv -fno-strict-aliasing -pipe -fstack-protector-str +ong -I/usr/local/include' ccversion='' gccversion='7.4.0' gccosandvers='' intsize=4 longsize=8 ptrsize=8 doublesize=8 byteorder=12345678
        Please enlighten me.




        I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11103921]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (3)
As of 2024-04-24 22:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found