log-message: make data argument optional

The intent was never for the data argument to be optional, but a
mistake in traditional Racket's argument dispatch for `log-message`
made it optional in some cases, so the simplest way forward is to make
it consistently optional. Repair traditional Racket to use `#f`
instead of a random value when the data argument is not provided.
This commit is contained in:
Matthew Flatt 2019-03-03 09:57:44 -07:00
parent d71d68e72a
commit 29ad80905e
6 changed files with 43 additions and 10 deletions

View File

@ -12,7 +12,7 @@
(define collection 'multi)
(define version "7.2.0.6")
(define version "7.2.0.7")
(define deps `("racket-lib"
["racket" #:version ,version]))

View File

@ -160,7 +160,7 @@ is evaluated.
[level log-level/c]
[topic (or/c symbol? #f) (logger-name logger)]
[message string?]
[data any/c]
[data any/c #f]
[prefix-message? any/c #t])
void?]{
@ -174,7 +174,8 @@ addition, if @racket[topic] and @racket[prefix-message?] are not
@racket[#f], then @racket[message] is prefixed with the topic followed
by @racket[": "] before it is sent to receivers.
@history[#:changed "6.0.1.10" @elem{Added the @racket[prefix-message?] argument.}]}
@history[#:changed "6.0.1.10" @elem{Added the @racket[prefix-message?] argument.}
#:changed "7.2.0.7" @elem{Made the @racket[data] argument optional.}]}
@defproc[(log-level? [logger logger?]

View File

@ -319,6 +319,21 @@
exn:fail:contract?
#rx"define-logger: contract violation.+expected: \\(or/c logger\\? #f\\).+given: 'not-a-logger")
; --------------------
;; optional data for `log-message`
(let ()
(define logger (make-logger))
(define m (make-log-receiver logger 'error))
(log-message logger 'error 'whatever "hi")
(test '#(error "whatever: hi" #f whatever) sync m))
(let ()
(define logger (make-logger))
(define m (make-log-receiver logger 'error))
(log-message logger 'error "hi")
(test '#(error "hi" #f #f) sync m))
; --------------------
(report-errs)

View File

@ -93,15 +93,26 @@
(define/who log-message
;; Complex dispatch based on number and whether third is a string:
(case-lambda
[(logger level message data)
[(logger level message)
(define topic (and (logger? logger) (logger-name logger)))
(do-log-message who logger level topic message data #t)]
(do-log-message who logger level topic message #f #t)]
[(logger level topic/message message/data)
(cond
[(string? topic/message)
(define topic (and (logger? logger) (logger-name logger)))
(do-log-message who logger level topic topic/message message/data #t)]
[(or (not topic/message) (symbol? topic/message))
(do-log-message who logger level topic/message message/data #f #t)]
[else
(check who logger? logger)
(check-level who level)
(raise-argument-error who "(or/c string? symbol?)" topic/message)])]
[(logger level topic/message message/data data/prefix?)
(cond
[(string? topic/message)
(define topic (and (logger? logger) (logger-name logger)))
(do-log-message who logger level topic topic/message message/data data/prefix?)]
[(symbol? topic/message)
[(or (not topic/message) (symbol? topic/message))
(do-log-message who logger level topic/message message/data data/prefix? #t)]
[else
(check who logger? logger)

View File

@ -815,7 +815,7 @@ void scheme_init_error(Scheme_Startup_Env *env)
ADD_NONCM_PRIM("make-logger", make_logger, 0, -1, env);
ADD_NONCM_PRIM("make-log-receiver", make_log_reader, 2, -1, env);
ADD_PRIM_W_ARITY("log-message", log_message, 4, 6, env);
ADD_PRIM_W_ARITY("log-message", log_message, 3, 6, env);
ADD_FOLDING_PRIM("logger?", logger_p, 1, 1, 1, env);
ADD_FOLDING_PRIM("logger-name", logger_name, 1, 1, 1, env);
ADD_FOLDING_PRIM("log-receiver?", log_reader_p, 1, 1, 1, env);
@ -4062,6 +4062,7 @@ log_message(int argc, Scheme_Object *argv[])
Scheme_Logger *logger;
Scheme_Object *bytes;
Scheme_Object *name;
Scheme_Object *data;
int level, pos, pfx;
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_logger_type))
@ -4086,9 +4087,14 @@ log_message(int argc, Scheme_Object *argv[])
pfx = SCHEME_TRUEP(argv[pos+1]);
else
pfx = 1;
if (pos >= argc)
data = scheme_false;
else
data = argv[pos];
scheme_log_name_pfx_message(logger, level, name,
SCHEME_BYTE_STR_VAL(bytes), SCHEME_BYTE_STRLEN_VAL(bytes), argv[pos],
SCHEME_BYTE_STR_VAL(bytes), SCHEME_BYTE_STRLEN_VAL(bytes), data,
pfx);
return scheme_void;

View File

@ -13,12 +13,12 @@
consistently.)
*/
#define MZSCHEME_VERSION "7.2.0.6"
#define MZSCHEME_VERSION "7.2.0.7"
#define MZSCHEME_VERSION_X 7
#define MZSCHEME_VERSION_Y 2
#define MZSCHEME_VERSION_Z 0
#define MZSCHEME_VERSION_W 6
#define MZSCHEME_VERSION_W 7
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)