[Lldb-commits] [lldb] 5814255 - [lldb] Always round down in NSDate's formatter to match NSDate's builtin format
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Mon Jul 6 07:59:56 PDT 2020
Author: Raphael Isemann
Date: 2020-07-06T16:59:37+02:00
New Revision: 5814255e1a7d2e90580d6df457ddd13b1cd156cb
URL: https://github.com/llvm/llvm-project/commit/5814255e1a7d2e90580d6df457ddd13b1cd156cb
DIFF: https://github.com/llvm/llvm-project/commit/5814255e1a7d2e90580d6df457ddd13b1cd156cb.diff
LOG: [lldb] Always round down in NSDate's formatter to match NSDate's builtin format
Summary:
When printing an NSDate (for example with `NSLog` or `po`) the seconds value is
always rounded down. LLDB's own formatter however isn't following that behaviour
which leads to situations where the formatted result is sometimes one second
off. For example:
```
(lldb) p [NSDate dateWithTimeIntervalSince1970:0.1]
(__NSTaggedDate *) $1 = [...] 1970-01-01 00:00:01 UTC
(lldb) po [NSDate dateWithTimeIntervalSince1970:0.1]
1970-01-01 00:00:00 +0000
(lldb) p [NSDate dateWithTimeIntervalSince1970:0.6]
(__NSTaggedDate *) $4 =[...] 1970-01-01 00:00:01 UTC
(lldb) po [NSDate dateWithTimeIntervalSince1970:0.6]
1970-01-01 00:00:00 +0000
```
This patch just always rounds down the seconds value we get from the NSDate
object.
Fixes rdar://65084800
Reviewers: mib, davide
Reviewed By: mib
Subscribers: JDevlieghere
Differential Revision: https://reviews.llvm.org/D83221
Added:
Modified:
lldb/source/Plugins/Language/ObjC/Cocoa.cpp
lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSDate.py
lldb/test/API/functionalities/data-formatter/data-formatter-objc/main.m
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
index 8a44811dd36b..da910f48e59a 100644
--- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
+++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp
@@ -867,7 +867,7 @@ bool lldb_private::formatters::NSDateSummaryProvider(
// is generally true and POSIXly happy, but might break if a library vendor
// decides to get creative
time_t epoch = GetOSXEpoch();
- epoch = epoch + (time_t)date_value;
+ epoch = epoch + static_cast<time_t>(std::floor(date_value));
tm *tm_date = gmtime(&epoch);
if (!tm_date)
return false;
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSDate.py b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSDate.py
index 5cfaa892bb62..61394c05f5d5 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSDate.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjCNSDate.py
@@ -43,6 +43,15 @@ def nsdate_data_formatter_commands(self):
self.expect('frame variable date4_abs', substrs=['1970'])
self.expect('frame variable date5_abs', substrs=[now_year])
+ # Check that LLDB always follow's NSDate's rounding behavior (which
+ # is always rounding down).
+ self.expect_expr("date_1970_minus_06", result_summary="1969-12-31 23:59:59 UTC")
+ self.expect_expr("date_1970_minus_05", result_summary="1969-12-31 23:59:59 UTC")
+ self.expect_expr("date_1970_minus_04", result_summary="1969-12-31 23:59:59 UTC")
+ self.expect_expr("date_1970_plus_06", result_summary="1970-01-01 00:00:00 UTC")
+ self.expect_expr("date_1970_plus_05", result_summary="1970-01-01 00:00:00 UTC")
+ self.expect_expr("date_1970_plus_04", result_summary="1970-01-01 00:00:00 UTC")
+
self.expect('frame variable cupertino home europe',
substrs=['@"America/Los_Angeles"',
'@"Europe/Rome"',
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/main.m b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/main.m
index df96a5e59b5b..a44a7837f771 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-objc/main.m
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-objc/main.m
@@ -655,6 +655,14 @@ int main(int argc, const char *argv[]) {
[NSDate dateWithTimeIntervalSinceReferenceDate:
floor([[NSDate date] timeIntervalSinceReferenceDate])];
+ NSDate *date_1970_minus_06 = [NSDate dateWithTimeIntervalSince1970:-0.6];
+ NSDate *date_1970_minus_05 = [NSDate dateWithTimeIntervalSince1970:-0.5];
+ NSDate *date_1970_minus_04 = [NSDate dateWithTimeIntervalSince1970:-0.4];
+
+ NSDate *date_1970_plus_06 = [NSDate dateWithTimeIntervalSince1970:0.6];
+ NSDate *date_1970_plus_05 = [NSDate dateWithTimeIntervalSince1970:0.5];
+ NSDate *date_1970_plus_04 = [NSDate dateWithTimeIntervalSince1970:0.4];
+
CFAbsoluteTime date1_abs = CFDateGetAbsoluteTime(date1);
CFAbsoluteTime date2_abs = CFDateGetAbsoluteTime(date2);
CFAbsoluteTime date3_abs = CFDateGetAbsoluteTime(date3);
More information about the lldb-commits
mailing list