Re: Question about accessing global data from a line function

[email protected] (Perf Tech) Wed, 30 Nov 2016 08:32:14 -0600
Newsgroups perl.inline
Message-ID <CAL27a17fhXLtFNVLiZOsYCPJOE2iWd1+GcXbSQ3htThy9JCuQw@mail.gmail.com>
--001a113e00163b3753054285920b
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Yeah, this works! Thanks Vadim!

On Wed, Nov 30, 2016 at 3:18 AM, Konovalov, Vadim <[email protected]=
>
wrote:

> You can access package variables directly:
>
>
>
> $::data =3D "this is a test";
>
> test();
>
>
>
> use Inline C =3D> <<'END_OF_C_CODE';
>
>
>
> void test() {
>
>             printf("here: %s\n", SvPV_nolen(get_sv("::data",0)));
>
> }
>
> END_OF_C_CODE
>
>
>
>
>
> =E2=80=A6see =E2=80=9Cperldoc perlguts=E2=80=9D:
>
>     If you know the name of a scalar variable, you can get a pointer to
> its SV
>
>     by using the following:
>
>
>
>         SV*  get_sv("package::varname", 0);
>
>
>
>     This returns NULL if the variable does not exist.
>
>
>
> You can=E2=80=99t access lexical-scoped scalars (=E2=80=9Cstrict=E2=80=9D=
 ones) this way, because
> they often do not have a name at all.
>
>
>
> You can place reference of your my-var to package variable though and
> dereference it in your C code.
>
>
>
> Regards,
>
> Vadim.
>
>
>
>
>
>
>
> *From:* Perf Tech [mailto:[email protected]]
> *Sent:* Wednesday, November 23, 2016 8:30 AM
> *To:* [email protected]
> *Subject:* Question about accessing global data from a line function
>
>
>
> Dear expert,
>
>
>
>    I am trying to access perl global variable ($data in this case) from
> within a inline C function, but the "data" variable I used is not defined=
.
>
> Any idea how to do it?
>
>
>
> Thanks
>
> Jin
>
>
>
>
>
> $data =3D "this is a test";
>
> test();
>
>
>
> use Inline C =3D> <<'END_OF_C_CODE';
>
>
>
> void test() {
>
>             printf("here: %s\n", SvPV(data, PL_na));
>
> }
>
>
>
> END_OF_C_CODE
>
>
>

--001a113e00163b3753054285920b
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Yeah, this works! Thanks Vadim!</div><div class=3D"gmail_e=
xtra"><br><div class=3D"gmail_quote">On Wed, Nov 30, 2016 at 3:18 AM, Konov=
alov, Vadim <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]=
m" target=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #c=
cc solid;padding-left:1ex">





<div lang=3D"EN-US" link=3D"blue" vlink=3D"purple">
<div class=3D"m_4324760672989566068WordSection1"><span class=3D"">
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">You can access package va=
riables directly:<u></u><u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
</span><p class=3D"MsoNormal"><span style=3D"background:yellow">$::data</sp=
an> =3D &quot;this is a test&quot;;<u></u><u></u></p><span class=3D"">
<p class=3D"MsoNormal">test();<u></u><u></u></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal">use Inline C =3D&gt; &lt;&lt;&#39;END_OF_C_CODE&#39;=
;<u></u><u></u></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
<p class=3D"MsoNormal">void test() {<u></u><u></u></p>
</span><p class=3D"MsoNormal"><span class=3D"m_4324760672989566068gmail-app=
le-tab-span">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 </span>printf(&quot;here: %s\n&quot;, SvPV_nolen(get_sv(&quot;::<spa=
n style=3D"background:yellow">data&quot;,0)</span>)<wbr>);<u></u><u></u></p=
><span class=3D"">
<p class=3D"MsoNormal">}<u></u><u></u></p>
<p class=3D"MsoNormal">END_OF_C_CODE<span style=3D"font-size:11.0pt;font-fa=
mily:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u><u></=
u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">=E2=80=A6see =E2=80=9Cper=
ldoc perlguts=E2=80=9D:<u></u><u></u></span></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;">=C2=A0=C2=A0=C2=A0 If you =
know the name of a scalar variable, you can get a pointer to its SV<u></u><=
u></u></span></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;">=C2=A0=C2=A0=C2=A0 by usin=
g the following:<u></u><u></u></span></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;"><u></u>=C2=A0<u></u></span=
></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0 SV*=C2=A0
<span style=3D"color:black;background:silver">get_sv</span>(&quot;package::=
varname&quot;, 0);<u></u><u></u></span></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;"><u></u>=C2=A0<u></u></span=
></p>
<p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si=
ze:9.0pt;font-family:&quot;Lucida Console&quot;">=C2=A0=C2=A0=C2=A0 This re=
turns NULL if the variable does not exist.<u></u><u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">You can=E2=80=99t access =
lexical-scoped scalars (=E2=80=9Cstrict=E2=80=9D ones) this way, because th=
ey often do not have a name at all.<u></u><u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">You can place reference o=
f your my-var to package variable though and dereference it in your C code.=
<u></u><u></u></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">Regards,<u></u><u></u></s=
pan></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d">Vadim.<u></u><u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:&quot;Ca=
libri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u>=C2=A0<u></u></spa=
n></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:&quot=
;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span style=3D"font-s=
ize:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> Perf Tec=
h [mailto:<a href=3D"mailto:[email protected]" target=3D"_blank">perftech=
[email protected]</a>]
<br>
<b>Sent:</b> Wednesday, November 23, 2016 8:30 AM<br>
<b>To:</b> <a href=3D"mailto:[email protected]" target=3D"_blank">inline@perl=
.org</a><br>
<b>Subject:</b> Question about accessing global data from a line function<u=
></u><u></u></span></p>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</span><div>
<div>
<p class=3D"MsoNormal">Dear expert,<u></u><u></u></p>
</div><div><div class=3D"h5">
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal">=C2=A0 =C2=A0I am trying to access perl global varia=
ble ($data in this case) from within a inline C function, but the &quot;dat=
a&quot; variable I used is not defined.<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal">Any idea how to do it?<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal">Thanks<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal">Jin<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<div>
<p class=3D"MsoNormal"><span style=3D"background:yellow">$data</span> =3D &=
quot;this is a test&quot;;<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal">test();<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal">use Inline C =3D&gt; &lt;&lt;&#39;END_OF_C_CODE&#39;=
;<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal">void test() {<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><span class=3D"m_4324760672989566068gmail-apple-tab-=
span">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </=
span>printf(&quot;here: %s\n&quot;, SvPV(<span style=3D"background:yellow">=
data</span>, PL_na));<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal">}<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
<div>
<p class=3D"MsoNormal">END_OF_C_CODE<u></u><u></u></p>
</div>
<div>
<p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p>
</div>
</div>
</div></div></div>
</div>
</div>

</blockquote></div><br></div>

--001a113e00163b3753054285920b--