Commit Graph

197 Commits

Author SHA1 Message Date
Yukihiro "Matz" Matsumoto 3494b699ef time: implement nanosecond precision with zero memory overhead
Replace microsecond storage with nanosecond storage in struct mrb_time
while maintaining full backward compatibility and zero memory increase.

Changes:
- Replace 'usec' field with 'nsec' field in struct mrb_time
- Preserve full nanosecond precision from timespec_get/clock_gettime
- Add Time#nsec and Time#tv_nsec methods for Ruby spec compliance
- Update Time#usec to compute microseconds from nanoseconds
- Convert all arithmetic operations to handle nanosecond precision
- Add comprehensive tests for nanosecond functionality

Platform support:
- Modern systems: True nanosecond precision via timespec_get/clock_gettime
- Older systems: Microsecond precision converted to nanoseconds (gettimeofday)
- Minimal systems: Second precision with synthetic microseconds (time)

Benefits:
- Zero memory overhead (struct remains 80 bytes)
- 100% backward compatible (all existing tests pass)
- Better precision for time arithmetic and comparisons
- Ruby API compliant with standard nanosecond methods
- Automatic precision upgrade on capable systems

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto 16d3f31f82 time: add missing timezone offset methods and tests
implement gmt_offset, utc_offset, and gmtoff methods as aliases to
complete the ruby time api. all three methods return timezone offset
in seconds, with utc times returning 0 and local times returning the
appropriate offset value.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto a3efb96240 time.c: clean up Windows-specific conditional compilation
consolidate repeated Windows platform detection into single macro
MRB_TIME_WINDOWS_NO_STRFTIME_Z and simplify nested conditional blocks
in gettimeofday polyfill for better maintainability.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto ef6e148cb1 time.c: improve error handling consistency and clarity
standardize error messages and types across the codebase:
- use E_RANGE_ERROR consistently for time range violations
- consolidate "uninitialized time" errors with helper function
- clarify epoch-1 detection logic with better comments and structure
- unify "Time out of range" messaging

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto 7858141fe6 time.c: remove duplicate code in day and weekday methods
consolidate time_day and time_mday into single implementation, and
create generic time_wday_p function for all weekday methods, reducing
code duplication and improving maintainability.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto 9c4e70ed01 time.c: optimize getutc and getlocal to skip unnecessary datetime updates
skip time_update_datetime() call when timezone conversion is not needed,
eliminating expensive gmtime_r/localtime_r system calls for redundant
conversions like time.utc.getutc or time.local.getlocal.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:07 +09:00
Yukihiro "Matz" Matsumoto 731926cd72 time.c: optimize string formatting and fix timezone calculation
optimize time_to_s() by using combined strftime format on platforms with
%z support, eliminating redundant function calls for local times.

fix timezone calculation in time_zonename() by copying actual date
components instead of using arbitrary year, ensuring accurate dst handling.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:07 +09:00
Yukihiro "Matz" Matsumoto 2bd9c4327b mruby-time: add comprehensive call-seq documentation for all methods
Added complete call-seq documentation for all 39 public methods in the
Time class, improving documentation coverage from 0% to 100%.

Documentation added includes:

Class methods (6):
- Time.now: Get current system time
- Time.at: Create time from epoch seconds
- Time.gm/utc: Create UTC time from components
- Time.local/mktime: Create local time from components

Instance methods (33):
- Arithmetic: +, -, <=> for time calculations and comparisons
- Accessors: year, month, day, hour, min, sec, usec, wday, yday
- Timezone: zone, utc, localtime, getutc, getlocal, utc?, gmt?, dst?
- Conversion: to_i, to_f, to_s, inspect, asctime, ctime, hash
- Initialization: new, initialize_copy
- Weekday helpers: sunday?, monday?, tuesday?, wednesday?, thursday?, friday?, saturday?

Each method now includes:
- Clear method signatures with parameter and return types
- Detailed descriptions of time handling behavior
- Practical examples showing common usage patterns
- Notes about timezone handling and precision
- Consistent formatting following mruby documentation standards

This represents a major improvement in maintainability and usability of
time functionality for developers working with date/time operations in
embedded Ruby environments. The Time class is now fully documented with
comprehensive examples covering all aspects of time manipulation.

