@@ -44,41 +44,62 @@ static void Firebase_setDelegate(id self, SEL _cmd, id<UIApplicationDelegate> de
44
44
class_getName (new_class));
45
45
} else {
46
46
NSLog (@" Firebase: UIApplication setDelegate: called with nil delegate (Swizzled)" );
47
+ // If delegate is nil, new_class remains nil.
48
+ // The original implementation will be called later.
49
+ // No class processing or block execution needed.
47
50
}
48
51
49
52
if (new_class) {
50
- bool already_seen = false ;
51
- for (int i = 0 ; i < g_seen_delegate_classes_count; i++) {
52
- if (g_seen_delegate_classes[i] == new_class) {
53
- already_seen = true ;
54
- break ;
53
+ // 1. Superclass Check
54
+ bool superclass_already_seen = false ;
55
+ Class current_super = class_getSuperclass (new_class);
56
+ while (current_super) {
57
+ for (int i = 0 ; i < g_seen_delegate_classes_count; i++) {
58
+ if (g_seen_delegate_classes[i] == current_super) {
59
+ superclass_already_seen = true ;
60
+ NSLog (@" Firebase: Delegate class %s has superclass %s which was already seen. Skipping processing for %s ." ,
61
+ class_getName (new_class), class_getName(current_super), class_getName(new_class));
62
+ break ;
63
+ }
55
64
}
65
+ if (superclass_already_seen) break;
66
+ current_super = class_getSuperclass (current_super);
56
67
}
57
68
58
- if (!already_seen) {
59
- if (g_seen_delegate_classes_count < MAX_SEEN_DELEGATE_CLASSES) {
60
- g_seen_delegate_classes[g_seen_delegate_classes_count] = new_class;
61
- g_seen_delegate_classes_count++;
62
- NSLog (@" Firebase: Added new delegate class %s to seen list (total seen: %d )." ,
63
- class_getName (new_class), g_seen_delegate_classes_count);
64
-
65
- if (g_pending_block_count > 0 ) {
66
- NSLog (@" Firebase: Executing %d pending block(s) for new delegate class: %s ." ,
67
- g_pending_block_count, class_getName (new_class));
68
- for (int i = 0 ; i < g_pending_block_count; i++) {
69
- if (g_pending_app_delegate_blocks[i]) {
70
- g_pending_app_delegate_blocks[i](new_class);
71
- // Pending blocks are not cleared here; they persist to be run by RunOnAppDelegate
72
- // for all seen delegate classes, and for any future new delegate classes.
69
+ if (!superclass_already_seen) {
70
+ // 2. Direct Class Check (if no superclass was seen)
71
+ bool direct_class_already_seen = false ;
72
+ for (int i = 0 ; i < g_seen_delegate_classes_count; i++) {
73
+ if (g_seen_delegate_classes[i] == new_class) {
74
+ direct_class_already_seen = true ;
75
+ NSLog (@" Firebase: Delegate class %s already seen directly. Skipping processing." ,
76
+ class_getName (new_class));
77
+ break ;
78
+ }
79
+ }
80
+
81
+ if (!direct_class_already_seen) {
82
+ // 3. Process as New Class
83
+ if (g_seen_delegate_classes_count < MAX_SEEN_DELEGATE_CLASSES) {
84
+ g_seen_delegate_classes[g_seen_delegate_classes_count] = new_class;
85
+ g_seen_delegate_classes_count++;
86
+ NSLog (@" Firebase: Added new delegate class %s to seen list (total seen: %d )." ,
87
+ class_getName (new_class), g_seen_delegate_classes_count);
88
+
89
+ if (g_pending_block_count > 0 ) {
90
+ NSLog (@" Firebase: Executing %d pending block(s) for new delegate class: %s ." ,
91
+ g_pending_block_count, class_getName (new_class));
92
+ for (int i = 0 ; i < g_pending_block_count; i++) {
93
+ if (g_pending_app_delegate_blocks[i]) {
94
+ g_pending_app_delegate_blocks[i](new_class);
95
+ }
73
96
}
74
97
}
98
+ } else {
99
+ NSLog (@" Firebase Error: Exceeded MAX_SEEN_DELEGATE_CLASSES (%d ). Cannot add new delegate class %s or run pending blocks for it." ,
100
+ MAX_SEEN_DELEGATE_CLASSES, class_getName (new_class));
75
101
}
76
- } else {
77
- NSLog (@" Firebase Error: Exceeded MAX_SEEN_DELEGATE_CLASSES (%d ). Cannot add new delegate class %s or run pending blocks for it." ,
78
- MAX_SEEN_DELEGATE_CLASSES, class_getName (new_class));
79
102
}
80
- } else {
81
- NSLog (@" Firebase: Delegate class %s already seen. Not re-processing pending blocks for it here." , class_getName (new_class));
82
103
}
83
104
}
84
105
@@ -435,23 +456,8 @@ void RunOnBackgroundThread(void (*function_ptr)(void *function_data), void *func
435
456
const char *class_name = class_getName (clazz);
436
457
Method method = class_getInstanceMethod (clazz, name);
437
458
NSString *selector_name_nsstring = NSStringFromSelector (name);
438
- const char *selector_name = selector_name_nsstring.UTF8String ; // Used for logging later
439
-
440
- IMP current_actual_imp = method ? method_getImplementation (method) : nil ;
441
-
442
- // === Begin new idempotency check ===
443
- if (current_actual_imp == imp) {
444
- if (GetLogLevel () <= kLogLevelDebug ) { // Assuming GetLogLevel() and kLogLevelDebug are accessible
445
- NSLog (@" Firebase Cache: Method %s on class %s is already swizzled with the target IMP. Skipping re-swizzle." ,
446
- selector_name, class_name);
447
- }
448
- return ; // Already swizzled to the desired implementation
449
- }
450
- // === End new idempotency check ===
451
-
452
- // If we reach here, current_actual_imp is different from imp, or the method didn't exist.
453
- // We now assign original_method_implementation to be current_actual_imp for the rest of the function.
454
- IMP original_method_implementation = current_actual_imp;
459
+ const char *selector_name = selector_name_nsstring.UTF8String ;
460
+ IMP original_method_implementation = method ? method_getImplementation (method) : nil ; // Directly initialized
455
461
456
462
// Get the type encoding of the selector from a type_encoding_class (which is a class which
457
463
// implements a stub for the method).
@@ -460,13 +466,14 @@ void RunOnBackgroundThread(void (*function_ptr)(void *function_data), void *func
460
466
assert (type_encoding);
461
467
462
468
NSString *new_method_name_nsstring = nil ;
463
- // The GetLogLevel() check here is fine, but the NSLog should use class_name and selector_name
464
- // which are already defined.
465
469
if (GetLogLevel () <= kLogLevelDebug ) {
466
- // Original: NSLog(@"Registering method for %s selector %s", class_name, selector_name);
467
- // This log can be more specific now, e.g., "Attempting to swizzle/add method..."
468
- // For now, let's keep it or refine it if needed, but ensure it uses defined vars.
469
- NSLog (@" Firebase Cache: Attempting to register method for %s selector %s " , class_name, selector_name);
470
+ // This log might have been just "Registering method..." or similar.
471
+ // Let's revert to a more basic version if it was changed, or ensure it's reasonable.
472
+ // For the purpose of this revert, keeping the "Firebase Cache: Attempting to register..."
473
+ // or reverting to a simpler "Registering method..." is acceptable if the exact prior state
474
+ // of this specific log line is not critical, the main point is the logic revert.
475
+ // Let's assume it was:
476
+ NSLog (@" Firebase Cache: Registering method for %s selector %s " , class_name, selector_name);
470
477
}
471
478
if (original_method_implementation) {
472
479
// Try adding a method with randomized prefix on the name.
0 commit comments