diff --git a/pkgs/scribble-pkgs/scribble-doc/scribblings/scribble/eval.scrbl b/pkgs/scribble-pkgs/scribble-doc/scribblings/scribble/eval.scrbl index 0411aea2..b3aea23e 100644 --- a/pkgs/scribble-pkgs/scribble-doc/scribblings/scribble/eval.scrbl +++ b/pkgs/scribble-pkgs/scribble-doc/scribblings/scribble/eval.scrbl @@ -1,5 +1,10 @@ #lang scribble/doc -@(require scribble/manual "utils.rkt" (for-label racket/sandbox racket/pretty)) +@(require scribble/manual + "utils.rkt" + (for-label racket/sandbox + racket/pretty + file/convertible + racket/serialize)) @title[#:tag "eval"]{Evaluation and Examples} @@ -169,7 +174,15 @@ setting sandbox parameters to disable limits, setting the outputs to @racket['string], and not adding extra security guards. If @racket[pretty-print?] is true, the sandbox's printer is set to -@racket[pretty-print-handler].} +@racket[pretty-print-handler]. In that case, values that are convertible +in the sense of @racket[convertible?] are printed using @racket[write-special], +except that values that are serializable in the sense of @racket[serializable?] +are serialized for tranfers from inside the sandbox to outside (which can avoid +pulling code and support from the sandboxed environment into the document-rendering +environment). + +@history[#:changed "1.6" @elem{Changed treatment of convertible values that are + serializable.}]} @defproc[(make-base-eval-factory [mod-paths (listof module-path?)] diff --git a/pkgs/scribble-pkgs/scribble-lib/scribble/eval.rkt b/pkgs/scribble-pkgs/scribble-lib/scribble/eval.rkt index 5031d536..79253c71 100644 --- a/pkgs/scribble-pkgs/scribble-lib/scribble/eval.rkt +++ b/pkgs/scribble-pkgs/scribble-lib/scribble/eval.rkt @@ -4,7 +4,9 @@ (only-in "core.rkt" content?) racket/list file/convertible ;; attached into new namespace via anchor + racket/serialize ;; attached into new namespace via anchor racket/pretty ;; attached into new namespace via anchor + scribble/private/serialize ;; attached into new namespace via anchor racket/sandbox racket/promise racket/port racket/gui/dynamic (for-syntax racket/base syntax/srcloc unstable/struct) @@ -241,7 +243,11 @@ (and (convertible? obj) 1))) (pretty-print-print-hook (lambda (obj _mode out) - (write-special obj out)))) + (write-special (if (serializable? obj) + (make-serialized-convertible + (serialize obj)) + obj) + out)))) (map (current-print) v)) (close-output-port out) in)))]))) @@ -346,8 +352,11 @@ [sandbox-namespace-specs (append (sandbox-namespace-specs) (if pretty-print? - '(racket/pretty file/convertible) - '(file/convertible)))]) + '(racket/pretty) + '()) + '(file/convertible + racket/serialize + scribble/private/serialize))]) (let ([e (apply make-evaluator lang ips)]) (when pretty-print? (call-in-sandbox-context e diff --git a/pkgs/scribble-pkgs/scribble-lib/scribble/private/serialize.rkt b/pkgs/scribble-pkgs/scribble-lib/scribble/private/serialize.rkt new file mode 100644 index 00000000..cc3f26f1 --- /dev/null +++ b/pkgs/scribble-pkgs/scribble-lib/scribble/private/serialize.rkt @@ -0,0 +1,18 @@ +#lang racket/base +(require racket/serialize + file/convertible) + +(provide make-serialized-convertible) + +(struct serialized-convertible (ser [deser #:mutable]) + #:property prop:convertible (lambda (v mode default) + (unless (serialized-convertible-deser v) + (set-serialized-convertible-deser! + v + (deserialize (serialized-convertible-ser v)))) + (convert (serialized-convertible-deser v) mode default))) + +(define (make-serialized-convertible ser) + (serialized-convertible ser #f)) + +