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) '(#f #f)
(quote-syntax exn:fail:filesystem))) (quote-syntax exn:fail:filesystem)))
(λ () (quote-syntax kernel:exn:fail:filesystem:version))))) (λ () (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 (begin
(#%require (rename '#%kernel kernel:exn:fail:network exn:fail:network)) (#%require (rename '#%kernel kernel:exn:fail:network exn:fail:network))
(define make-exn:fail:network kernel:exn:fail:network) (define make-exn:fail:network kernel:exn:fail:network)
@ -335,6 +355,24 @@
'(#f #f) '(#f #f)
(quote-syntax exn:fail))) (quote-syntax exn:fail)))
(λ () (quote-syntax kernel:exn:fail:network))))) (λ () (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 (begin
(#%require (#%require
(rename '#%kernel kernel:exn:fail:out-of-memory exn:fail:out-of-memory)) (rename '#%kernel kernel:exn:fail:out-of-memory exn:fail:out-of-memory))
@ -402,6 +440,23 @@
'(#f #f #f) '(#f #f #f)
(quote-syntax exn))) (quote-syntax exn)))
(λ () (quote-syntax kernel:exn:break))))) (λ () (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 (begin
(#%require (#%require
(rename '#%kernel kernel:exn:break:terminate exn:break:terminate)) (rename '#%kernel kernel:exn:break:terminate exn:break:terminate))
@ -420,23 +475,6 @@
'(#f #f #f) '(#f #f #f)
(quote-syntax exn:break))) (quote-syntax exn:break)))
(λ () (quote-syntax kernel:exn:break:terminate))))) (λ () (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 (begin
(#%require (rename '#%kernel kernel:arity-at-least arity-at-least)) (#%require (rename '#%kernel kernel:arity-at-least arity-at-least))
(define make-arity-at-least kernel: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 not be caught (unless it will be re-raised to cooperatively
break). Beware, also, of catching and discarding exceptions, because break). Beware, also, of catching and discarding exceptions, because
discarding an error message can make debugging unnecessarily 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] ...) @defform[(with-handlers* ([pred-expr handler-expr] ...)
body ...+)]{ 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] The base @tech{structure type} for exceptions. The @racket[message]
field contains an error message, and the @racket[continuation-marks] field contains an error message, and the @racket[continuation-marks]
field contains the value produced by @racket[(current-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) () @defstruct[(exn:fail exn) ()
#:inspector #f]{ #:inspector #f]{
@ -679,12 +711,31 @@ already.}
Raised for a version-mismatch error when loading an extension.} 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) () @defstruct[(exn:fail:network exn:fail) ()
#:inspector #f]{ #:inspector #f]{
Raised for TCP and UDP errors.} 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) () @defstruct[(exn:fail:out-of-memory exn:fail) ()
#:inspector #f]{ #:inspector #f]{

View File

@ -259,7 +259,7 @@
(err/rt-test (open-input-file 8)) (err/rt-test (open-input-file 8))
(err/rt-test (open-input-file "x" 8)) (err/rt-test (open-input-file "x" 8))
(err/rt-test (open-input-file "x" 'something-else)) (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) (arity-test open-output-file 1 1)
(err/rt-test (open-output-file 8)) (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) (report-errs)

View File

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

View File

@ -188,7 +188,7 @@
s) s)
(define s (q)) (define s (q))
(err/rt-test (q) exn:fail:network?) (err/rt-test (q) exn:fail:network:errno?)
(udp-close s)) (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 Version 5.3.1.11
Changed log-message to support a name argument Changed log-message to support a name argument
Changed the synchronization result of a log receiver to include an 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 *warning_symbol;
ROSYM static Scheme_Object *info_symbol; ROSYM static Scheme_Object *info_symbol;
ROSYM static Scheme_Object *debug_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 *arity_property;
ROSYM static Scheme_Object *def_err_val_proc; ROSYM static Scheme_Object *def_err_val_proc;
ROSYM static Scheme_Object *def_error_esc_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 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 /* NULL for s means allocate the buffer here (and return in (_s), but this function
doesn't allocate before extracting arguments from the stack. */ 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; int en, he, none = 0;
char *es; char *es;
Scheme_Object *err_kind;
if (type == 'm') { if (type == 'm') {
none = !ints[ip++]; none = !ints[ip++];
@ -482,13 +487,16 @@ static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list
else else
es = NULL; es = NULL;
if (he) if (he) {
es = (char *)scheme_hostname_error(en); es = (char *)scheme_hostname_error(en);
err_kind = gai_symbol;
}
if ((en || es) && !none) { if ((en || es) && !none) {
#ifdef NO_STRERROR_AVAILABLE #ifdef NO_STRERROR_AVAILABLE
if (!es) if (!es)
es = "Unknown error"; es = "Unknown error";
err_kind = posix_symbol;
#else #else
# ifdef DOS_FILE_SYSTEM # ifdef DOS_FILE_SYSTEM
wchar_t mbuf[256]; wchar_t mbuf[256];
@ -509,16 +517,23 @@ static intptr_t sch_vsprintf(char *s, intptr_t maxlen, const char *msg, va_list
else else
break; break;
} }
err_kind = windows_symbol;
} }
} }
# endif # endif
if (!es) if (!es) {
es = strerror(en); es = strerror(en);
err_kind = posix_symbol;
}
#endif #endif
tlen = strlen(es) + 24; tlen = strlen(es) + 24;
t = (const char *)scheme_malloc_atomic(tlen); t = (const char *)scheme_malloc_atomic(tlen);
sprintf((char *)t, "%s; errno=%d", es, en); sprintf((char *)t, "%s; errno=%d", es, en);
tlen = strlen(t); tlen = strlen(t);
if (_errno_val) {
err_kind = scheme_make_pair(scheme_make_integer_value(en), err_kind);
*_errno_val = err_kind;
}
} else { } else {
if (none) { if (none) {
t = ""; t = "";
@ -648,7 +663,7 @@ static intptr_t scheme_sprintf(char *s, intptr_t maxlen, const char *msg, ...)
GC_CAN_IGNORE va_list args; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, msg)); 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)); HIDE_FROM_XFORM(va_end(args));
return len; return len;
@ -727,6 +742,13 @@ void scheme_init_error(Scheme_Env *env)
info_symbol = scheme_intern_symbol("info"); info_symbol = scheme_intern_symbol("info");
debug_symbol = scheme_intern_symbol("debug"); 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); REGISTER_SO(arity_property);
{ {
Scheme_Object *guard; Scheme_Object *guard;
@ -929,7 +951,7 @@ scheme_signal_error (const char *msg, ...)
intptr_t len; intptr_t len;
HIDE_FROM_XFORM(va_start(args, msg)); 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)); HIDE_FROM_XFORM(va_end(args));
if (scheme_current_thread->current_local_env) { if (scheme_current_thread->current_local_env) {
@ -961,7 +983,7 @@ void scheme_warning(char *msg, ...)
intptr_t len; intptr_t len;
HIDE_FROM_XFORM(va_start(args, msg)); 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)); HIDE_FROM_XFORM(va_end(args));
buffer[len++] = '\n'; buffer[len++] = '\n';
@ -985,7 +1007,7 @@ void scheme_log(Scheme_Logger *logger, int level, int flags,
} }
HIDE_FROM_XFORM(va_start(args, msg)); 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)); HIDE_FROM_XFORM(va_end(args));
buffer[len] = 0; 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)); 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)); HIDE_FROM_XFORM(va_end(args));
buffer[len] = 0; buffer[len] = 0;
@ -2038,7 +2060,7 @@ void scheme_read_err(Scheme_Object *port,
Scheme_Object *loc; Scheme_Object *loc;
HIDE_FROM_XFORM(va_start(args, detail)); 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)); HIDE_FROM_XFORM(va_end(args));
ls = ""; ls = "";
@ -2315,7 +2337,7 @@ void scheme_wrong_syntax(const char *where,
GC_CAN_IGNORE va_list args; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail)); 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)); HIDE_FROM_XFORM(va_end(args));
} }
@ -2332,7 +2354,7 @@ void scheme_unbound_syntax(const char *where,
GC_CAN_IGNORE va_list args; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail)); 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)); HIDE_FROM_XFORM(va_end(args));
do_wrong_syntax(where, detail_form, form, s, slen, scheme_null, MZEXN_FAIL_SYNTAX_UNBOUND); 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; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail)); 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)); HIDE_FROM_XFORM(va_end(args));
} }
@ -2399,7 +2421,7 @@ void scheme_wrong_return_arity(const char *where,
GC_CAN_IGNORE va_list args; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, detail)); 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)); 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; GC_CAN_IGNORE va_list args;
HIDE_FROM_XFORM(va_start(args, msg)); 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)); HIDE_FROM_XFORM(va_end(args));
} }
@ -3982,7 +4004,7 @@ scheme_raise_exn(int id, ...)
intptr_t alen; intptr_t alen;
char *msg; char *msg;
int i, c; int i, c;
Scheme_Object *eargs[MZEXN_MAXARGS]; Scheme_Object *eargs[MZEXN_MAXARGS], *errno_val = NULL;
char *buffer; char *buffer;
/* Precise GC: Don't allocate before getting hidden args off stack */ /* 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*); 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)); HIDE_FROM_XFORM(va_end(args));
#ifndef NO_SCHEME_EXNS #ifndef NO_SCHEME_EXNS
eargs[0] = scheme_make_immutable_sized_utf8_string(buffer, alen); eargs[0] = scheme_make_immutable_sized_utf8_string(buffer, alen);
eargs[1] = TMP_CMARK_VALUE; 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, do_raise(scheme_make_struct_instance(exn_table[id].type,
c, eargs), c, eargs),
@ -4318,6 +4351,18 @@ static Scheme_Object *break_field_check(int argc, Scheme_Object **argv)
return scheme_values(3, 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) static Scheme_Object *extract_syntax_locations(int argc, Scheme_Object **argv)
{ {
if (scheme_is_struct_instance(exn_table[MZEXN_FAIL_SYNTAX].type, argv[0])) { 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")) (non-char [] "unexpected non-character"))
(filesystem [] "error manipulating a filesystem object" (filesystem [] "error manipulating a filesystem object"
(exists [] "attempt to create a file that exists already") (exists [] "attempt to create a file that exists already")
(version [] "version mismatch loading an extension")) (version [] "version mismatch loading an extension")
(network [] "TCP and UDP errors") (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") (out-of-memory [] "out of memory")
(unsupported [] "unsupported feature") (unsupported [] "unsupported feature")
(user [] "for end users")) (user [] "for end users"))

View File

@ -18,13 +18,15 @@ enum {
MZEXN_FAIL_FILESYSTEM, MZEXN_FAIL_FILESYSTEM,
MZEXN_FAIL_FILESYSTEM_EXISTS, MZEXN_FAIL_FILESYSTEM_EXISTS,
MZEXN_FAIL_FILESYSTEM_VERSION, MZEXN_FAIL_FILESYSTEM_VERSION,
MZEXN_FAIL_FILESYSTEM_ERRNO,
MZEXN_FAIL_NETWORK, MZEXN_FAIL_NETWORK,
MZEXN_FAIL_NETWORK_ERRNO,
MZEXN_FAIL_OUT_OF_MEMORY, MZEXN_FAIL_OUT_OF_MEMORY,
MZEXN_FAIL_UNSUPPORTED, MZEXN_FAIL_UNSUPPORTED,
MZEXN_FAIL_USER, MZEXN_FAIL_USER,
MZEXN_BREAK, MZEXN_BREAK,
MZEXN_BREAK_TERMINATE,
MZEXN_BREAK_HANG_UP, MZEXN_BREAK_HANG_UP,
MZEXN_BREAK_TERMINATE,
MZEXN_OTHER MZEXN_OTHER
}; };
#endif #endif
@ -51,13 +53,15 @@ static exn_rec exn_table[] = {
{ 2, NULL, NULL, 0, NULL, 1 }, { 2, NULL, NULL, 0, NULL, 1 },
{ 2, NULL, NULL, 0, NULL, 13 }, { 2, NULL, NULL, 0, NULL, 13 },
{ 2, NULL, NULL, 0, NULL, 13 }, { 2, NULL, NULL, 0, NULL, 13 },
{ 3, NULL, NULL, 0, NULL, 13 },
{ 2, NULL, NULL, 0, NULL, 1 }, { 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 }, { 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, 0 },
{ 3, NULL, NULL, 0, NULL, 20 }, { 3, NULL, NULL, 0, NULL, 22 },
{ 3, NULL, NULL, 0, NULL, 20 } { 3, NULL, NULL, 0, NULL, 22 }
}; };
#else #else
static exn_rec *exn_table; 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].args = 2;
exn_table[MZEXN_FAIL_FILESYSTEM_EXISTS].args = 2; exn_table[MZEXN_FAIL_FILESYSTEM_EXISTS].args = 2;
exn_table[MZEXN_FAIL_FILESYSTEM_VERSION].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].args = 2;
exn_table[MZEXN_FAIL_NETWORK_ERRNO].args = 3;
exn_table[MZEXN_FAIL_OUT_OF_MEMORY].args = 2; exn_table[MZEXN_FAIL_OUT_OF_MEMORY].args = 2;
exn_table[MZEXN_FAIL_UNSUPPORTED].args = 2; exn_table[MZEXN_FAIL_UNSUPPORTED].args = 2;
exn_table[MZEXN_FAIL_USER].args = 2; exn_table[MZEXN_FAIL_USER].args = 2;
exn_table[MZEXN_BREAK].args = 3; 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_HANG_UP].args = 3;
exn_table[MZEXN_BREAK_TERMINATE].args = 3;
#endif #endif
#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_CONTRACT_VARIABLE_FIELDS[1] = { "id" };
static const char *MZEXN_FAIL_SYNTAX_FIELDS[1] = { "exprs" }; static const char *MZEXN_FAIL_SYNTAX_FIELDS[1] = { "exprs" };
static const char *MZEXN_FAIL_READ_FIELDS[1] = { "srclocs" }; 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" }; static const char *MZEXN_BREAK_FIELDS[1] = { "continuation" };
#endif #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, 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_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_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, 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_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_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_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, 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_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 #endif

View File

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

View File

@ -13,12 +13,12 @@
consistently.) consistently.)
*/ */
#define MZSCHEME_VERSION "5.3.1.11" #define MZSCHEME_VERSION "5.3.1.12"
#define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_X 5
#define MZSCHEME_VERSION_Y 3 #define MZSCHEME_VERSION_Y 3
#define MZSCHEME_VERSION_Z 1 #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_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)