@@ -164,6 +164,8 @@ fn log2_align_of<T>() -> u8 {
164
164
/// before registering it.
165
165
#[ derive( Debug ) ]
166
166
pub struct ClassBuilder {
167
+ // Note: Don't ever construct a &mut Class, since it is possible to get
168
+ // this pointer using `Class::classes`!
167
169
cls : NonNull < Class > ,
168
170
}
169
171
@@ -452,8 +454,31 @@ impl ProtocolBuilder {
452
454
453
455
#[ cfg( test) ]
454
456
mod tests {
457
+ use super :: * ;
455
458
use crate :: test_utils;
456
459
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
+
457
482
#[ test]
458
483
fn test_custom_class ( ) {
459
484
// Registering the custom class is in test_utils
@@ -463,6 +488,29 @@ mod tests {
463
488
assert_eq ! ( result, 13 ) ;
464
489
}
465
490
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
+
466
514
#[ test]
467
515
fn test_class_method ( ) {
468
516
let cls = test_utils:: custom_class ( ) ;
0 commit comments