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 collection 'multi)
(define version "7.2.0.6") (define version "7.2.0.7")
(define deps `("racket-lib" (define deps `("racket-lib"
["racket" #:version ,version])) ["racket" #:version ,version]))

View File

@ -160,7 +160,7 @@ is evaluated.
[level log-level/c] [level log-level/c]
[topic (or/c symbol? #f) (logger-name logger)] [topic (or/c symbol? #f) (logger-name logger)]
[message string?] [message string?]
[data any/c] [data any/c #f]
[prefix-message? any/c #t]) [prefix-message? any/c #t])
void?]{ 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 @racket[#f], then @racket[message] is prefixed with the topic followed
by @racket[": "] before it is sent to receivers. 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?] @defproc[(log-level? [logger logger?]

View File

@ -319,6 +319,21 @@
exn:fail:contract? exn:fail:contract?
#rx"define-logger: contract violation.+expected: \\(or/c logger\\? #f\\).+given: 'not-a-logger") #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) (report-errs)

View File

@ -93,15 +93,26 @@
(define/who log-message (define/who log-message
;; Complex dispatch based on number and whether third is a string: ;; Complex dispatch based on number and whether third is a string:
(case-lambda (case-lambda
[(logger level message data) [(logger level message)
(define topic (and (logger? logger) (logger-name logger))) (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?) [(logger level topic/message message/data data/prefix?)
(cond (cond
[(string? topic/message) [(string? topic/message)
(define topic (and (logger? logger) (logger-name logger))) (define topic (and (logger? logger) (logger-name logger)))
(do-log-message who logger level topic topic/message message/data data/prefix?)] (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)] (do-log-message who logger level topic/message message/data data/prefix? #t)]
[else [else
(check who logger? logger) (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-logger", make_logger, 0, -1, env);
ADD_NONCM_PRIM("make-log-receiver", make_log_reader, 2, -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?", logger_p, 1, 1, 1, env);
ADD_FOLDING_PRIM("logger-name", logger_name, 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); 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_Logger *logger;
Scheme_Object *bytes; Scheme_Object *bytes;
Scheme_Object *name; Scheme_Object *name;
Scheme_Object *data;
int level, pos, pfx; int level, pos, pfx;
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_logger_type)) 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]); pfx = SCHEME_TRUEP(argv[pos+1]);
else else
pfx = 1; pfx = 1;
if (pos >= argc)
data = scheme_false;
else
data = argv[pos];
scheme_log_name_pfx_message(logger, level, name, 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); pfx);
return scheme_void; return scheme_void;

View File

@ -13,12 +13,12 @@
consistently.) consistently.)
*/ */
#define MZSCHEME_VERSION "7.2.0.6" #define MZSCHEME_VERSION "7.2.0.7"
#define MZSCHEME_VERSION_X 7 #define MZSCHEME_VERSION_X 7
#define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Y 2
#define MZSCHEME_VERSION_Z 0 #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_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)