[DOC] Documentize known_errors

This commit is contained in:
Nobuyoshi Nakada 2024-01-11 22:46:49 +09:00
parent f7178045bb
commit 3edb7f1a07
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
4 changed files with 59 additions and 31 deletions

View File

@ -31,6 +31,9 @@ trace_point.rb
warning.rb warning.rb
yjit.rb yjit.rb
# Errno::*
known_errors.inc
# the lib/ directory (which has its own .document file) # the lib/ directory (which has its own .document file)
lib lib

68
error.c
View File

@ -2702,38 +2702,46 @@ rb_free_warning(void)
st_free_table(syserr_tbl); st_free_table(syserr_tbl);
} }
static VALUE
setup_syserr(int n, const char *name)
{
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;
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
break;
case EWOULDBLOCK:
#endif
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 static VALUE
set_syserr(int n, const char *name) set_syserr(int n, const char *name)
{ {
st_data_t error; st_data_t error;
if (!st_lookup(syserr_tbl, n, &error)) { if (!st_lookup(syserr_tbl, n, &error)) {
error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError); return setup_syserr(n, name);
/* capture nonblock errnos for WaitReadable/WaitWritable subclasses */
switch (n) {
case EAGAIN:
rb_eEAGAIN = error;
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
break;
case EWOULDBLOCK:
#endif
rb_eEWOULDBLOCK = error;
break;
case EINPROGRESS:
rb_eEINPROGRESS = error;
break;
}
rb_define_const(error, "Errno", INT2NUM(n));
st_add_direct(syserr_tbl, n, error);
} }
else { 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 static VALUE
@ -2742,12 +2750,12 @@ get_syserr(int n)
st_data_t error; st_data_t error;
if (!st_lookup(syserr_tbl, n, &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); 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 void
Init_syserr(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 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" #include "known_errors.inc"
#undef defined_error #undef defined_error
#undef undefined_error #undef undefined_error

View File

@ -575,7 +575,16 @@ update-benchmark-driver:
$(BENCHMARK_DRIVER_GIT_URL) benchmark-driver $(GIT_OPTS) $(BENCHMARK_DRIVER_GIT_URL) benchmark-driver $(GIT_OPTS)
update-known-errors: 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 - $(IFCHANGE) $(srcdir)/defs/known_errors.def -
INSNS = optinsn.inc optunifs.inc insns.inc insns_info.inc \ INSNS = optinsn.inc optunifs.inc insns.inc insns_info.inc \

View File

@ -4,8 +4,12 @@
* template/known_errors.inc.tmpl and defs/known_errors.def. * template/known_errors.inc.tmpl and defs/known_errors.def.
*/ */
% error_names = ARGF.read.split(/\s+/) % error_names = ARGF.readlines.map {|line| [$1, $2] if /\A([A-Z]\S+)(?:\s+(\S.*))?/ =~ line}.compact
% error_names.each do |name| % 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%> #ifdef <%=name%>
defined_error("<%=name%>", <%=name%>) defined_error("<%=name%>", <%=name%>)
#else #else