@@ -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