diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-04-03 17:26:22 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-04-13 14:07:27 +0900 |
commit | 3612b1bed8b4a93fd85d4be448174d5c6ef4f473 (patch) | |
tree | 00e13bf7241d7a06549e715d8556a1f304efdebf | |
parent | 86db7a1cb87bc7cde49df2bac82d91ccdc514509 (diff) | |
download | ruby-3612b1bed8b4a93fd85d4be448174d5c6ef4f473.tar.gz |
[Feature #19590] Show the invalid clock argument
Include the failed clock argument in the error message from
`Process.clock_gettime` and `Process.clock_getres`.
-rw-r--r-- | process.c | 21 | ||||
-rw-r--r-- | test/ruby/test_process.rb | 8 |
2 files changed, 21 insertions, 8 deletions
@@ -7960,6 +7960,11 @@ ruby_real_ms_time(void) # define NUM2CLOCKID(x) 0 #endif +#define clock_failed(name, err, arg) do { \ + int clock_error = (err); \ + rb_syserr_fail_str(clock_error, rb_sprintf("clock_" name "(%+"PRIsVALUE")", (arg))); \ + } while (0) + /* * call-seq: * Process.clock_gettime(clock_id [, unit]) -> number @@ -8260,15 +8265,17 @@ rb_clock_gettime(int argc, VALUE *argv, VALUE _) gettime: ret = clock_gettime(c, &ts); if (ret == -1) - rb_sys_fail("clock_gettime"); + clock_failed("gettime", errno, clk_id); tt.count = (int32_t)ts.tv_nsec; tt.giga_count = ts.tv_sec; denominators[num_denominators++] = 1000000000; goto success; #endif } - /* EINVAL emulates clock_gettime behavior when clock_id is invalid. */ - rb_syserr_fail(EINVAL, 0); + else { + rb_unexpected_type(clk_id, T_SYMBOL); + } + clock_failed("gettime", EINVAL, clk_id); success: return make_clock_result(&tt, numerators, num_numerators, denominators, num_denominators, unit); @@ -8433,15 +8440,17 @@ rb_clock_getres(int argc, VALUE *argv, VALUE _) getres: ret = clock_getres(c, &ts); if (ret == -1) - rb_sys_fail("clock_getres"); + clock_failed("getres", errno, clk_id); tt.count = (int32_t)ts.tv_nsec; tt.giga_count = ts.tv_sec; denominators[num_denominators++] = 1000000000; goto success; #endif } - /* EINVAL emulates clock_getres behavior when clock_id is invalid. */ - rb_syserr_fail(EINVAL, 0); + else { + rb_unexpected_type(clk_id, T_SYMBOL); + } + clock_failed("getres", EINVAL, clk_id); success: if (unit == ID2SYM(id_hertz)) { diff --git a/test/ruby/test_process.rb b/test/ruby/test_process.rb index 6e8050a54a..7a6930b531 100644 --- a/test/ruby/test_process.rb +++ b/test/ruby/test_process.rb @@ -2156,7 +2156,9 @@ EOS t3 = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond) assert_operator(t1, :<=, t2) assert_operator(t2, :<=, t3) - assert_raise(Errno::EINVAL) { Process.clock_gettime(:foo) } + assert_raise_with_message(Errno::EINVAL, /:foo/) do + Process.clock_gettime(:foo) + end end def test_clock_gettime_unit @@ -2261,7 +2263,9 @@ EOS rescue Errno::EINVAL else assert_kind_of(Integer, r) - assert_raise(Errno::EINVAL) { Process.clock_getres(:foo) } + assert_raise_with_message(Errno::EINVAL, /:foo/) do + Process.clock_getres(:foo) + end end def test_clock_getres_constants |