in reply to why SvUV() would crop to 32 bits?

Check your C printf format. The %x corresponds to unsigned int, whereas long version %lx is probably indicated.

Replies are listed 'Best First'.
Re^2: why SvUV() would crop to 32 bits?
by dave_the_m (Monsignor) on Jan 03, 2015 at 21:28 UTC
    Or even better, perl provides the UVxf macro, which will be the correct format to print a UV; i.e.
    printf(":: x%"UVxf" to ..."

    Dave.

      yes thanks...spot on. the macro woz working all the way, but just the format cropping let me down. (although I must have missed it with gdb.)

      so...

      printf(":: x%" UVxf " to ...", SvUV($input), $1);
      does the job.

      and here with a code example showing a few ugly ways to cast back pointers to all sorts...:

      %typemap(in) void (* cb)(void *) , void *data , void (cb)(void *){ //if SvGETMAGIC($input) {}; $1 = INT2PTR($1_ltype, SvUV($input)); printf(":: x%" UVxf " to x%lx\n", SvUV($input), $1); { int ret = SWIG_ConvertFunctionPtr($input, (void**)(& $1), 0); printf(":: to x%lx\n", $1); } if(SvGMAGICAL($input)) mg_get($input); $1 = DPTR2FPTR($1_ltype, SvUV($input)); printf("::DPTR2FPTR x%lx to x%lx\n", SvIV($input), $1); }
      bot::add_idle_callback x7fc3ff9bc040 , x0 :: x7fc3ff9bc040 to x7fc3ff9bc040 :: to x7fc3ff9bc040 ::DPTR2FPTR x7fc3ff9bc040 to x7fc3ff9bc040 :: x0 to x0 :: to x0 ::DPTR2FPTR x0 to x0 ::in c add_idle_callback xff9bc040 , x0

        Tip:

        You can replace

        if(SvGMAGICAL($input)) mg_get($input);
        with
        SvGETMAGIC($input);

        (Just spotted that in a cursory glance. Didn't look at the rest.)