x64 mingw: test_at(TestTime) failure
x64 mingw has the following failure.
[ 5/65] TestTime#test_at = 0.00 s
<-146138510344> expected but was
I guess Time.at(large value) fails for the following reason.
Time.at calls FileTimeToSystemTime() in localtime_r().
Time limit is 0x8000000000000000 which is a little smaller than 8bytes(= time_t)(= long long).
Instead, using _localtime_64s() seems to work fine.
I changed to use _gmtime_64s() for consistency. I added declarations since mingw-w64 doesn't have these declaration.
I attached a patch.
Updated by luislavena (Luis Lavena) almost 8 years ago
- Category set to core
- Status changed from Open to Assigned
- Assignee changed from luislavena (Luis Lavena) to nobu (Nobuyoshi Nakada)
- Target version set to 2.0.0
- % Done changed from 0 to 50
Thank you Hiroshi,
I can confirm patch works:
Finished tests in 0.085005s, 764.6609 tests/s, 7411.3287 assertions/s.
65 tests, 630 assertions, 0 failures, 0 errors, 0 skips
ruby -v: ruby 2.0.0dev (2012-07-27 trunk 36551) [x64-mingw32]
Reassigning to Nobu for final consideration.
Updated by Anonymous almost 8 years ago
- Status changed from Assigned to Closed
- % Done changed from 50 to 100
This issue was solved with changeset r36556.
Hiroshi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
win32/win32.c: fix localtime_r() on x64-mingw
win32/win32.c (gmtime_r): use _gmtime64_s() with x86_64-w64-mingw32.
win32/win32.c (localtime_r): use _localtime64_s() with
x86_64-w64-mingw32. Since FileTimeToSystemTime() seems not work with
large value under x64. Mingw-w64 doesn't have these declaration.
[ruby-core:46780] [Bug #6794]
Updated by h.shirosaki (Hiroshi Shirosaki) almost 8 years ago
Thank you. Checked in.
BTW, 32bit mingw doesn't have 64s() family?
It seems that gcc 4.6.1 (tdm gcc 32bit) doesn't have _localtime64_s.
gcc 4.6.3 (rubenvb-4.6.3) i686-w64-mingw32 (32bit) has _localtime64_s.
The following page's example worked with rubenvb-4.6.3.