aboutsummaryrefslogtreecommitdiffstats
path: root/process.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-04-03 17:26:22 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-04-13 14:07:27 +0900
commit3612b1bed8b4a93fd85d4be448174d5c6ef4f473 (patch)
tree00e13bf7241d7a06549e715d8556a1f304efdebf /process.c
parent86db7a1cb87bc7cde49df2bac82d91ccdc514509 (diff)
downloadruby-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`.
Diffstat (limited to 'process.c')
-rw-r--r--process.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/process.c b/process.c
index 4159f1e210..7dbfca55f0 100644
--- a/process.c
+++ b/process.c
@@ -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)) {