summaryrefslogtreecommitdiff
path: root/time.c
AgeCommit message (Collapse)Author
16 hoursNormalize subseconds using `wideint_t` instead of `time_t`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/13607
16 hoursConversion is needed between `WIDEVALUE` and `VALUE`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/13607
2025-03-31Implement `dcompact` for Time objectsJean Boussier
Notes: Merged: https://github.com/ruby/ruby/pull/13019
2025-03-24[Bug #21141] [DOC] Fix indentationNobuyoshi Nakada
2025-03-24[Bug #21141] [DOC] Refine description of `Time#utc?`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12972
2025-03-16[Bug #21141] [DOC] Clarify what time is in UTCNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12940
2025-02-20[Bug #21144] Win32: Convert the time zone name to the current localeNobuyoshi Nakada
The Windows time zone IDs provided by Microsoft as of 24H1 are ASCII only all, but the API itself is not impossible to set non-ASCII key name. Prefer the current locale encoding for now until we move to UTF-8 including environment variables and command line arguments.
2025-02-19[Bug #21144] Win32: Use Windows time zone ID if TZ is not setNobuyoshi Nakada
If the TZ environment variable is not set, the time zone names retrieved from the system are localized for UI display and may vary across editions and language packs for the same time zone. Use the time zone IDs that are invariant across environments instead. Notes: Merged: https://github.com/ruby/ruby/pull/12765
2025-02-17Trivial optimizationNobuyoshi Nakada
- Not call `strlen` at the end of the zone name. - Use the initialized UTC string.
2025-01-29[DOC] Fix wrong call-seq format (#12662)tomoya ishida
Notes: Merged-By: tompng <[email protected]>
2024-12-24Win32: Defer change of timezone name encoding after 3.4Nobuyoshi Nakada
This change will be merged into 3.5 along with other encoding, command line, environment variables, etc. Revert following commits: - bd831bcca534955533d9135d8c2f22d7ae5b9aa8 [Bug #20929] Win32: Use `wcsftime` - 1c15f641cc2bb88fa88123a11036ed58fbf9aa6d [Bug #20929] Win32: Encode timezone name in UTF-8 - 78762b52185aa80ee55c0d49b495aceed863dce2 [Bug #20929] Fix `assert_zone_encoding` Notes: Merged: https://github.com/ruby/ruby/pull/12448
2024-12-21[DOC] Move Time#xmlschema docs to the core (#12403)Victor Shepelev
Notes: Merged-By: zverok <[email protected]>
2024-12-14Extract `NUM2WV` macroNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12345
2024-12-07[Bug #20929] Win32: Use `wcsftime`Nobuyoshi Nakada
`_strftime_l` is not available on msvcrt that is still used by 32bit mingw compiler. Notes: Merged: https://github.com/ruby/ruby/pull/12286
2024-12-06[Bug #20929] Win32: Encode timezone name in UTF-8Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/12269
2024-10-14[Bug #20797] Check seconds in UTC offset as well as minutesNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/11892
2024-10-14`2digits` macrosNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/11892
2024-10-05Suppress warnings in `time_init_parse` functionS-H-GAMELINKS
When building Ruby on Ubuntu 22.04 and GCC 11.4.0, the following warning appeared. And this change has suppressed warning. ``` compiling ../ruby/time.c ../ruby/time.c: In function ‘time_init_parse’: ../ruby/time.c:2650:21: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] 2650 | if (ndigits < TIME_SCALE_NUMDIGITS) { | ^ ../ruby/time.c:2654:26: warning: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] 2654 | else if (ndigits > TIME_SCALE_NUMDIGITS) { | ```
2024-09-23Fix a -Wsign-compare warningTakashi Kokubun
../time.c:5247:50: warning: operand of ‘?:’ changes signedness from ‘int’ to ‘long unsigned int’ due to unsignedness of other operand [-Wsign-compare] 5247 | int w = (year >= -9999 && year <= 9999 ? year_width : (int)(year < 0) + DECIMAL_SIZE_OF(year)); | ^~~~~~~~~~
2024-09-23Refactor `Time#xmlschema`Nobuyoshi Nakada
And refine uncommon date cases. # Iteration per second (i/s) | |compare-ruby|built-ruby| |:---------------------------|-----------:|---------:| |time.xmlschema | 5.020M| 14.192M| | | -| 2.83x| |utc_time.xmlschema | 6.454M| 15.331M| | | -| 2.38x| |time.xmlschema(6) | 4.216M| 10.043M| | | -| 2.38x| |utc_time.xmlschema(6) | 5.486M| 10.592M| | | -| 1.93x| |time.xmlschema(9) | 4.294M| 10.340M| | | -| 2.41x| |utc_time.xmlschema(9) | 4.784M| 10.909M| | | -| 2.28x| |fraction_sec.xmlschema(10) | 366.982k| 3.406M| | | -| 9.28x| |future_time.xmlschema | 994.595k| 15.853M| | | -| 15.94x| Notes: Merged: https://github.com/ruby/ruby/pull/11665
2024-09-06[Feature #20707] Fix negative UTC offset conversionNobuyoshi Nakada
In short, get rid of division and modulo of negative integers. Notes: Merged: https://github.com/ruby/ruby/pull/11561
2024-09-05Move Time#xmlschema in core and optimize itJean Boussier
[Feature #20707] Converting Time into RFC3339 / ISO8601 representation is an significant hotspot for applications that serialize data in JSON, XML or other formats. By moving it into core we can optimize it much further than what `strftime` will allow. ``` compare-ruby: ruby 3.4.0dev (2024-08-29T13:11:40Z master 6b08a50a62) +YJIT [arm64-darwin23] built-ruby: ruby 3.4.0dev (2024-08-30T13:17:32Z native-xmlschema 34041ff71f) +YJIT [arm64-darwin23] warming up...... | |compare-ruby|built-ruby| |:-----------------------|-----------:|---------:| |time.xmlschema | 1.087M| 5.190M| | | -| 4.78x| |utc_time.xmlschema | 1.464M| 6.848M| | | -| 4.68x| |time.xmlschema(6) | 859.960k| 4.646M| | | -| 5.40x| |utc_time.xmlschema(6) | 1.080M| 5.917M| | | -| 5.48x| |time.xmlschema(9) | 893.909k| 4.668M| | | -| 5.22x| |utc_time.xmlschema(9) | 1.056M| 5.707M| | | -| 5.40x| ``` Notes: Merged: https://github.com/ruby/ruby/pull/11510
2024-06-02Time internal representation comment removed.Tanaka Akira
2024-03-22Fix pointer incompatiblityNobuyoshi Nakada
Since the subsecond part is discarded, WIDEVAL to VALUE conversion is needed.
2024-03-07[Bug #20327] Do not count subsecond to calculate UTC offsetNobuyoshi Nakada
Assume that there will never be any time zones with UTC offsets that are subseconds. Historically, UTC offset has only been used down to the second.
2024-03-06Refactor VM root modulesJean Boussier
This `st_table` is used to both mark and pin classes defined from the C API. But `vm->mark_object_ary` already does both much more efficiently. Currently a Ruby process starts with 252 rooted classes, which uses `7224B` in an `st_table` or `2016B` in an `RArray`. So a baseline of 5kB saved, but since `mark_object_ary` is preallocated with `1024` slots but only use `405` of them, it's a net `7kB` save. `vm->mark_object_ary` is also being refactored. Prior to this changes, `mark_object_ary` was a regular `RArray`, but since this allows for references to be moved, it was marked a second time from `rb_vm_mark()` to pin these objects. This has the detrimental effect of marking these references on every minors even though it's a mostly append only list. But using a custom TypedData we can save from having to mark all the references on minor GC runs. Addtionally, immediate values are now ignored and not appended to `vm->mark_object_ary` as it's just wasted space.
2024-02-17[DOC] Functions for `Time#initialize` implementationNobuyoshi Nakada
2024-02-17Fix an argument nameNobuyoshi Nakada
2024-02-15Do not include a backtick in error messages and backtracesYusuke Endoh
[Feature #16495]
2023-12-02[DOC] Markup class name `Time` as codeNobuyoshi Nakada
2023-12-02[DOC] Include timezones document in timev.rbNobuyoshi Nakada
So that it can be referred as a part of the document of `Time`.
2023-11-21Get rid of useless dsize functionsJean Boussier
If we always return 0, we might as well not define the function at all.
2023-11-07Use embedded TypedData for Time objectsPeter Zhu
This drops the total size of a Time object from 86 bytes to 80 bytes. Running the benchmark benchmark/time_now.yml, this commit improves performance of Time.now by about 30%: ``` Time.now Branch: 13159405.4 i/s Master: 10036908.7 i/s - 1.31x slower Time.now(in: "+09:00") Branch: 2712172.6 i/s Master: 2138637.9 i/s - 1.27x slower ``` It also decreases memory usage by about 20%: ``` ary = 10_000_000.times.map { Time.now } puts `ps -o rss= -p #{$$}` ``` Branch: 961792 Master: 1196544 Co-Authored-By: Jean Boussier <[email protected]>
2023-08-16[DOC] Specify the unit of return value for `Time#-`haseponpon
Notes: Merged: https://github.com/ruby/ruby/pull/8217 Merged-By: nobu <[email protected]>
2023-08-15[DOC] Improve doc guide compliance (#8221)Burdette Lamar
2023-07-13Tighten Time.new(string) parsingJeremy Evans
Disallow: * Only year-month * Only year-month-day * Preceding whitespace * Trailing whitespace Fixes [Bug #19293] Notes: Merged: https://github.com/ruby/ruby/pull/7974
2023-06-23Prefer `0` over `NULL` as function pointersNobuyoshi Nakada
SunC warns use of `NULL`, pointer to data as function pointers. Notes: Merged: https://github.com/ruby/ruby/pull/7972 Merged-By: nobu <[email protected]>
2023-04-04Fix crash in Time on 32-bit systemsPeter Zhu
[Bug #19575] struct vtm is packed causing it to have a size that is not aligned on 32-bit systems. When allocating it on the stack, it will have unaligned addresses which means that the fields won't be marked by the GC when scanning the stack (since the GC only marks aligned addresses). This can cause crashes when the fields are heap allocated objects like Bignums. This commit moves the flags in struct time_object into struct vtm for space efficiency and removes the need for packing. This is an example of a crash: ruby(rb_print_backtrace+0xd) [0x56848945] ../src/vm_dump.c:785 ruby(rb_vm_bugreport) ../src/vm_dump.c:1101 ruby(rb_assert_failure+0x7a) [0x56671857] ../src/error.c:878 ruby(vm_search_cc+0x0) [0x56666e47] ../src/vm_method.c:1366 ruby(rb_vm_search_method_slowpath) ../src/vm_insnhelper.c:2090 ruby(callable_method_entry+0x5) [0x568232d3] ../src/vm_method.c:1406 ruby(rb_callable_method_entry) ../src/vm_method.c:1413 ruby(gccct_method_search_slowpath) ../src/vm_eval.c:427 ruby(gccct_method_search+0x20f) [0x568237ef] ../src/vm_eval.c:476 ruby(opt_equality_by_mid_slowpath+0x2c) [0x5682388c] ../src/vm_insnhelper.c:2338 ruby(rb_equal+0x37) [0x566fe577] ../src/object.c:133 ruby(rb_big_eq+0x34) [0x56876ee4] ../src/bignum.c:5554 ruby(rb_int_equal+0x14) [0x566f3ed4] ../src/numeric.c:4640 ruby(rb_int_equal) ../src/numeric.c:4634 ruby(vm_call0_cfunc_with_frame+0x6d) [0x568303c2] ../src/vm_eval.c:148 ruby(vm_call0_cfunc) ../src/vm_eval.c:162 ruby(vm_call0_body) ../src/vm_eval.c:208 ruby(rb_funcallv_scope+0xd1) [0x56833971] ../src/vm_eval.c:85 ruby(RB_TEST+0x0) [0x567e8488] ../src/time.c:78 ruby(eq) ../src/time.c:78 ruby(small_vtm_sub) ../src/time.c:1523 ruby(timelocalw+0x23b) [0x567f3e9b] ../src/time.c:1593 ruby(time_s_alloc+0x0) [0x567f536b] ../src/time.c:3698 ruby(time_new_timew) ../src/time.c:2694 ruby(time_s_mktime) ../src/time.c:3698 Notes: Merged: https://github.com/ruby/ruby/pull/7650
2023-02-19Remove (newly unneeded) remarks about aliasesBurdetteLamar
2023-02-08Replace `PACKED_STRUCT` and `PACKED_STRUCT_UNALIGNED`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/7268
2023-02-07* remove trailing spaces. [ci skip]git
2023-02-07Make Time objects WB protectedPeter Zhu
Co-Authored-By: Jean Boussier <[email protected]> Notes: Merged: https://github.com/ruby/ruby/pull/7244
2023-02-07Remove unused code in time.cPeter Zhu
Co-Authored-By: Jean Boussier <[email protected]> Notes: Merged: https://github.com/ruby/ruby/pull/7244
2023-01-02[Bug #19296] Precheck bits of time componentsNobuyoshi Nakada
2023-01-01[Bug #19292] Re-initialize tm when wday or yday is not setNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/7051
2022-12-22Update documentation about Time#deconstruct_keysKazuki Tsujimoto
2022-12-21[DOC] fix unintentional verbatimNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/6975
2022-12-19Fix guess_diff typeNobuyoshi Nakada
`unsigned_time_t` has the same size as `time_t`, but it doesn't mean these types are same except for signedness. For instance, while `long` and `long long` has the same size and `time_t` is defined as the latter on 64bit OpenBSD, `unsigned_time_t` has been defined as `long`.
2022-12-16[Feature #18033] Parse more strictly conformant with ISO-8601Nobuyoshi Nakada
* 4-digits or more is required as year * Minutes and seconds parts are not ommittable Notes: Merged: https://github.com/ruby/ruby/pull/4825
2022-12-16[Feature #18033] Make more conformant with C standardNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4825