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:
parent
dc9643aef6
commit
cdfc4912ad
|
@ -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)
|
||||||
|
|
|
@ -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]{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
@ -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])) {
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user