I run perl on a 64bit machine. I try callbacks of death,
and pass some pointer to functions from (C to) perl back to C (using swig)....
but the swig SvIV()/SvUV()/SvRV() seems to force it back to 32 bits.
how annoying. are there any tricks I miss?
in perl
sub add_idle_callback($$)
{
printf("\nadd_idle_callback x%x , x%x \n", @_);
&idle_callback_run(@_); # calls
}
in .swg
%typemap(in) void (* cb)(void *) {
$1 = INT2PTR($1_ltype, SvUV($input));
printf(":: x%x to x%x\n", (unsigned long long)SvUV($input), $1);
if(SvGMAGICAL($input)) mg_get($input);
$1 = DPTR2FPTR($1_ltype, SvUV($input));
printf("::DPTR2FPTR x%x to x%x\n", SvIV($input), $1);
}
log
...
add_idle_callback x7ffb339f8040 , x0 <==== here in perl the pointer
+ to function is 64bits
...
<=========== but then swig- SvUV() or SvIV() cast it to 32 bits
:: x339f8040 to x339f8040
::DPTR2FPTR x339f8040 to x339f8040
....
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.