@@ -32,6 +32,14 @@ CF_INLINE void __CFReleaseIfNotNull(CFTypeRef object) {
32
32
}
33
33
}
34
34
35
+ CF_INLINE CFTypeRef __CFRetainIfNotNull (CFTypeRef object ) {
36
+ if (object ) {
37
+ CFRetain (object );
38
+ }
39
+
40
+ return object ;
41
+ }
42
+
35
43
struct __CFDateIntervalFormatter {
36
44
CFRuntimeBase _base ;
37
45
CFLocaleRef _locale ;
@@ -184,7 +192,7 @@ CFDateIntervalFormatterRef CFDateIntervalFormatterCreate(CFAllocatorRef allocato
184
192
__CFGenericValidateType (allocator , CFAllocatorGetTypeID ());
185
193
memory = (struct __CFDateIntervalFormatter * )_CFRuntimeCreateInstance (allocator , _kCFRuntimeIDCFDateIntervalFormatter , size , NULL );
186
194
if (!memory ) {
187
- return NULL ;
195
+ return ( CFDateIntervalFormatterRef _Nonnull) NULL ;
188
196
}
189
197
190
198
switch (dateStyle ) {
@@ -210,6 +218,9 @@ CFDateIntervalFormatterRef CFDateIntervalFormatterCreate(CFAllocatorRef allocato
210
218
break ;
211
219
}
212
220
221
+ memory -> _dateStyle = dateStyle ;
222
+ memory -> _timeStyle = timeStyle ;
223
+
213
224
memory -> _locale = locale ? CFRetain (locale ) : NULL ;
214
225
215
226
memory -> _calendar = NULL ;
@@ -225,6 +236,67 @@ CFDateIntervalFormatterRef CFDateIntervalFormatterCreate(CFAllocatorRef allocato
225
236
return (CFDateIntervalFormatterRef )memory ;
226
237
}
227
238
239
+ void _CFDateIntervalFormatterInitializeFromCoderValues (CFDateIntervalFormatterRef formatter ,
240
+ int64_t dateStyle ,
241
+ int64_t timeStyle ,
242
+ CFStringRef _Nullable dateTemplate ,
243
+ CFStringRef _Nullable dateTemplateFromStyles ,
244
+ bool modified ,
245
+ bool useTemplate ,
246
+ CFLocaleRef _Nullable locale ,
247
+ CFCalendarRef _Nullable calendar ,
248
+ CFTimeZoneRef _Nullable timeZone ) {
249
+ LOCK ();
250
+ formatter -> _dateStyle = dateStyle ;
251
+ formatter -> _timeStyle = timeStyle ;
252
+
253
+ #define __CFSetObjectField (field , value ) \
254
+ { \
255
+ __auto_type _value = value; \
256
+ if (field != _value) { \
257
+ __CFReleaseIfNotNull(field); \
258
+ field = (__typeof(_value))__CFRetainIfNotNull(_value); \
259
+ } \
260
+ }
261
+
262
+ __CFSetObjectField (formatter -> _dateTemplate , dateTemplate );
263
+ __CFSetObjectField (formatter -> _dateTemplateFromStyles , dateTemplateFromStyles );
264
+
265
+ formatter -> _modified = modified ;
266
+ formatter -> _useTemplate = useTemplate ;
267
+
268
+ __CFSetObjectField (formatter -> _locale , locale );
269
+ __CFSetObjectField (formatter -> _calendar , calendar );
270
+ __CFSetObjectField (formatter -> _timeZone , timeZone );
271
+
272
+ UNLOCK ();
273
+ }
274
+
275
+ void _CFDateIntervalFormatterCopyCoderValues (CFDateIntervalFormatterRef formatter ,
276
+ int64_t * dateStyle ,
277
+ int64_t * timeStyle ,
278
+ CFStringRef _Nullable * dateTemplate ,
279
+ CFStringRef _Nullable * dateTemplateFromStyles ,
280
+ bool * modified ,
281
+ bool * useTemplate ,
282
+ CFLocaleRef _Nullable * locale ,
283
+ CFCalendarRef _Nullable * calendar ,
284
+ CFTimeZoneRef _Nullable * timeZone ) {
285
+ LOCK ();
286
+
287
+ * dateStyle = formatter -> _dateStyle ;
288
+ * timeStyle = formatter -> _timeStyle ;
289
+ * dateTemplate = __CFRetainIfNotNull (formatter -> _dateTemplate );
290
+ * dateTemplateFromStyles = __CFRetainIfNotNull (formatter -> _dateTemplateFromStyles );
291
+ * modified = formatter -> _modified ;
292
+ * useTemplate = formatter -> _useTemplate ;
293
+ * locale = __CFRetainIfNotNull (formatter -> _locale );
294
+ * calendar = (CFCalendarRef )__CFRetainIfNotNull (formatter -> _calendar );
295
+ * timeZone = __CFRetainIfNotNull (formatter -> _timeZone );
296
+
297
+ UNLOCK ();
298
+ }
299
+
228
300
CFDateIntervalFormatterRef CFDateIntervalFormatterCreateCopy (CFAllocatorRef _Nullable allocator , CFDateIntervalFormatterRef formatter ) {
229
301
LOCK ();
230
302
CFDateIntervalFormatterRef newFormatter = CFDateIntervalFormatterCreate (allocator , formatter -> _locale , formatter -> _dateStyle , formatter -> _timeStyle );
@@ -294,7 +366,7 @@ void CFDateIntervalFormatterSetLocale(CFDateIntervalFormatterRef formatter, CFLo
294
366
295
367
CFCalendarRef CFDateIntervalFormatterCopyCalendar (CFDateIntervalFormatterRef formatter ) {
296
368
LOCK ();
297
- CFCalendarRef calendar = formatter -> _calendar ;
369
+ CFCalendarRef calendar = ( CFCalendarRef ) __CFRetainIfNotNull ( formatter -> _calendar ) ;
298
370
if (!calendar ) {
299
371
if (formatter -> _locale ) {
300
372
calendar = (CFCalendarRef )CFLocaleGetValue (formatter -> _locale , kCFLocaleCalendar );
0 commit comments