@@ -72,9 +72,9 @@ pub unsafe trait InstanceStruct: Sized + 'static {
72
72
let private_offset = data. as_ref ( ) . private_offset ;
73
73
let ptr: * const u8 = self as * const _ as * const u8 ;
74
74
let priv_ptr = ptr. offset ( private_offset) ;
75
- let imp = priv_ptr as * const Option < Self :: Type > ;
75
+ let imp = priv_ptr as * const Self :: Type ;
76
76
77
- ( * imp) . as_ref ( ) . expect ( "No private struct" )
77
+ & * imp
78
78
}
79
79
}
80
80
@@ -377,7 +377,7 @@ unsafe extern "C" fn class_init<T: ObjectSubclass>(
377
377
378
378
// We have to update the private struct offset once the class is actually
379
379
// being initialized.
380
- {
380
+ if mem :: size_of :: < T > ( ) != 0 {
381
381
let mut private_offset = data. as_ref ( ) . private_offset as i32 ;
382
382
gobject_sys:: g_type_class_adjust_private_offset ( klass, & mut private_offset) ;
383
383
( * data. as_mut ( ) ) . private_offset = private_offset as isize ;
@@ -417,26 +417,23 @@ unsafe extern "C" fn instance_init<T: ObjectSubclass>(
417
417
let private_offset = ( * data. as_mut ( ) ) . private_offset ;
418
418
let ptr: * mut u8 = obj as * mut _ as * mut u8 ;
419
419
let priv_ptr = ptr. offset ( private_offset) ;
420
- let imp_storage = priv_ptr as * mut Option < T > ;
420
+ let imp_storage = priv_ptr as * mut T ;
421
421
422
422
let klass = & * ( klass as * const T :: Class ) ;
423
423
424
424
let imp = T :: new_with_class ( klass) ;
425
425
426
- ptr:: write ( imp_storage, Some ( imp) ) ;
426
+ ptr:: write ( imp_storage, imp) ;
427
427
}
428
428
429
429
unsafe extern "C" fn finalize < T : ObjectSubclass > ( obj : * mut gobject_sys:: GObject ) {
430
- // Retrieve the private struct, take it out of its storage and
431
- // drop it for freeing all associated memory.
430
+ // Retrieve the private struct and drop it for freeing all associated memory.
432
431
let mut data = T :: type_data ( ) ;
433
432
let private_offset = ( * data. as_mut ( ) ) . private_offset ;
434
433
let ptr: * mut u8 = obj as * mut _ as * mut u8 ;
435
434
let priv_ptr = ptr. offset ( private_offset) ;
436
- let imp_storage = priv_ptr as * mut Option < T > ;
437
-
438
- let imp = ( * imp_storage) . take ( ) . expect ( "No private struct" ) ;
439
- drop ( imp) ;
435
+ let imp_storage = priv_ptr as * mut T ;
436
+ ptr:: drop_in_place ( imp_storage) ;
440
437
441
438
// Chain up to the parent class' finalize implementation, if any.
442
439
let parent_class = & * ( data. as_ref ( ) . get_parent_class ( ) as * const gobject_sys:: GObjectClass ) ;
@@ -457,6 +454,16 @@ pub fn register_type<T: ObjectSubclass>() -> Type
457
454
where
458
455
<<T as ObjectSubclass >:: ParentType as ObjectType >:: RustClassType : IsSubclassable < T > ,
459
456
{
457
+ // GLib aligns the type private data to two gsizes so we can't safely store any type there that
458
+ // requires a bigger alignment.
459
+ if mem:: align_of :: < T > ( ) > 2 * mem:: size_of :: < usize > ( ) {
460
+ panic ! (
461
+ "Alignment {} of type not supported, bigger than {}" ,
462
+ mem:: align_of:: <T >( ) ,
463
+ 2 * mem:: size_of:: <usize >( ) ,
464
+ ) ;
465
+ }
466
+
460
467
unsafe {
461
468
use std:: ffi:: CString ;
462
469
@@ -494,8 +501,12 @@ where
494
501
495
502
let mut data = T :: type_data ( ) ;
496
503
( * data. as_mut ( ) ) . type_ = type_;
497
- let private_offset =
498
- gobject_sys:: g_type_add_instance_private ( type_. to_glib ( ) , mem:: size_of :: < Option < T > > ( ) ) ;
504
+
505
+ let private_offset = if mem:: size_of :: < T > ( ) == 0 {
506
+ 0
507
+ } else {
508
+ gobject_sys:: g_type_add_instance_private ( type_. to_glib ( ) , mem:: size_of :: < T > ( ) )
509
+ } ;
499
510
( * data. as_mut ( ) ) . private_offset = private_offset as isize ;
500
511
501
512
T :: type_init ( & mut InitializingType :: < T > ( type_, marker:: PhantomData ) ) ;
0 commit comments