Skip to content

Commit c21deb4

Browse files
committed
Merge branch 'develop'
2 parents 7c46eda + 00f8ff1 commit c21deb4

File tree

9 files changed

+49
-33
lines changed

9 files changed

+49
-33
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ let package = Package(
4040
.library(name: "ReactBridge", targets: ["ReactBridge"])
4141
],
4242
dependencies: [
43-
.package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.1")
43+
.package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.2")
4444
],
4545
targets: [
4646
.macro(
@@ -52,9 +52,9 @@ let package = Package(
5252
),
5353
.target(
5454
name: "ReactBridge",
55-
dependencies: ["ReactBridgeMacros", "RegisterModules"]
55+
dependencies: ["ReactBridgeMacros", "ReactBridgeUtils"]
5656
),
57-
.target(name: "RegisterModules"),
57+
.target(name: "ReactBridgeUtils"),
5858
.testTarget(
5959
name: "ReactBridgeTests",
6060
dependencies: [

Sources/ReactBridge/ReactBridge.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
//
2525

2626
import Foundation
27+
@_exported import ReactBridgeUtils
2728

2829

2930
/// The macro exports and registers a class as a native module for React Native.

Sources/ReactBridgeMacros/ReactMethod.swift

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,35 +27,22 @@ import SwiftSyntax
2727
import SwiftSyntaxMacros
2828
import SwiftDiagnostics
2929

30+
3031
fileprivate extension String {
3132
var uppercasedFirst: String {
3233
prefix(1).uppercased() + dropFirst()
3334
}
3435
}
3536

36-
3737
struct ReactMethod {
3838
}
3939

4040
extension ReactMethod: PeerMacro {
4141

42-
private static var nonisolatedUnsafe: String = {
43-
#if swift(>=5.10)
44-
"nonisolated(unsafe) "
45-
#else
46-
""
47-
#endif
48-
}()
49-
5042
static func reactExport(funcName: String, jsName: String, objcName: String, isSync: Bool) -> DeclSyntax {
5143
"""
52-
@objc static func __rct_export__\(raw: funcName)() -> UnsafePointer<RCTMethodInfo>? {
53-
struct Static {
54-
static let jsName = strdup(\(raw: jsName))
55-
static let objcName = strdup("\(raw: objcName)")
56-
\(raw: Self.nonisolatedUnsafe)static var methodInfo = RCTMethodInfo(jsName: jsName, objcName: objcName, isSync: \(raw: isSync))
57-
}
58-
return withUnsafePointer(to: &Static.methodInfo) { $0 }
44+
@objc static func __rct_export__\(raw: funcName)() -> UnsafeRawPointer {
45+
ReactBridgeUtils.methodInfo(\(raw: jsName), objcName: "\(raw: objcName)", isSync: \(raw: isSync))
5946
}
6047
"""
6148
}

Sources/RegisterModules/RegisterModules.m renamed to Sources/ReactBridgeUtils/ReactBridgeUtils.m

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// RegisterModules.m
2+
// ReactBridgeUtils.m
33
//
44
// Created by Iurii Khvorost <[email protected]> on 2023/07/24.
55
// Copyright © 2023 Iurii Khvorost. All rights reserved.
@@ -24,9 +24,20 @@
2424
//
2525

2626
#import <objc/runtime.h>
27+
#import <Foundation/Foundation.h>
28+
#import "ReactBridgeUtils.h"
2729

28-
__attribute__((constructor))
29-
static void registerModules(void) {
30+
31+
// From RCTBridgeModule.h
32+
typedef struct RCTMethodInfo {
33+
const char * jsName;
34+
const char * objcName;
35+
BOOL isSync;
36+
} RCTMethodInfo;
37+
38+
@implementation ReactBridgeUtils
39+
40+
+ (void)load {
3041
SEL selector = @selector(_registerModule);
3142

3243
int numClasses = objc_getClassList(NULL, 0);
@@ -50,3 +61,13 @@ static void registerModules(void) {
5061
}
5162
free(classes);
5263
}
64+
65+
+ (const void *)methodInfo:(NSString *)jsName objcName:(NSString *)objcName isSync:(BOOL)isSync {
66+
RCTMethodInfo* methodInfo = malloc(sizeof(RCTMethodInfo));
67+
methodInfo->jsName = strdup([jsName cStringUsingEncoding: NSUTF8StringEncoding]);
68+
methodInfo->objcName = strdup([objcName cStringUsingEncoding: NSUTF8StringEncoding]);
69+
methodInfo->isSync = isSync;
70+
return methodInfo;
71+
}
72+
73+
@end
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#import <Foundation/Foundation.h>
2+
3+
NS_ASSUME_NONNULL_BEGIN
4+
5+
@interface ReactBridgeUtils: NSObject
6+
7+
+ (const void *)methodInfo:(NSString *)jsName objcName:(NSString *)objcName isSync:(BOOL)isSync;
8+
9+
@end
10+
11+
NS_ASSUME_NONNULL_END
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module ReactBridgeUtils {
2+
header "ReactBridgeUtils.h"
3+
}

Sources/RegisterModules/include/main.h

Whitespace-only changes.

Tests/ReactBridgeTests/ReactBridgeTests.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,8 @@ final class ReactMethodTests: XCTestCase {
2525

2626
func rct_export(name: String, selector: String, isSync: Bool = false, jsName: String? = nil) -> String {
2727
"""
28-
@objc static func __rct_export__\(name)() -> UnsafePointer<RCTMethodInfo>? {
29-
struct Static {
30-
static let jsName = strdup("\(jsName ?? name)")
31-
static let objcName = strdup("\(selector)")
32-
\(Self.nonisolatedUnsafe)static var methodInfo = RCTMethodInfo(jsName: jsName, objcName: objcName, isSync: \(isSync))
33-
}
34-
return withUnsafePointer(to: &Static.methodInfo) {
35-
$0
36-
}
28+
@objc static func __rct_export__\(name)() -> UnsafeRawPointer {
29+
ReactBridgeUtils.methodInfo("\(jsName ?? name)", objcName: "\(selector)", isSync: \(isSync))
3730
}
3831
"""
3932
}

0 commit comments

Comments
 (0)