Age | Commit message (Collapse) | Author |
|
Notes:
Merged: https://github.com/ruby/ruby/pull/13607
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/13607
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/13019
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12972
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12940
|
|
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.
|
|
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
|
|
- Not call `strlen` at the end of the zone name.
- Use the initialized UTC string.
|
|
Notes:
Merged-By: tompng <[email protected]>
|
|
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
|
|
Notes:
Merged-By: zverok <[email protected]>
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12345
|
|
`_strftime_l` is not available on msvcrt that is still used by 32bit
mingw compiler.
Notes:
Merged: https://github.com/ruby/ruby/pull/12286
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/12269
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/11892
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/11892
|
|
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) {
|
```
|
|
../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));
| ^~~~~~~~~~
|
|
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
|
|
In short, get rid of division and modulo of negative integers.
Notes:
Merged: https://github.com/ruby/ruby/pull/11561
|
|
[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
|
|
|
|
Since the subsecond part is discarded, WIDEVAL to VALUE conversion is
needed.
|
|
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.
|
|
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.
|
|
|
|
|
|
[Feature #16495]
|
|
|
|
So that it can be referred as a part of the document of `Time`.
|
|
If we always return 0, we might as well not define
the function at all.
|
|
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]>
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8217
Merged-By: nobu <[email protected]>
|
|
|
|
Disallow:
* Only year-month
* Only year-month-day
* Preceding whitespace
* Trailing whitespace
Fixes [Bug #19293]
Notes:
Merged: https://github.com/ruby/ruby/pull/7974
|
|
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]>
|
|
[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
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7268
|
|
|
|
Co-Authored-By: Jean Boussier <[email protected]>
Notes:
Merged: https://github.com/ruby/ruby/pull/7244
|
|
Co-Authored-By: Jean Boussier <[email protected]>
Notes:
Merged: https://github.com/ruby/ruby/pull/7244
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7051
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/6975
|
|
`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`.
|
|
* 4-digits or more is required as year
* Minutes and seconds parts are not ommittable
Notes:
Merged: https://github.com/ruby/ruby/pull/4825
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/4825
|