@@ -23,18 +23,22 @@ impl<T: TransparentPtrType> SList<T> {
23
23
#[ inline]
24
24
pub unsafe fn from_glib_none ( list : * const ffi:: GSList ) -> SList < T > {
25
25
// Need to copy the whole list
26
- unsafe extern "C" fn copy_item < T : TransparentPtrType > (
27
- ptr : ffi:: gconstpointer ,
28
- _user_data : ffi:: gpointer ,
29
- ) -> ffi:: gpointer {
30
- let mut item =
31
- mem:: ManuallyDrop :: new ( ( * ( & ptr as * const ffi:: gconstpointer as * const T ) ) . clone ( ) ) ;
32
-
33
- * ( & mut * item as * mut T as * mut * mut T :: GlibType ) as ffi:: gpointer
34
- }
26
+ let list = if mem:: needs_drop :: < T > ( ) {
27
+ unsafe extern "C" fn copy_item < T : TransparentPtrType > (
28
+ ptr : ffi:: gconstpointer ,
29
+ _user_data : ffi:: gpointer ,
30
+ ) -> ffi:: gpointer {
31
+ let mut item = mem:: ManuallyDrop :: new (
32
+ ( * ( & ptr as * const ffi:: gconstpointer as * const T ) ) . clone ( ) ,
33
+ ) ;
34
+
35
+ * ( & mut * item as * mut T as * mut * mut T :: GlibType ) as ffi:: gpointer
36
+ }
35
37
36
- let list =
37
- ffi:: g_slist_copy_deep ( mut_override ( list) , Some ( copy_item :: < T > ) , ptr:: null_mut ( ) ) ;
38
+ ffi:: g_slist_copy_deep ( mut_override ( list) , Some ( copy_item :: < T > ) , ptr:: null_mut ( ) )
39
+ } else {
40
+ ffi:: g_slist_copy ( mut_override ( list) )
41
+ } ;
38
42
39
43
SList {
40
44
ptr : ptr:: NonNull :: new ( list) ,
@@ -47,15 +51,17 @@ impl<T: TransparentPtrType> SList<T> {
47
51
#[ inline]
48
52
pub unsafe fn from_glib_container ( list : * mut ffi:: GSList ) -> SList < T > {
49
53
// Need to copy all items as we only own the container
50
- unsafe extern "C" fn copy_item < T : TransparentPtrType > (
51
- ptr : ffi:: gpointer ,
52
- _user_data : ffi:: gpointer ,
53
- ) {
54
- let item = ( * ( & ptr as * const ffi:: gpointer as * const T ) ) . clone ( ) ;
55
- ptr:: write ( ptr as * mut T , item) ;
56
- }
54
+ if mem:: needs_drop :: < T > ( ) {
55
+ unsafe extern "C" fn copy_item < T : TransparentPtrType > (
56
+ ptr : ffi:: gpointer ,
57
+ _user_data : ffi:: gpointer ,
58
+ ) {
59
+ let item = ( * ( & ptr as * const ffi:: gpointer as * const T ) ) . clone ( ) ;
60
+ ptr:: write ( ptr as * mut T , item) ;
61
+ }
57
62
58
- ffi:: g_slist_foreach ( list, Some ( copy_item :: < T > ) , ptr:: null_mut ( ) ) ;
63
+ ffi:: g_slist_foreach ( list, Some ( copy_item :: < T > ) , ptr:: null_mut ( ) ) ;
64
+ }
59
65
60
66
SList {
61
67
ptr : ptr:: NonNull :: new ( list) ,
@@ -388,11 +394,15 @@ impl<T: TransparentPtrType> Drop for SList<T> {
388
394
fn drop ( & mut self ) {
389
395
if let Some ( ptr) = self . ptr {
390
396
unsafe {
391
- unsafe extern "C" fn drop_item < T : TransparentPtrType > ( mut ptr : ffi:: gpointer ) {
392
- ptr:: drop_in_place ( & mut ptr as * mut ffi:: gpointer as * mut T ) ;
393
- }
397
+ if mem:: needs_drop :: < T > ( ) {
398
+ unsafe extern "C" fn drop_item < T : TransparentPtrType > ( mut ptr : ffi:: gpointer ) {
399
+ ptr:: drop_in_place ( & mut ptr as * mut ffi:: gpointer as * mut T ) ;
400
+ }
394
401
395
- ffi:: g_slist_free_full ( ptr. as_ptr ( ) , Some ( drop_item :: < T > ) ) ;
402
+ ffi:: g_slist_free_full ( ptr. as_ptr ( ) , Some ( drop_item :: < T > ) ) ;
403
+ } else {
404
+ ffi:: g_slist_free ( ptr. as_ptr ( ) ) ;
405
+ }
396
406
}
397
407
}
398
408
}
0 commit comments