racket/base: add exn:fail:filesystem:errno and exn:fail:network:errno

Provide raw error codes when available, which is mostly from filesystem
and networking primitives.
This commit is contained in:
Matthew Flatt 2012-12-31 08:18:30 -07:00
parent dc9643aef6
commit cdfc4912ad
12 changed files with 603 additions and 440 deletions

View File

@ -319,6 +319,26 @@
'(#f #f)
(quote-syntax exn:fail:filesystem)))
(λ () (quote-syntax kernel:exn:fail:filesystem:version)))))
(begin
(#%require
(rename '#%kernel
kernel:exn:fail:filesystem:errno
exn:fail:filesystem:errno))
(define make-exn:fail:filesystem:errno kernel:exn:fail:filesystem:errno)
(define-syntax exn:fail:filesystem:errno
(make-self-ctr-struct-info
(λ ()
(list
(quote-syntax struct:exn:fail:filesystem:errno)
(quote-syntax make-exn:fail:filesystem:errno)
(quote-syntax exn:fail:filesystem:errno?)
(list
(quote-syntax exn:fail:filesystem:errno-errno)
(quote-syntax exn-continuation-marks)
(quote-syntax exn-message))
'(#f #f #f)
(quote-syntax exn:fail:filesystem)))
(λ () (quote-syntax kernel:exn:fail:filesystem:errno)))))
(begin
(#%require (rename '#%kernel kernel:exn:fail:network exn:fail:network))
(define make-exn:fail:network kernel:exn:fail:network)
@ -335,6 +355,24 @@
'(#f #f)
(quote-syntax exn:fail)))
(λ () (quote-syntax kernel:exn:fail:network)))))
(begin
(#%require
(rename '#%kernel kernel:exn:fail:network:errno exn:fail:network:errno))
(define make-exn:fail:network:errno kernel:exn:fail:network:errno)
(define-syntax exn:fail:network:errno
(make-self-ctr-struct-info
(λ ()
(list
(quote-syntax struct:exn:fail:network:errno)
(quote-syntax make-exn:fail:network:errno)
(quote-syntax exn:fail:network:errno?)
(list
(quote-syntax exn:fail:network:errno-errno)
(quote-syntax exn-continuation-marks)
(quote-syntax exn-message))
'(#f #f #f)
(quote-syntax exn:fail:network)))
(λ () (quote-syntax kernel:exn:fail:network:errno)))))
(begin
(#%require
(rename '#%kernel kernel:exn:fail:out-of-memory exn:fail:out-of-memory))
@ -402,6 +440,23 @@
'(#f #f #f)
(quote-syntax exn)))
(λ () (quote-syntax kernel:exn:break)))))
(begin
(#%require (rename '#%kernel kernel:exn:break:hang-up exn:break:hang-up))
(define make-exn:break:hang-up kernel:exn:break:hang-up)
(define-syntax exn:break:hang-up
(make-self-ctr-struct-info
(λ ()
(list
(quote-syntax struct:exn:break:hang-up)
(quote-syntax make-exn:break:hang-up)
(quote-syntax exn:break:hang-up?)
(list
(quote-syntax exn:break-continuation)
(quote-syntax exn-continuation-marks)
(quote-syntax exn-message))
'(#f #f #f)
(quote-syntax exn:break)))
(λ () (quote-syntax kernel:exn:break:hang-up)))))
(begin
(#%require
(rename '#%kernel kernel:exn:break:terminate exn:break:terminate))
@ -420,23 +475,6 @@
'(#f #f #f)
(quote-syntax exn:break)))
(λ () (quote-syntax kernel:exn:break:terminate)))))
(begin
(#%require (rename '#%kernel kernel:exn:break:hang-up exn:break:hang-up))
(define make-exn:break:hang-up kernel:exn:break:hang-up)
(define-syntax exn:break:hang-up
(make-self-ctr-struct-info
(λ ()
(list
(quote-syntax struct:exn:break:hang-up)
(quote-syntax make-exn:break:hang-up)
(quote-syntax exn:break:hang-up?)
(list
(quote-syntax exn:break-continuation)
(quote-syntax exn-continuation-marks)
(quote-syntax exn-message))
'(#f #f #f)
(quote-syntax exn:break)))
(λ () (quote-syntax kernel:exn:break:hang-up)))))
(begin
(#%require (rename '#%kernel kernel:arity-at-least arity-at-least))
(define make-arity-at-least kernel:arity-at-least)

View File

@ -470,7 +470,9 @@ predicate, because the @racket[exn:break] exception typically should
not be caught (unless it will be re-raised to cooperatively
break). Beware, also, of catching and discarding exceptions, because
discarding an error message can make debugging unnecessarily
difficult.}
difficult; instead of discarding an error message, consider logging it
via @racket[log-error] or a logging form created by
@racket[define-logger].}
@defform[(with-handlers* ([pred-expr handler-expr] ...)
body ...+)]{
@ -587,7 +589,37 @@ structure is affected by the parameter. The default is @racket[#t].}
The base @tech{structure type} for exceptions. The @racket[message]
field contains an error message, and the @racket[continuation-marks]
field contains the value produced by @racket[(current-continuation-marks)]
immediately before the exception was raised.}
immediately before the exception was raised.
Exceptions raised by Racket form a hierarchy under @racket[exn]:
@racketblock[
exn
exn:fail
exn:fail:contract
exn:fail:contract:arity
exn:fail:contract:divide-by-zero
exn:fail:contract:non-fixnum-result
exn:fail:contract:continuation
exn:fail:contract:variable
exn:fail:syntax
exn:fail:syntax:unbound
exn:fail:read
exn:fail:read:eof
exn:fail:read:non-char
exn:fail:filesystem
exn:fail:filesystem:exists
exn:fail:filesystem:version
exn:fail:filesystem:errno
exn:fail:network
exn:fail:network:errno
exn:fail:out-of-memory
exn:fail:unsupported
exn:fail:user
exn:break
exn:break:hang-up
exn:break:terminate
]}
@defstruct[(exn:fail exn) ()
#:inspector #f]{
@ -679,12 +711,31 @@ already.}
Raised for a version-mismatch error when loading an extension.}
@defstruct[(exn:fail:filesystem:errno exn:fail:filesystem) ([errno (cons/c exact-integer? (or/c 'posix 'windows 'gai))])
#:inspector #f]{
Raised for a filesystem error for which a system error code is
available. The symbol part of an @racket[errno] field indicates the
category of the error code: @racket['posix] indicates a C/Posix
@tt{errno} value, @racket['windows] indicates a Windows system error
code (under Windows, only), and @racket['gai] indicates a
@tt{getaddrinfo} error code (which shows up only in
@racket[exn:fail:network:errno] exceptions for operations that resolve
hostnames, but it allowed in @racket[exn:fail:filesystem:errno]
instances for consistency).}
@defstruct[(exn:fail:network exn:fail) ()
#:inspector #f]{
Raised for TCP and UDP errors.}
@defstruct[(exn:fail:network:errno exn:fail:network) ([errno (cons/c exact-integer? (or/c 'posix 'windows 'gai))])
#:inspector #f]{
Raised for a TCP or UDP error for which a system error code is
available, where the @racket[errno] field is as for
@racket[exn:fail:filesystem:errno].}
@defstruct[(exn:fail:out-of-memory exn:fail) ()
#:inspector #f]{

View File

@ -259,7 +259,7 @@
(err/rt-test (open-input-file 8))
(err/rt-test (open-input-file "x" 8))
(err/rt-test (open-input-file "x" 'something-else))
(err/rt-test (open-input-file "badfile") exn:fail:filesystem?)
(err/rt-test (open-input-file "badfile") exn:fail:filesystem:errno?)
(arity-test open-output-file 1 1)
(err/rt-test (open-output-file 8))
@ -1559,4 +1559,12 @@
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(test #t exn? (exn:fail:filesystem:errno "a" (current-continuation-marks) '(10 . posix)))
(err/rt-test (exn:fail:filesystem:errno "a" (current-continuation-marks) 10))
(err/rt-test (exn:fail:filesystem:errno "a" (current-continuation-marks) '(10 posix)))
(err/rt-test (exn:fail:filesystem:errno "a" (current-continuation-marks) '(10)))
(err/rt-test (exn:fail:filesystem:errno "a" (current-continuation-marks) '#(10)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs)

View File

@ -57,7 +57,9 @@
(mkp "exn:fail:filesystem")
(mkp "exn:fail:filesystem:exists")
(mkp "exn:fail:filesystem:version")
(mkp "exn:fail:filesystem:errno")
(mkp "exn:fail:network")
(mkp "exn:fail:network:errno")
(mkp "exn:fail:out-of-memory")
(mkp "exn:fail:unsupported")
(mkp "exn:fail:user")

View File

@ -188,7 +188,7 @@
s)
(define s (q))
(err/rt-test (q) exn:fail:network?)
(err/rt-test (q) exn:fail:network:errno?)
(udp-close s))

View File

@ -1,3 +1,6 @@
Version 5.3.1.12
Added exn:fail:filesystem:errno and exn:fail:network:errno
Version 5.3.1.11
Changed log-message to support a name argument
Changed the synchronization result of a log receiver to include an

File diff suppressed because it is too large Load Diff

View File

@ -74,6 +74,9 @@ ROSYM static Scheme_Object *error_symbol;
ROSYM static Scheme_Object *warning_symbol;
ROSYM static Scheme_Object *info_symbol;
ROSYM static Scheme_Object *debug_symbol;
ROSYM static Scheme_Object *posix_symbol;
ROSYM static Scheme_Object *windows_symbol;
ROSYM static Scheme_Object *gai_symbol;
ROSYM static Scheme_Object *arity_property;
ROSYM static Scheme_Object *def_err_val_proc;
ROSYM static Scheme_Object *def_error_esc_proc;
@ -270,7 +273,8 @@ Scheme_Config *scheme_init_error_escape_proc(Scheme_Config *config)
is used only if the boolean is 1
*/
static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list args, char **_s)
static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list args, char **_s,
Scheme_Object **_errno_val)
/* NULL for s means allocate the buffer here (and return in (_s), but this function
doesn't allocate before extracting arguments from the stack. */
{
@ -460,6 +464,7 @@ static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list
{
int en, he, none = 0;
char *es;
Scheme_Object *err_kind;
if (type == 'm') {
none = !ints[ip++];
@ -482,13 +487,16 @@ static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list
else
es = NULL;
if (he)
if (he) {
es = (char *)scheme_hostname_error(en);
err_kind = gai_symbol;
}
if ((en || es) && !none) {
#ifdef NO_STRERROR_AVAILABLE
if (!es)
es = "Unknown error";
err_kind = posix_symbol;
#else
# ifdef DOS_FILE_SYSTEM
wchar_t mbuf[256];
@ -509,16 +517,23 @@ static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list
else
break;
}
err_kind = windows_symbol;
}
}
# endif
if (!es)
if (!es) {
es = strerror(en);
err_kind = posix_symbol;
}
#endif
tlen = strlen(es) + 24;
t = (const char *)scheme_malloc_atomic(tlen);
sprintf((char *)t, "%s; errno=%d", es, en);
tlen = strlen(t);
if (_errno_val) {
err_kind = scheme_make_pair(scheme_make_integer_value(en), err_kind);
*_errno_val = err_kind;
}
} else {
if (none) {
t = "";
@ -648,7 +663,7 @@ static intptr_t scheme_sprintf(char *s, intptr_t maxlen, const char *msg, ...)
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, msg));
len = sch_vsprintf(s, maxlen, msg, args, NULL);
len = sch_vsprintf(s, maxlen, msg, args, NULL, NULL);
HIDE_FROM_XFORM(va_end(args));
return len;
@ -727,6 +742,13 @@ void scheme_init_error(Scheme_Env *env)
info_symbol = scheme_intern_symbol("info");
debug_symbol = scheme_intern_symbol("debug");
REGISTER_SO(posix_symbol);
REGISTER_SO(windows_symbol);
REGISTER_SO(gai_symbol);
posix_symbol = scheme_intern_symbol("posix");
windows_symbol = scheme_intern_symbol("windows");
gai_symbol = scheme_intern_symbol("gai");
REGISTER_SO(arity_property);
{
Scheme_Object *guard;
@ -929,7 +951,7 @@ scheme_signal_error (const char *msg, ...)
intptr_t len;
HIDE_FROM_XFORM(va_start(args, msg));
len = sch_vsprintf(NULL, 0, msg, args, &buffer);
len = sch_vsprintf(NULL, 0, msg, args, &buffer, NULL);
HIDE_FROM_XFORM(va_end(args));
if (scheme_current_thread->current_local_env) {
@ -961,7 +983,7 @@ void scheme_warning(char *msg, ...)
intptr_t len;
HIDE_FROM_XFORM(va_start(args, msg));
len = sch_vsprintf(NULL, 0, msg, args, &buffer);
len = sch_vsprintf(NULL, 0, msg, args, &buffer, NULL);
HIDE_FROM_XFORM(va_end(args));
buffer[len++] = '\n';
@ -985,7 +1007,7 @@ void scheme_log(Scheme_Logger *logger, int level, int flags,
}
HIDE_FROM_XFORM(va_start(args, msg));
len = sch_vsprintf(NULL, 0, msg, args, &buffer);
len = sch_vsprintf(NULL, 0, msg, args, &buffer, NULL);
HIDE_FROM_XFORM(va_end(args));
buffer[len] = 0;
@ -1008,7 +1030,7 @@ void scheme_log_w_data(Scheme_Logger *logger, int level, int flags,
}
HIDE_FROM_XFORM(va_start(args, msg));
len = sch_vsprintf(NULL, 0, msg, args, &buffer);
len = sch_vsprintf(NULL, 0, msg, args, &buffer, NULL);
HIDE_FROM_XFORM(va_end(args));
buffer[len] = 0;
@ -2038,7 +2060,7 @@ void scheme_read_err(Scheme_Object *port,
Scheme_Object *loc;
HIDE_FROM_XFORM(va_start(args, detail));
slen = sch_vsprintf(NULL, 0, detail, args, &s);
slen = sch_vsprintf(NULL, 0, detail, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
ls = "";
@ -2315,7 +2337,7 @@ void scheme_wrong_syntax(const char *where,
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail));
slen = sch_vsprintf(NULL, 0, detail, args, &s);
slen = sch_vsprintf(NULL, 0, detail, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
}
@ -2332,7 +2354,7 @@ void scheme_unbound_syntax(const char *where,
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail));
slen = sch_vsprintf(NULL, 0, detail, args, &s);
slen = sch_vsprintf(NULL, 0, detail, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
do_wrong_syntax(where, detail_form, form, s, slen, scheme_null, MZEXN_FAIL_SYNTAX_UNBOUND);
@ -2354,7 +2376,7 @@ void scheme_wrong_syntax_with_more_sources(const char *where,
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail));
slen = sch_vsprintf(NULL, 0, detail, args, &s);
slen = sch_vsprintf(NULL, 0, detail, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
}
@ -2399,7 +2421,7 @@ void scheme_wrong_return_arity(const char *where,
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail));
slen = sch_vsprintf(NULL, 0, detail, args, &s);
slen = sch_vsprintf(NULL, 0, detail, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
}
@ -2458,7 +2480,7 @@ void scheme_raise_out_of_memory(const char *where, const char *msg, ...)
GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, msg));
slen = sch_vsprintf(NULL, 0, msg, args, &s);
slen = sch_vsprintf(NULL, 0, msg, args, &s, NULL);
HIDE_FROM_XFORM(va_end(args));
}
@ -3982,7 +4004,7 @@ scheme_raise_exn(int id, ...)
intptr_t alen;
char *msg;
int i, c;
Scheme_Object *eargs[MZEXN_MAXARGS];
Scheme_Object *eargs[MZEXN_MAXARGS], *errno_val = NULL;
char *buffer;
/* Precise GC: Don't allocate before getting hidden args off stack */
@ -3999,12 +4021,23 @@ scheme_raise_exn(int id, ...)
msg = mzVA_ARG(args, char*);
alen = sch_vsprintf(NULL, 0, msg, args, &buffer);
alen = sch_vsprintf(NULL, 0, msg, args, &buffer, &errno_val);
HIDE_FROM_XFORM(va_end(args));
#ifndef NO_SCHEME_EXNS
eargs[0] = scheme_make_immutable_sized_utf8_string(buffer, alen);
eargs[1] = TMP_CMARK_VALUE;
if (errno_val) {
if (id == MZEXN_FAIL_FILESYSTEM) {
id = MZEXN_FAIL_FILESYSTEM_ERRNO;
eargs[2] = errno_val;
c++;
} else if (id == MZEXN_FAIL_NETWORK) {
id = MZEXN_FAIL_NETWORK_ERRNO;
eargs[2] = errno_val;
c++;
}
}
do_raise(scheme_make_struct_instance(exn_table[id].type,
c, eargs),
@ -4318,6 +4351,18 @@ static Scheme_Object *break_field_check(int argc, Scheme_Object **argv)
return scheme_values(3, argv);
}
static Scheme_Object *errno_field_check(int argc, Scheme_Object **argv)
{
if (!SCHEME_PAIRP(argv[2])
|| !scheme_exact_p(SCHEME_CAR(argv[2]))
|| !(SAME_OBJ(SCHEME_CDR(argv[2]), posix_symbol)
|| SAME_OBJ(SCHEME_CDR(argv[2]), windows_symbol)
|| SAME_OBJ(SCHEME_CDR(argv[2]), gai_symbol)))
scheme_wrong_field_contract(argv[3], "(cons/c exact-integer? (or/c 'posix 'windows 'gai))", argv[2]);
return scheme_values (3, argv);
}
static Scheme_Object *extract_syntax_locations(int argc, Scheme_Object **argv)
{
if (scheme_is_struct_instance(exn_table[MZEXN_FAIL_SYNTAX].type, argv[0])) {

View File

@ -57,8 +57,14 @@ propeties (the latter in curly braces), strings are contracts/comments.
(non-char [] "unexpected non-character"))
(filesystem [] "error manipulating a filesystem object"
(exists [] "attempt to create a file that exists already")
(version [] "version mismatch loading an extension"))
(network [] "TCP and UDP errors")
(version [] "version mismatch loading an extension")
(errno [errno_field_check
(errno "pair of symbol and number" "system error code")]
"error with system error code"))
(network [] "TCP and UDP errors"
(errno [errno_field_check
(errno "pair of symbol and number" "system error code")]
"error with system error code"))
(out-of-memory [] "out of memory")
(unsupported [] "unsupported feature")
(user [] "for end users"))

View File

@ -18,13 +18,15 @@ enum {
MZEXN_FAIL_FILESYSTEM,
MZEXN_FAIL_FILESYSTEM_EXISTS,
MZEXN_FAIL_FILESYSTEM_VERSION,
MZEXN_FAIL_FILESYSTEM_ERRNO,
MZEXN_FAIL_NETWORK,
MZEXN_FAIL_NETWORK_ERRNO,
MZEXN_FAIL_OUT_OF_MEMORY,
MZEXN_FAIL_UNSUPPORTED,
MZEXN_FAIL_USER,
MZEXN_BREAK,
MZEXN_BREAK_TERMINATE,
MZEXN_BREAK_HANG_UP,
MZEXN_BREAK_TERMINATE,
MZEXN_OTHER
};
#endif
@ -51,13 +53,15 @@ static exn_rec exn_table[] = {
{ 2, NULL, NULL, 0, NULL, 1 },
{ 2, NULL, NULL, 0, NULL, 13 },
{ 2, NULL, NULL, 0, NULL, 13 },
{ 3, NULL, NULL, 0, NULL, 13 },
{ 2, NULL, NULL, 0, NULL, 1 },
{ 3, NULL, NULL, 0, NULL, 17 },
{ 2, NULL, NULL, 0, NULL, 1 },
{ 2, NULL, NULL, 0, NULL, 1 },
{ 2, NULL, NULL, 0, NULL, 1 },
{ 3, NULL, NULL, 0, NULL, 0 },
{ 3, NULL, NULL, 0, NULL, 20 },
{ 3, NULL, NULL, 0, NULL, 20 }
{ 3, NULL, NULL, 0, NULL, 22 },
{ 3, NULL, NULL, 0, NULL, 22 }
};
#else
static exn_rec *exn_table;
@ -85,13 +89,15 @@ static exn_rec *exn_table;
exn_table[MZEXN_FAIL_FILESYSTEM].args = 2;
exn_table[MZEXN_FAIL_FILESYSTEM_EXISTS].args = 2;
exn_table[MZEXN_FAIL_FILESYSTEM_VERSION].args = 2;
exn_table[MZEXN_FAIL_FILESYSTEM_ERRNO].args = 3;
exn_table[MZEXN_FAIL_NETWORK].args = 2;
exn_table[MZEXN_FAIL_NETWORK_ERRNO].args = 3;
exn_table[MZEXN_FAIL_OUT_OF_MEMORY].args = 2;
exn_table[MZEXN_FAIL_UNSUPPORTED].args = 2;
exn_table[MZEXN_FAIL_USER].args = 2;
exn_table[MZEXN_BREAK].args = 3;
exn_table[MZEXN_BREAK_TERMINATE].args = 3;
exn_table[MZEXN_BREAK_HANG_UP].args = 3;
exn_table[MZEXN_BREAK_TERMINATE].args = 3;
#endif
#endif
@ -101,6 +107,8 @@ static exn_rec *exn_table;
static const char *MZEXN_FAIL_CONTRACT_VARIABLE_FIELDS[1] = { "id" };
static const char *MZEXN_FAIL_SYNTAX_FIELDS[1] = { "exprs" };
static const char *MZEXN_FAIL_READ_FIELDS[1] = { "srclocs" };
static const char *MZEXN_FAIL_FILESYSTEM_ERRNO_FIELDS[1] = { "errno" };
static const char *MZEXN_FAIL_NETWORK_ERRNO_FIELDS[1] = { "errno" };
static const char *MZEXN_BREAK_FIELDS[1] = { "continuation" };
#endif
@ -126,11 +134,13 @@ static exn_rec *exn_table;
SETUP_STRUCT(MZEXN_FAIL_FILESYSTEM, EXN_PARENT(MZEXN_FAIL), "exn:fail:filesystem", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_FILESYSTEM_EXISTS, EXN_PARENT(MZEXN_FAIL_FILESYSTEM), "exn:fail:filesystem:exists", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_FILESYSTEM_VERSION, EXN_PARENT(MZEXN_FAIL_FILESYSTEM), "exn:fail:filesystem:version", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_FILESYSTEM_ERRNO, EXN_PARENT(MZEXN_FAIL_FILESYSTEM), "exn:fail:filesystem:errno", 1, MZEXN_FAIL_FILESYSTEM_ERRNO_FIELDS, scheme_null, scheme_make_prim(errno_field_check))
SETUP_STRUCT(MZEXN_FAIL_NETWORK, EXN_PARENT(MZEXN_FAIL), "exn:fail:network", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_NETWORK_ERRNO, EXN_PARENT(MZEXN_FAIL_NETWORK), "exn:fail:network:errno", 1, MZEXN_FAIL_NETWORK_ERRNO_FIELDS, scheme_null, scheme_make_prim(errno_field_check))
SETUP_STRUCT(MZEXN_FAIL_OUT_OF_MEMORY, EXN_PARENT(MZEXN_FAIL), "exn:fail:out-of-memory", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_UNSUPPORTED, EXN_PARENT(MZEXN_FAIL), "exn:fail:unsupported", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_FAIL_USER, EXN_PARENT(MZEXN_FAIL), "exn:fail:user", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_BREAK, EXN_PARENT(MZEXN), "exn:break", 1, MZEXN_BREAK_FIELDS, scheme_null, scheme_make_prim(break_field_check))
SETUP_STRUCT(MZEXN_BREAK_TERMINATE, EXN_PARENT(MZEXN_BREAK), "exn:break:terminate", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_BREAK_HANG_UP, EXN_PARENT(MZEXN_BREAK), "exn:break:hang-up", 0, NULL, scheme_null, NULL)
SETUP_STRUCT(MZEXN_BREAK_TERMINATE, EXN_PARENT(MZEXN_BREAK), "exn:break:terminate", 0, NULL, scheme_null, NULL)
#endif

View File

@ -14,7 +14,7 @@
#define USE_COMPILED_STARTUP 1
#define EXPECTED_PRIM_COUNT 1076
#define EXPECTED_PRIM_COUNT 1084
#define EXPECTED_UNSAFE_COUNT 80
#define EXPECTED_FLFXNUM_COUNT 69
#define EXPECTED_FUTURES_COUNT 15

View File

@ -13,12 +13,12 @@
consistently.)
*/
#define MZSCHEME_VERSION "5.3.1.11"
#define MZSCHEME_VERSION "5.3.1.12"
#define MZSCHEME_VERSION_X 5
#define MZSCHEME_VERSION_Y 3
#define MZSCHEME_VERSION_Z 1
#define MZSCHEME_VERSION_W 11
#define MZSCHEME_VERSION_W 12
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)