libpurple/plugins/perl/perl-common.c

changeset 35965
65d585472765
parent 35812
48c6ee645ca1
child 36002
31a8779e91d4
equal deleted inserted replaced
35964:3ed06e9d1a86 35965:65d585472765
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
578 581
579 case G_TYPE_POINTER: 582 case G_TYPE_POINTER:
580 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL) 583 if ((*copy_arg = (void *)va_arg(*args, void *)) == NULL)
581 return &PL_sv_undef; 584 return &PL_sv_undef;
582 585
583 return newSViv((IV)*copy_arg); 586 return newSViv((IV)(gintptr)*copy_arg);
584 587
585 default: 588 default:
586 if ((*copy_arg = va_arg(*args, void *)) == NULL) 589 if ((*copy_arg = va_arg(*args, void *)) == NULL)
587 return &PL_sv_undef; 590 return &PL_sv_undef;
588 591

mercurial