Skip to content

Commit 27c4d10

Browse files
committed
Registering modules optimisation
1 parent 6b3ca3b commit 27c4d10

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

[email protected]

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ let package = Package(
5555
dependencies: ["ReactBridgeMacros", "ReactBridgeUtils"]
5656
),
5757
.target(
58-
name: "ReactBridgeUtils",
59-
cSettings: [.define("SymbolLinkageMarkers")]
58+
name: "ReactBridgeUtils"
6059
),
6160
.testTarget(
6261
name: "ReactBridgeTests",

Sources/ReactBridgeUtils/ReactBridgeUtils.m

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
//
2525

2626
#import <objc/runtime.h>
27-
#import <Foundation/Foundation.h>
2827
#import "ReactBridgeUtils.h"
2928

29+
#define let __auto_type const
30+
#define var __auto_type
31+
3032

3133
// From RCTBridgeModule.h
3234
typedef struct RCTMethodInfo {
@@ -36,29 +38,41 @@
3638
} RCTMethodInfo;
3739

3840
static void class_performClassSelector(Class class, SEL selector) {
39-
unsigned int numMethods = 0;
40-
Method *methods = class_copyMethodList(object_getClass(class), &numMethods);
41-
for (int i = 0; i < numMethods; i++) {
42-
Method method = methods[i];
43-
if (sel_isEqual(method_getName(method), selector)) {
44-
IMP imp = method_getImplementation(method);
41+
unsigned int count = 0;
42+
let methods = class_copyMethodList(object_getClass(class), &count);
43+
44+
for (var i = 0; i < count; i++) {
45+
let method = methods[i];
46+
let methodName = method_getName(method);
47+
if (sel_isEqual(methodName, selector)) {
48+
let imp = method_getImplementation(method);
4549
((void (*)(Class, SEL))imp)(class, selector);
4650
break;
4751
}
4852
}
53+
4954
free(methods);
5055
}
5156

5257
__attribute__((constructor))
5358
static void load() {
54-
SEL selector = @selector(_registerModule);
55-
int numClasses = objc_getClassList(NULL, 0);
56-
Class* classes = (Class *)malloc(sizeof(Class) * numClasses);
57-
numClasses = objc_getClassList(classes, numClasses);
58-
for (int i = 0; i < numClasses; i++) {
59-
Class class = classes[i];
60-
class_performClassSelector(class, selector);
61-
}
59+
let selector = @selector(_registerModule);
60+
61+
let processName = [NSProcessInfo.processInfo.processName cStringUsingEncoding: NSUTF8StringEncoding];
62+
let processNameLength = strlen(processName);
63+
64+
var count = objc_getClassList(NULL, 0);
65+
let classes = (Class *)malloc(sizeof(Class) * count);
66+
count = objc_getClassList(classes, count);
67+
68+
dispatch_apply(count, DISPATCH_APPLY_AUTO, ^(size_t index) {
69+
Class class = classes[index];
70+
let className = class_getName(class);
71+
if (strncmp(processName, className, processNameLength) == 0) {
72+
class_performClassSelector(class, selector);
73+
}
74+
});
75+
6276
free(classes);
6377
}
6478

0 commit comments

Comments
 (0)