From a7e2059c152a2aef52b3071256e1376f28f205dd Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Thu, 26 Nov 2015 06:38:11 -0800 Subject: [PATCH] Fix class pair register on reload Summary: public It was possible after reload to detach from the new instance, removing the markers. Reviewed By: jspahrsummers Differential Revision: D2696208 fb-gh-sync-id: ad8f5d449f51c7c74a20ae7c0cafc4fc786ea390 --- React/Profiler/RCTProfile.m | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/React/Profiler/RCTProfile.m b/React/Profiler/RCTProfile.m index fe93b6580..f311a3504 100644 --- a/React/Profiler/RCTProfile.m +++ b/React/Profiler/RCTProfile.m @@ -48,7 +48,6 @@ NSString *const RCTProfilePrefix = @"rct_profile_"; // This is actually a BOOL - but has to be compatible with OSAtomic static volatile uint32_t RCTProfileProfiling; -static BOOL RCTProfileHookedModules; static NSDictionary *RCTProfileInfo; static NSMutableDictionary *RCTProfileOngoingEvents; static NSTimeInterval RCTProfileStartTime; @@ -210,19 +209,21 @@ void RCTProfileHookModules(RCTBridge *bridge) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-pointer-compare" - if (RCTProfileTrampoline == NULL || RCTProfileHookedModules) { + if (RCTProfileTrampoline == NULL) { return; } #pragma clang diagnostic pop - RCTProfileHookedModules = YES; - for (RCTModuleData *moduleData in [bridge valueForKey:@"moduleDataByID"]) { [bridge dispatchBlock:^{ Class moduleClass = moduleData.moduleClass; Class proxyClass = objc_allocateClassPair(moduleClass, RCTProfileProxyClassName(moduleClass), 0); if (!proxyClass) { + proxyClass = objc_getClass(RCTProfileProxyClassName(moduleClass)); + if (proxyClass) { + object_setClass(moduleData.instance, proxyClass); + } return; } @@ -255,19 +256,12 @@ void RCTProfileHookModules(RCTBridge *bridge) void RCTProfileUnhookModules(RCTBridge *bridge) { - if (!RCTProfileHookedModules) { - return; - } - - RCTProfileHookedModules = NO; - dispatch_group_enter(RCTProfileGetUnhookGroup()); for (RCTModuleData *moduleData in [bridge valueForKey:@"moduleDataByID"]) { Class proxyClass = object_getClass(moduleData.instance); if (moduleData.moduleClass != proxyClass) { object_setClass(moduleData.instance, moduleData.moduleClass); - objc_disposeClassPair(proxyClass); } }