diff --git a/racket/src/ChezScheme/LOG b/racket/src/ChezScheme/LOG index 578b69321e..fb55caef59 100644 --- a/racket/src/ChezScheme/LOG +++ b/racket/src/ChezScheme/LOG @@ -2129,3 +2129,9 @@ - proper unicode handling when retrieving error messages from the OS on Windows windows.c +- repair collector handling of an ephemerons that refers to a + younger object during incremental promotion + gc.c, 4.ms +- added textual-output-port checks for record-writer write argument + print.ss, + record.ms, root-experr* diff --git a/racket/src/ChezScheme/mats/record.ms b/racket/src/ChezScheme/mats/record.ms index 739af5ccc1..e947fda0b0 100644 --- a/racket/src/ChezScheme/mats/record.ms +++ b/racket/src/ChezScheme/mats/record.ms @@ -2840,6 +2840,39 @@ ) (mat record-writer + (equal? + (with-output-to-string + (lambda () + (define-record-type sp (fields lat)) + (record-writer (type-descriptor sp) + (lambda (x p w) (w (sp-lat x) p))) + (pretty-print (list (make-sp 'ugh))))) + "(ugh)\n") + (error? ; 'sp is not an rtd + (with-output-to-string + (lambda () + (define-record-type sp (fields lat)) + (record-writer 'sp + (lambda (x p w) (w (sp-lat x) p)))))) + (error? ; "oops" is not a procedure + (with-output-to-string + (lambda () + (define-record-type sp (fields lat)) + (record-writer (type-descriptor sp) "oops")))) + (error? ; ugh is not a textual output port + (with-output-to-string + (lambda () + (define-record-type sp (fields lat)) + (record-writer (type-descriptor sp) + (lambda (x p w) (w p (sp-lat x)))) + (pretty-print (list (make-sp 'ugh)))))) + (error? ; procedure not a textual output port + (with-output-to-string + (lambda () + (define-record-type sp (fields lat)) + (record-writer (type-descriptor sp) + (lambda (x p w) (w (sp-lat x) w))) + (pretty-print (list (make-sp 'ugh)))))) (begin (define-record $froz (a b) ([c (+ a b)])) (define-record $fruz $froz (d)) diff --git a/racket/src/ChezScheme/mats/root-experr-compile-0-f-f-f b/racket/src/ChezScheme/mats/root-experr-compile-0-f-f-f index 35b7e117cc..16425c86d0 100644 --- a/racket/src/ChezScheme/mats/root-experr-compile-0-f-f-f +++ b/racket/src/ChezScheme/mats/root-experr-compile-0-f-f-f @@ -7819,6 +7819,10 @@ record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 fo record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type single-float". record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type double". record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type double-float". +record.mo:Expected error in mat record-writer: "record-writer: sp is not a record-type descriptor". +record.mo:Expected error in mat record-writer: "record-writer: "oops" is not a procedure". +record.mo:Expected error in mat record-writer: "write: ugh is not a textual output port". +record.mo:Expected error in mat record-writer: "write: # is not a textual output port". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a record-type descriptor". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a record-type descriptor". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a procedure or #f". diff --git a/racket/src/ChezScheme/mats/root-experr-compile-2-f-f-f b/racket/src/ChezScheme/mats/root-experr-compile-2-f-f-f index 17de8fbe49..9e6a75b73b 100644 --- a/racket/src/ChezScheme/mats/root-experr-compile-2-f-f-f +++ b/racket/src/ChezScheme/mats/root-experr-compile-2-f-f-f @@ -7379,6 +7379,10 @@ record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 fo record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type single-float". record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type double". record.mo:Expected error in mat foreign-data: "foreign-set!: invalid value 17 for foreign type double-float". +record.mo:Expected error in mat record-writer: "record-writer: sp is not a record-type descriptor". +record.mo:Expected error in mat record-writer: "record-writer: "oops" is not a procedure". +record.mo:Expected error in mat record-writer: "write: ugh is not a textual output port". +record.mo:Expected error in mat record-writer: "write: # is not a textual output port". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a record-type descriptor". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a record-type descriptor". record.mo:Expected error in mat record-equal/hash: "record-type-equal-procedure: 7 is not a procedure or #f". diff --git a/racket/src/ChezScheme/s/print.ss b/racket/src/ChezScheme/s/print.ss index 1c20fad73d..06085866f3 100644 --- a/racket/src/ChezScheme/s/print.ss +++ b/racket/src/ChezScheme/s/print.ss @@ -173,7 +173,9 @@ [(and ($record? x) (not (eq? x #!base-rtd))) (when (print-record) ((record-writer ($record-type-descriptor x)) x (bit-sink) - (lambda (x p) ; could check for p == (bit-sink) + (lambda (x p) + (unless (and (output-port? p) (textual-port? p)) + ($oops 'write "~s is not a textual output port" p)) (find-dupls x (decr lev) len))))] [(box? x) (find-dupls (unbox x) (decr lev) len)] [(eq? x black-hole) (find-dupls x (decr lev) len)])] @@ -215,7 +217,9 @@ (call/cc (lambda (k) ((record-writer ($record-type-descriptor x)) x (bit-sink) - (lambda (x p) ; could check for p == (bit-sink) + (lambda (x p) + (unless (and (output-port? p) (textual-port? p)) + ($oops 'write "~s is not a textual output port" p)) (if (cyclic? x (fx+ curlev 1) 0) (k #t)))) #f)))))] @@ -308,7 +312,9 @@ (call/cc (lambda (k) ((record-writer ($record-type-descriptor x)) x (bit-sink) - (lambda (x p) ; could check for p == (bit-sink) + (lambda (x p) + (unless (and (output-port? p) (textual-port? p)) + ($oops 'write "~s is not a textual output port" p)) (if (down x (fx- xlev 1)) (k #t)))) #f)))] [(box? x) (down (unbox x) (fx- xlev 1))] @@ -706,7 +712,9 @@ floating point returns with (1 0 -1 ...). (if (limit? lev) (display-string "#[...]" p) ((record-writer ($record-type-descriptor x)) x p - (lambda (x p) ; could check for p == old p + (lambda (x p) + (unless (and (output-port? p) (textual-port? p)) + ($oops 'write "~s is not a textual output port" p)) (wr x r (decr lev) len d? env p)))) (let ([rtd ($record-type-descriptor x)]) (cond ; keep in sync with default-record-writer