| 42 static SV * |
42 static SV * |
| 43 create_sv_ptr(void *object) |
43 create_sv_ptr(void *object) |
| 44 { |
44 { |
| 45 SV *sv; |
45 SV *sv; |
| 46 |
46 |
| 47 sv = newSViv((IV)object); |
47 PURPLE_STATIC_ASSERT(sizeof(IV) >= sizeof(void *), |
| |
48 sv_can_not_hold_a_pointer); |
| |
49 |
| |
50 sv = newSViv((IV)(gintptr)object); |
| 48 |
51 |
| 49 sv_magic(sv, NULL, '~', NULL, 0); |
52 sv_magic(sv, NULL, '~', NULL, 0); |
| 50 |
53 |
| 51 SvMAGIC(sv)->mg_private = 0x1551; /* HF */ |
54 SvMAGIC(sv)->mg_private = 0x1551; /* HF */ |
| 52 SvMAGIC(sv)->mg_virtual = &vtbl_free_object; |
55 SvMAGIC(sv)->mg_virtual = &vtbl_free_object; |
| 381 |
384 |
| 382 void * |
385 void * |
| 383 purple_perl_data_from_sv(GType type, SV *sv) |
386 purple_perl_data_from_sv(GType type, SV *sv) |
| 384 { |
387 { |
| 385 switch (type) { |
388 switch (type) { |
| 386 case G_TYPE_BOOLEAN: return (void *)SvIV(sv); |
389 case G_TYPE_BOOLEAN: return (void *)(gintptr)SvIV(sv); |
| 387 case G_TYPE_INT: return (void *)SvIV(sv); |
390 case G_TYPE_INT: return (void *)(gintptr)SvIV(sv); |
| 388 case G_TYPE_UINT: return (void *)SvUV(sv); |
391 case G_TYPE_UINT: return (void *)(gintptr)SvUV(sv); |
| 389 case G_TYPE_LONG: return (void *)SvIV(sv); |
392 case G_TYPE_LONG: return (void *)(gintptr)SvIV(sv); |
| 390 case G_TYPE_ULONG: return (void *)SvUV(sv); |
393 case G_TYPE_ULONG: return (void *)(gintptr)SvUV(sv); |
| 391 case G_TYPE_INT64: return (void *)SvIV(sv); |
394 case G_TYPE_INT64: return (void *)(gintptr)SvIV(sv); |
| 392 case G_TYPE_UINT64: return (void *)SvUV(sv); |
395 case G_TYPE_UINT64: return (void *)(gintptr)SvUV(sv); |
| 393 case G_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
396 case G_TYPE_STRING: return g_strdup(SvPVutf8_nolen(sv)); |
| 394 case G_TYPE_POINTER: return (void *)SvIV(sv); |
397 case G_TYPE_POINTER: return (void *)(gintptr)SvIV(sv); |
| 395 } |
398 } |
| 396 |
399 |
| 397 return NULL; |
400 return NULL; |
| 398 } |
401 } |
| 399 |
402 |