summaryrefslogtreecommitdiff
path: root/time.c
Commit message (Collapse)AuthorAgeFilesLines
* Fix crash in Time on 32-bit systemsPeter Zhu2023-04-041-30/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [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
* Remove (newly unneeded) remarks about aliasesBurdetteLamar2023-02-191-21/+0
|
* Replace `PACKED_STRUCT` and `PACKED_STRUCT_UNALIGNED`Nobuyoshi Nakada2023-02-081-2/+3
|
* * remove trailing spaces. [ci skip]git2023-02-071-1/+1
|
* Make Time objects WB protectedPeter Zhu2023-02-071-40/+68
| | | | Co-Authored-By: Jean Boussier <byroot@ruby-lang.org>
* Remove unused code in time.cPeter Zhu2023-02-071-102/+4
| | | | Co-Authored-By: Jean Boussier <byroot@ruby-lang.org>
* [Bug #19296] Precheck bits of time componentsNobuyoshi Nakada2023-01-021-6/+8
|
* [Bug #19292] Re-initialize tm when wday or yday is not setNobuyoshi Nakada2023-01-011-9/+22
|
* Update documentation about Time#deconstruct_keysKazuki Tsujimoto2022-12-221-1/+3
|
* [DOC] fix unintentional verbatimNobuyoshi Nakada2022-12-211-1/+1
|
* Fix guess_diff typeNobuyoshi Nakada2022-12-191-1/+1
| | | | | | | | `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`.
* [Feature #18033] Parse more strictly conformant with ISO-8601Nobuyoshi Nakada2022-12-161-5/+10
| | | | | * 4-digits or more is required as year * Minutes and seconds parts are not ommittable
* [Feature #18033] Make more conformant with C standardNobuyoshi Nakada2022-12-161-2/+3
|
* [Feature #18033] Add `precision:` optionNobuyoshi Nakada2022-12-161-24/+55
| | | | | Which limits the precision of subsecond. Defaulted to 9, that means nanosecond.
* [Feature #18033] More strict checksNobuyoshi Nakada2022-12-161-9/+27
|
* [Feature #18033] Name a magic numberNobuyoshi Nakada2022-12-161-4/+8
|
* [Feature #18033] Make Time.new parse time stringsNobuyoshi Nakada2022-12-161-1/+110
| | | | | `Time.new` now parses strings such as the result of `Time#inspect` and restricted ISO-8601 formats.
* Add Time#deconstruct_keyszverok2022-11-221-0/+108
|
* Using UNDEF_P macroS-H-GAMELINKS2022-11-161-8/+8
|
* Re-order checks for colons in UTC offsetNobuyoshi Nakada2022-11-151-8/+8
|
* [Bug #19106] Normalize time at 24:00:00 with a timezone objectNobuyoshi Nakada2022-11-071-8/+16
|
* [DOC] use the local rdoc reference than the external URINobuyoshi Nakada2022-10-111-1/+1
|
* [DOC] Remove extra page-dir prefix to fix broken linkNobuyoshi Nakada2022-09-031-1/+1
|
* [DOC] Enhanced RDoc for Time (#6320)Burdette Lamar2022-09-031-231/+36
| | | | | | | | | Treats: #yday #dst? #zone #to_a #strftime
* Enhanced RDoc for Tim[DOC] (#6319)Burdette Lamar2022-09-021-158/+200
|
* [DOC] Enhanced RDoc for Time (#6308)Burdette Lamar2022-08-311-2/+2
| | | More on timezones.
* [DOC] Enhanced RDoc for Time (#6294)Burdette Lamar2022-08-281-16/+21
|
* [DOC] Enhanced RDoc for Time (#6277)Burdette Lamar2022-08-251-47/+98
| | | | | | | | | | Deletes the :include: files in doc/time, which became no longer workable when @nobu pointed out that some (but not all) creator methods accept string values as well as integer-like values. Changes to methods: Time.utc Time.local Time.at Time.new
* [DOC] Tell RDoc aliases of singleton classNobuyoshi Nakada2022-08-261-3/+4
| | | | | | Since RDoc C parser cannot capture aliases which are using an expression other than a single variable as the class, use an intermediate variable for the singleton class.
* [DOC] Remove extra page-dir prefixNobuyoshi Nakada2022-08-231-1/+1
|
* [DOC] Enhanced RDoc for Time (#6267)Burdette Lamar2022-08-221-61/+63
| | | | | | | | | | Treats: #utc #getlocal #getutc #ctime #to_s #inspect
* [DOC] Remove extra page-dir prefixNobuyoshi Nakada2022-08-221-1/+1
|
* [DOC] Enhanced RDoc for Time (#6255)Burdette Lamar2022-08-211-29/+31
| | | | | | | Treats: #utc #hash #localtime
* Expand tabs [ci skip]Takashi Kokubun2022-07-211-264/+264
| | | | [Misc #18891]
* [Bug #18922] Normalize time at 24:00:00 UTCNobuyoshi Nakada2022-07-181-0/+14
|
* [DOC] Enhanced RDoc for Time (#6118)Burdette Lamar2022-07-121-98/+82
| | | | | | | | | | | | | | Treats: ::utc ::local #to_i #to_f #to_r #usec #nsec #subsec #<=> #eql?
* Using TZMODE_SET_LOCALTIME macroS-H-GAMELINKS2022-05-261-6/+6
|
* [DOC]Some link prefix replaceS-H-GAMELINKS2022-04-091-1/+1
|
* Fix a typo of macro nameNobuyoshi Nakada2022-02-281-1/+1
| | | | | | When the date is 28 Feb in the local timezone and 27 in the UTC, the leap second info is wrongly calculated, and the Time for 1 Mar created with a timezone resulted in an invalid date, 30 Feb.
* Speed up and avoid kwarg hash alloc in Time.nowJohn Hawthorn2022-01-121-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously Time.now was switched to use Time.new as it added support for the in: argument. Unfortunately because Class#new is a cfunc this requires always allocating a Hash. This commit switches Time.now back to using a builtin time_s_now. This avoids the extra Hash allocation and is about 3x faster. $ benchmark-driver -e './ruby;3.1::~/.rubies/ruby-3.1.0/bin/ruby;3.0::~/.rubies/ruby-3.0.2/bin/ruby' benchmark/time_now.yml Warming up -------------------------------------- Time.now 6.704M i/s - 6.710M times in 1.000814s (149.16ns/i, 328clocks/i) Time.now(in: "+09:00") 2.003M i/s - 2.112M times in 1.054330s (499.31ns/i) Calculating ------------------------------------- ./ruby 3.1 3.0 Time.now 7.693M 2.763M 6.394M i/s - 20.113M times in 2.614428s 7.278710s 3.145572s Time.now(in: "+09:00") 2.030M 1.260M 1.617M i/s - 6.008M times in 2.960132s 4.769378s 3.716537s Comparison: Time.now ./ruby: 7693129.7 i/s 3.0: 6394109.2 i/s - 1.20x slower 3.1: 2763282.5 i/s - 2.78x slower Time.now(in: "+09:00") ./ruby: 2029757.4 i/s 3.0: 1616652.3 i/s - 1.26x slower 3.1: 1259776.2 i/s - 1.61x slower
* Raise proper exception when month argument is not a nameNobuyoshi Nakada2021-12-251-9/+3
| | | | https://bugs.ruby-lang.org/issues/17485#change-89871
* Check month overflow when marshalNobuyoshi Nakada2021-12-091-1/+6
| | | | https://hackerone.com/reports/1244185
* Use `Primitive.mandatory_only?` for `Time.at`Koichi Sasada2021-11-151-0/+6
|
* Tentative fix of subsec to `Time.at` [Bug #18293]Nobuyoshi Nakada2021-11-101-1/+1
|
* Simplify default values of `Time.at` [Bug #18293]Nobuyoshi Nakada2021-11-101-3/+3
|
* Fix leap day with UTC offset [Bug #18274]Nobuyoshi Nakada2021-10-281-1/+2
| | | | | `struct vtm::year` is a Ruby integer instance, but not a C integer type.
* Prefer the reentrant versions of gmtime and localtimeNobuyoshi Nakada2021-10-141-0/+4
|
* Include the invalid value in invalid_utc_offset errorNobuyoshi Nakada2021-09-181-15/+17
|
* Remove unneeded ruby_reset_leap_second_info function declaration (#4824)S.H2021-09-161-1/+0
|
* Using RB_BIGNUM_TYPE_P macroS-H-GAMELINKS2021-09-111-8/+8
|