Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: How get PV address?

by xiaoyafeng (Deacon)
on Aug 05, 2019 at 10:38 UTC ( [id://11103922]=note: print w/replies, xml ) Need Help??


in reply to Re: How get PV address?
in thread How get PV address?

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.

Replies are listed 'Best First'.
Re^3: How get PV address?
by dave_the_m (Monsignor) on Aug 05, 2019 at 14:51 UTC
    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

        You are using a typemap to create an SV to return to perl. That SV is being assigned an integer value. The only types of integer values that SVs can have are IVs and UVs. Hence a plain integer gets upgraded to an IV/UV before being assigned to the SV.

        Dave.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (3)
As of 2024-04-24 19:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found