@@ -164,6 +164,8 @@ fn log2_align_of<T>() -> u8 {
164164/// before registering it.
165165#[ derive( Debug ) ]
166166pub struct ClassBuilder {
167+ // Note: Don't ever construct a &mut Class, since it is possible to get
168+ // this pointer using `Class::classes`!
167169 cls : NonNull < Class > ,
168170}
169171
@@ -452,8 +454,31 @@ impl ProtocolBuilder {
452454
453455#[ cfg( test) ]
454456mod tests {
457+ use super :: * ;
455458 use crate :: test_utils;
456459
460+ #[ test]
461+ fn test_classbuilder_duplicate ( ) {
462+ let cls = test_utils:: custom_class ( ) ;
463+ let builder = ClassBuilder :: new ( "TestClassBuilderDuplicate" , cls) . unwrap ( ) ;
464+ let _ = builder. register ( ) ;
465+
466+ assert ! ( ClassBuilder :: new( "TestClassBuilderDuplicate" , cls) . is_none( ) ) ;
467+ }
468+
469+ #[ test]
470+ #[ cfg_attr(
471+ feature = "gnustep-1-7" ,
472+ ignore = "Dropping ClassBuilder has weird threading side effects on GNUStep"
473+ ) ]
474+ fn test_classbuilder_drop ( ) {
475+ let cls = test_utils:: custom_class ( ) ;
476+ let builder = ClassBuilder :: new ( "TestClassBuilderDrop" , cls) . unwrap ( ) ;
477+ drop ( builder) ;
478+ // After we dropped the class, we can create a new one with the same name:
479+ let _builder = ClassBuilder :: new ( "TestClassBuilderDrop" , cls) . unwrap ( ) ;
480+ }
481+
457482 #[ test]
458483 fn test_custom_class ( ) {
459484 // Registering the custom class is in test_utils
@@ -463,6 +488,29 @@ mod tests {
463488 assert_eq ! ( result, 13 ) ;
464489 }
465490
491+ #[ test]
492+ #[ cfg( feature = "malloc" ) ]
493+ fn test_in_all_classes ( ) {
494+ fn assert_is_present ( cls : * const Class ) {
495+ // Check that the class is present in Class::classes()
496+ assert ! ( Class :: classes( )
497+ . into_iter( )
498+ . find( |& item| ptr:: eq( cls, * item) )
499+ . is_some( ) ) ;
500+ }
501+
502+ let superclass = test_utils:: custom_class ( ) ;
503+ let builder = ClassBuilder :: new ( "TestFetchWhileCreatingClass" , superclass) . unwrap ( ) ;
504+
505+ if cfg ! ( feature = "apple" ) {
506+ // It is IMO a bug in Apple's runtime that it is present here
507+ assert_is_present ( builder. cls . as_ptr ( ) ) ;
508+ }
509+
510+ let cls = builder. register ( ) ;
511+ assert_is_present ( cls) ;
512+ }
513+
466514 #[ test]
467515 fn test_class_method ( ) {
468516 let cls = test_utils:: custom_class ( ) ;
0 commit comments