diff options
author | Nobuyoshi Nakada <[email protected]> | 2024-01-11 22:46:49 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2024-01-13 11:08:00 +0900 |
commit | 3edb7f1a0747b92ccc22f881e0a74530c0a7036e (patch) | |
tree | 4d890c1d1863fe739b6521e14de1153426c5c20c | |
parent | f7178045bb11fc3722a98082ed81e1ec39c4940f (diff) |
[DOC] Documentize known_errors
-rw-r--r-- | .document | 3 | ||||
-rw-r--r-- | error.c | 64 | ||||
-rw-r--r-- | template/Makefile.in | 11 | ||||
-rw-r--r-- | template/known_errors.inc.tmpl | 8 |
4 files changed, 57 insertions, 29 deletions
@@ -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 @@ -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 |