Co-authored-by: Atlassian Rovo Dev
2025-07-16 08:03:09 +09:00
John Bampton 420a60ee9f pre-commit updates and fix prettier entrypoint
https://nodejs.org/en/download

https://www.npmjs.com/package/prettier

prettier fix ups
2025-06-24 22:20:38 +10:00
Yukihiro "Matz" Matsumoto d015d91c12 mruby-time: make Time#initialize_copy private 2025-06-16 12:40:29 +09:00
Yukihiro "Matz" Matsumoto 12c124e1d4 mruby-time: add README.md
The document is written by Google Jules.
2025-06-14 01:06:55 +09:00
Yukihiro "Matz" Matsumoto d2728fb0ae mruby-time (mrb_to_time_t): separate into smaller functions
The code was written by Google Jules.
2025-06-02 16:05:44 +09:00
Yukihiro "Matz" Matsumoto 70956e9683 mruby-time: add descriptive comments
The comments were written by Google Jules.
2025-06-02 16:04:54 +09:00
Yukihiro "Matz" Matsumoto 91c59ced99 mruby-time: replace magic numbers to C macros
The code is written by Google Jules.
2025-06-02 15:55:44 +09:00
Yukihiro "Matz" Matsumoto c94ae288d5 mruby-time: use presym for initialization 2024-06-14 00:16:21 +09:00
Yukihiro "Matz" Matsumoto 4801a424a3 mruby-time: adjust local variable declarations 2024-05-02 19:55:29 +09:00
Yukihiro "Matz" Matsumoto 87b358a342 Including header files in include/* by <> 2024-03-26 13:59:59 +09:00
Yukihiro "Matz" Matsumoto 95765c8193 mruby-time: mrb_time_at is an API function; close #6195
5265e35 was wrong. Should not remove `mrb_` prefix from the function.
2024-03-11 09:48:32 +09:00
Yukihiro "Matz" Matsumoto ae43ce7593 mruby-time: refactor _POSIX_TIMERS handling issue; ref #6124 2023-12-27 22:24:12 +09:00
SiZiOUS c0ffc13801 mruby-time: protect against incorrectly defined _POSIX_TIMERS
This update avoids the following error: operator '&&' has no right operand (related to _POSIX_TIMERS)
See: https://stackoverflow.com/questions/48538243/macro-if-statement-returns-error-operator-has-no-right-operand
2023-12-23 19:16:23 +00:00
Yukihiro "Matz" Matsumoto b064d7e547 mruby-time/time.c (time_alloc_time): need to handle negative time_t 2023-09-19 14:22:49 +09:00
Yukihiro "Matz" Matsumoto 795044f82c internal.h: add mrb_check_num_exact prototype to the header 2023-05-30 08:54:05 +09:00
Yukihiro "Matz" Matsumoto f1a3cfbd3b add a space between if and ( 2023-05-22 11:55:21 +09:00
Yukihiro "Matz" Matsumoto c32f7915fb reformat else clause indentation style 2023-05-20 00:21:01 +09:00
Yukihiro "Matz" Matsumoto eea72ec84a fix spaces in the type cast expressions (cosmetic changes) 2023-05-18 23:29:16 +09:00
Yukihiro "Matz" Matsumoto 5265e35ad2 mruby-time/time.c: remove mrb_ prefix from static functions 2023-04-03 08:58:33 +09:00
Yukihiro "Matz" Matsumoto 65897145aa mruby-time/time.c (mrb_to_time_t): should always initialize usec 2023-04-03 08:46:30 +09:00
Yukihiro "Matz" Matsumoto 875e0b0b59 mruby-time/time.c (time_value_from_time_t): should raise exception
When time_t does not fit in mrb_int; ref #5958
2023-04-03 08:38:52 +09:00
dearblue bcce4b7141 Need fixable_time_t_p() always 2023-04-01 23:22:08 +09:00
Yukihiro "Matz" Matsumoto fc4fe48a00 mruby-time/time.c: fix error message from localtime_r(3) failure 2023-03-10 08:52:06 +09:00
Yukihiro "Matz" Matsumoto 13cd0e5585 mruby-time/time.c (mrb_time_minus): specify mrb_float directly
The `typedef mrb_sec` does not improve readability at all.
2023-03-10 08:52:06 +09:00
Yukihiro "Matz" Matsumoto e62d672ef3 mruby-time/time.c (mrb_to_time_t): support Bigint if defined 2023-03-10 08:52:06 +09:00
Yukihiro "Matz" Matsumoto c71408bc0a mruby-time/time.c (mrb_to_time_t): raise error if obj is not time
Or a time-compatible object like a number.
2023-03-10 08:52:05 +09:00
Yukihiro "Matz" Matsumoto 7096d277da mruby-time/time.c: support bigint to time_t if necessary 2023-03-10 08:52:05 +09:00
Yukihiro "Matz" Matsumoto da8c23524f mruby-time/time.c (mrb_to_time_t): use floor instead of llround
Since we should generate `t=(sec+usec)` from a floating point number
`sec` should be `floor(f)` especially for negative numbers, if the place
for `usec` is specified. In contrast, we can `round` the below point
digits if we are going to ignore them. But we now use `round` instead of
`llround` which directly convert `double` to `long long`, to add
boundary check for conversion.
2023-03-10 08:52:05 +09:00
Yukihiro "Matz" Matsumoto e5de08b692 mruby-time/time.c (time_mktime): should allow year before 1900
If the platform use 64 bit time_t, it is possible to represent the year
before 1903. So we should remove this check.
2023-03-10 08:52:04 +09:00
Yukihiro "Matz" Matsumoto 0a1fd07910 mruby-time/time.c: implement weekday methods in C 2023-02-01 14:33:46 +09:00
Yukihiro "Matz" Matsumoto 9992de5a4f Rename MRB_TT_DATA to MRB_TT_CDATA
`TT_DATA` is too confusing with `Data` objects (which is immutable
Struct like objects introduced in Ruby 3.2).
2022-12-04 22:45:36 +09:00
Yukihiro "Matz" Matsumoto 5eaef1cf25 mruby-time/time.c: properly generate hash from time objects. 2022-08-06 06:43:42 +09:00
Yukihiro "Matz" Matsumoto c34bb7825a mruby-time/time.c: add Time#eql? to compare. 2022-08-01 16:29:35 +09:00
Yukihiro "Matz" Matsumoto 475b868b72 time.c: remove duplicated UTC condition check. 2022-01-15 18:24:39 +09:00
Yukihiro "Matz" Matsumoto 171d32c007 time.c: 1969-12-31 23:59:59 is a valid time.
But `mktime(3)` for the date returns `-1` which happen to be the
error value.
2022-01-14 11:40:52 +09:00
Yukihiro "Matz" Matsumoto 8f09d8feb4 time.c: check year range before creating Time object. 2022-01-13 15:40:09 +09:00
dearblue 5a57602860 Organize the include of header files
- `#include <math.h>` is done in `mruby.h`.
  Eliminate the need to worry about the `MRB_NO_FLOAT` macro.

- Include mruby header files before standard header files.
  If the standard header file is already placed before `mruby.h`, the standard header file added in the future tends to be placed before `mruby.h`.

This change should some reduce the chances of macros that must be defined becoming undefined in C++ or including problematic header files in a particular mruby build configuration.
2021-08-21 15:42:57 +09:00
Yukihiro "Matz" Matsumoto 26340a8818 time.c: fixed a potential buffer overflow in time_zonename. 2021-07-25 16:43:00 +09:00
Yukihiro "Matz" Matsumoto c2c0250063 time.c: fixed time_zonename buffer size bug. 2021-07-25 16:38:37 +09:00
Yukihiro "Matz" Matsumoto 368b75d81b time.c: stop returning LOCAL for the zone name from Time.zone. 2021-07-25 13:07:11 +09:00
Yukihiro "Matz" Matsumoto 2bed2fabae time.c: update the document for Time#usec; close #5515 2021-07-25 13:07:11 +09:00
Yukihiro "Matz" Matsumoto 5c804cf68f Remove redundant include headers.
- stdlib.h
- stddef.h
- stdint.h
- stdarg.h
- limits.h
- float.h
2021-07-25 13:07:10 +09:00
Yukihiro "Matz" Matsumoto 033aa98cf4 time.c: Windows API provides clock_gettime.
`gettimeofday` emulation needed no longer.
2021-05-08 10:34:38 +09:00