summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2024-01-11 22:46:49 +0900
committerNobuyoshi Nakada <[email protected]>2024-01-13 11:08:00 +0900
commit3edb7f1a0747b92ccc22f881e0a74530c0a7036e (patch)
tree4d890c1d1863fe739b6521e14de1153426c5c20c
parentf7178045bb11fc3722a98082ed81e1ec39c4940f (diff)
[DOC] Documentize known_errors
-rw-r--r--.document3
-rw-r--r--error.c64
-rw-r--r--template/Makefile.in11
-rw-r--r--template/known_errors.inc.tmpl8
4 files changed, 57 insertions, 29 deletions
diff --git a/.document b/.document
index e875e42546..0665d415b9 100644
--- a/.document
+++ b/.document
@@ -31,6 +31,9 @@ trace_point.rb
warning.rb
yjit.rb
+# Errno::*
+known_errors.inc
+
# the lib/ directory (which has its own .document file)
lib
diff --git a/error.c b/error.c
index 104e659dde..447e845e5e 100644
--- a/error.c
+++ b/error.c
@@ -2703,37 +2703,45 @@ rb_free_warning(void)
}
static VALUE
-set_syserr(int n, const char *name)
+setup_syserr(int n, const char *name)
{
- st_data_t error;
-
- if (!st_lookup(syserr_tbl, n, &error)) {
- error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
+ VALUE error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
- /* capture nonblock errnos for WaitReadable/WaitWritable subclasses */
- switch (n) {
- case EAGAIN:
- rb_eEAGAIN = error;
+ /* capture nonblock errnos for WaitReadable/WaitWritable subclasses */
+ switch (n) {
+ case EAGAIN:
+ rb_eEAGAIN = error;
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
- break;
- case EWOULDBLOCK:
+ break;
+ case EWOULDBLOCK:
#endif
- rb_eEWOULDBLOCK = error;
- break;
- case EINPROGRESS:
- rb_eEINPROGRESS = error;
- break;
- }
+ rb_eEWOULDBLOCK = error;
+ break;
+ case EINPROGRESS:
+ rb_eEINPROGRESS = error;
+ break;
+ }
+
+ rb_define_const(error, "Errno", INT2NUM(n));
+ st_add_direct(syserr_tbl, n, (st_data_t)error);
+ return error;
+}
+
+static VALUE
+set_syserr(int n, const char *name)
+{
+ st_data_t error;
- rb_define_const(error, "Errno", INT2NUM(n));
- st_add_direct(syserr_tbl, n, error);
+ if (!st_lookup(syserr_tbl, n, &error)) {
+ return setup_syserr(n, name);
}
else {
- rb_define_const(rb_mErrno, name, error);
+ VALUE errclass = (VALUE)error;
+ rb_define_const(rb_mErrno, name, errclass);
+ return errclass;
}
- return error;
}
static VALUE
@@ -2742,12 +2750,12 @@ get_syserr(int n)
st_data_t error;
if (!st_lookup(syserr_tbl, n, &error)) {
- char name[8]; /* some Windows' errno have 5 digits. */
+ char name[DECIMAL_SIZE_OF(n) + sizeof("E-")];
snprintf(name, sizeof(name), "E%03d", n);
- error = set_syserr(n, name);
+ return setup_syserr(n, name);
}
- return error;
+ return (VALUE)error;
}
/*
@@ -3840,9 +3848,13 @@ rb_check_copyable(VALUE obj, VALUE orig)
void
Init_syserr(void)
{
- rb_eNOERROR = set_syserr(0, "NOERROR");
+ rb_eNOERROR = setup_syserr(0, "NOERROR");
+#if 0
+ /* No error */
+ rb_define_const(rb_mErrno, "NOERROR", rb_eNOERROR);
+#endif
#define defined_error(name, num) set_syserr((num), (name));
-#define undefined_error(name) set_syserr(0, (name));
+#define undefined_error(name) rb_define_const(rb_mErrno, (name), rb_eNameError);
#include "known_errors.inc"
#undef defined_error
#undef undefined_error
diff --git a/template/Makefile.in b/template/Makefile.in
index 8c462f20fb..5b6cd87b06 100644
--- a/template/Makefile.in
+++ b/template/Makefile.in
@@ -575,7 +575,16 @@ update-benchmark-driver:
$(BENCHMARK_DRIVER_GIT_URL) benchmark-driver $(GIT_OPTS)
update-known-errors:
- errno --list | cut -d' ' -f1 | sort -u - $(srcdir)/defs/known_errors.def | \
+ errno --list | \
+ $(BASERUBY) -nl -e 'BEGIN {errs = {}}' \
+ -e '/^(E[A-Z_0-9]+)(?: +(?:\d+ +)?(.+))?/ =~ $$_ && errs[$$1] ||= $$2' \
+ -e 'END {' \
+ -e 'errs.delete("ELAST")' \
+ -e 'errs = errs.sort' \
+ -e 'errs << ["ELAST", "Largest errno"]' \
+ -e 'errs.each {|e,d| puts sprintf("%-15s %s", e, d).strip}' \
+ -e '}' \
+ $(srcdir)/defs/known_errors.def - | \
$(IFCHANGE) $(srcdir)/defs/known_errors.def -
INSNS = optinsn.inc optunifs.inc insns.inc insns_info.inc \
diff --git a/template/known_errors.inc.tmpl b/template/known_errors.inc.tmpl
index c3aee77477..4d453395ca 100644
--- a/template/known_errors.inc.tmpl
+++ b/template/known_errors.inc.tmpl
@@ -4,8 +4,12 @@
* template/known_errors.inc.tmpl and defs/known_errors.def.
*/
-% error_names = ARGF.read.split(/\s+/)
-% error_names.each do |name|
+% error_names = ARGF.readlines.map {|line| [$1, $2] if /\A([A-Z]\S+)(?:\s+(\S.*))?/ =~ line}.compact
+% error_names.each do |name, doc|
+#if 0
+ /* <% if doc %>"<%= doc %>"<% else %>\<%= name %><% end %> error */
+ rb_define_const(rb_mErrno, "<%=name%>", e<%=name%>);
+#endif
#ifdef <%=name%>
defined_error("<%=name%>", <%=name%>)
#else