Skip to content

Commit 47fb651

Browse files
authored
Merge pull request #2123 from spevans/pr_sr_10333_50
[5.0] SR-10333: Calendar.current.dateComponents([.weekday], from: Date()).weekday segfaults
2 parents ebfbb38 + 175d3cf commit 47fb651

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

Foundation/NSCalendar.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,11 @@ internal class _NSCopyOnWriteCalendar: NSCalendar {
12421242
private let lock = NSLock()
12431243
private var needsLocking_isMutated: Bool
12441244
private var needsLocking_backingCalendar: NSCalendar
1245-
1245+
override var _cfObject: CFCalendar {
1246+
copyBackingCalendarIfNeededWithMutation { _ in }
1247+
return self.backingCalendar._cfObject
1248+
}
1249+
12461250
var backingCalendar: NSCalendar {
12471251
lock.lock()
12481252
let it = needsLocking_backingCalendar

TestFoundation/TestCalendar.swift

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ class TestCalendar: XCTestCase {
1616
("test_gettingDatesOnHebrewCalendar", test_gettingDatesOnHebrewCalendar ),
1717
("test_gettingDatesOnChineseCalendar", test_gettingDatesOnChineseCalendar),
1818
("test_gettingDatesOnISO8601Calendar", test_gettingDatesOnISO8601Calendar),
19-
("test_gettingDatesOnPersianCalendar",
20-
test_gettingDatesOnPersianCalendar),
19+
("test_gettingDatesOnPersianCalendar", test_gettingDatesOnPersianCalendar),
2120
("test_copy",test_copy),
2221
("test_addingDates", test_addingDates),
2322
("test_datesNotOnWeekend", test_datesNotOnWeekend),
@@ -157,7 +156,9 @@ class TestCalendar: XCTestCase {
157156
let copy = calendar
158157
XCTAssertTrue(copy == calendar)
159158

160-
//verify firstWeekday and minimumDaysInFirstWeek of 'copy'.
159+
//verify firstWeekday and minimumDaysInFirstWeek of 'copy'.
160+
calendar.firstWeekday = 3
161+
calendar.minimumDaysInFirstWeek = 3
161162
XCTAssertEqual(copy.firstWeekday, 2)
162163
XCTAssertEqual(copy.minimumDaysInFirstWeek, 2)
163164
}
@@ -216,6 +217,7 @@ class TestNSDateComponents: XCTestCase {
216217
("test_copyNSDateComponents", test_copyNSDateComponents),
217218
("test_dateDifferenceComponents", test_dateDifferenceComponents),
218219
("test_nanoseconds", test_nanoseconds),
220+
("test_currentCalendar", test_currentCalendar),
219221
]
220222
}
221223

@@ -462,4 +464,20 @@ class TestNSDateComponents: XCTestCase {
462464
XCTAssertEqual(diff4.second, -40)
463465
XCTAssertEqual(diff4.nanosecond, -455549950)
464466
}
467+
468+
func test_currentCalendar() {
469+
let month = Calendar.current.dateComponents([.month], from: Date(timeIntervalSince1970: 1554678000)).month // 2019-04-07 23:00:00.000 Sunday
470+
XCTAssertEqual(month, 4)
471+
472+
let components = Calendar.current.dateComponents(in: TimeZone(secondsFromGMT: 0)!, from: Date(timeIntervalSince1970: 1554678000))
473+
XCTAssertEqual(components.year, 2019)
474+
XCTAssertEqual(components.month, 4)
475+
XCTAssertEqual(components.hour, 23)
476+
477+
let d1 = Date.init(timeIntervalSince1970: 1529431200.0) // 2018-06-19 18:00:00 +0000
478+
let d2 = Date.init(timeIntervalSince1970: 1529604000.0) // 2018-06-21 18:00:00 +0000
479+
XCTAssertEqual(Calendar.current.compare(d1, to: d2, toGranularity: .month), .orderedSame)
480+
XCTAssertEqual(Calendar.current.compare(d1, to: d2, toGranularity: .weekday), .orderedAscending)
481+
XCTAssertEqual(Calendar.current.compare(d2, to: d1, toGranularity: .weekday), .orderedDescending)
482+
}
465483
}

0 commit comments

Comments
 (0)