Skip to content

Commit 6640d6b

Browse files
authored
fix(ios): prevent app crash in Release builds (#286)
1 parent 1f88907 commit 6640d6b

1 file changed

Lines changed: 22 additions & 11 deletions

File tree

ios/RNMParticle/RNMPRokt.mm

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,17 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue
5858
}
5959

6060
#ifdef RCT_NEW_ARCH_ENABLED
61-
// New Architecture Implementation
62-
- (void)selectPlacements:(NSString *)identifer
63-
attributes:(NSDictionary *)attributes
64-
placeholders:(NSDictionary *)placeholders
65-
roktConfig:(JS::NativeMPRokt::RoktConfigType &)roktConfig
66-
fontFilesMap:(NSDictionary *)fontFilesMap
67-
{
68-
NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes];
69-
70-
// Convert JS struct to NSDictionary for internal use
61+
// Extracts roktConfig fields into an NSDictionary, returning nil when the
62+
// TurboModule bridge passes a null C++ reference for an omitted optional param.
63+
// __attribute__((optnone)) is required: &ref != nullptr is UB in C++ and the
64+
// compiler removes the check at -O2, causing a SIGSEGV in Release builds.
65+
static NSDictionary * __attribute__((optnone)) safeExtractRoktConfigDict(
66+
JS::NativeMPRokt::RoktConfigType &roktConfig) {
67+
if (&roktConfig == nullptr) {
68+
return nil;
69+
}
7170
NSMutableDictionary *roktConfigDict = [[NSMutableDictionary alloc] init];
72-
if (&roktConfig != nullptr && roktConfig.cacheConfig().has_value()) {
71+
if (roktConfig.cacheConfig().has_value()) {
7372
NSMutableDictionary *cacheConfigDict = [[NSMutableDictionary alloc] init];
7473
auto cacheConfig = roktConfig.cacheConfig().value();
7574
if (cacheConfig.cacheDurationInSeconds().has_value()) {
@@ -80,7 +79,19 @@ - (void)selectPlacements:(NSString *)identifer
8079
}
8180
roktConfigDict[@"cacheConfig"] = cacheConfigDict;
8281
}
82+
return roktConfigDict;
83+
}
84+
85+
// New Architecture Implementation
86+
- (void)selectPlacements:(NSString *)identifer
87+
attributes:(NSDictionary *)attributes
88+
placeholders:(NSDictionary *)placeholders
89+
roktConfig:(JS::NativeMPRokt::RoktConfigType &)roktConfig
90+
fontFilesMap:(NSDictionary *)fontFilesMap
91+
{
92+
NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes];
8393

94+
NSDictionary *roktConfigDict = safeExtractRoktConfigDict(roktConfig);
8495
MPRoktConfig *config = [self buildRoktConfigFromDict:roktConfigDict];
8596
#else
8697
// Old Architecture Implementation

0 commit comments

Comments
 (0)