X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=byte-stream.lisp;h=a375cdcd6f5ca6ab3860d95dcdecd20f089d8470;hp=fd7a56ae08d55c902c368a690e58abce5f000575;hb=90225d9ba12f7a9116bcc923afdaf6e76a8c6728;hpb=d11d6cc43fd9227a8aeed28dc2cfecdbc587ec4a diff --git a/byte-stream.lisp b/byte-stream.lisp index fd7a56a..a375cdc 100644 --- a/byte-stream.lisp +++ b/byte-stream.lisp @@ -23,11 +23,19 @@ ;; Intial CMUCL version by OnShored. Ported to SBCL by Kevin Rosenberg +#+sbcl +(eval-when (:compile-toplevel :load-toplevel :execute) + (when (sb-ext:without-package-locks + (sb-pcl::structure-class-p + (find-class (intern "FILE-STREAM" "SB-IMPL")))) + (push :old-sb-file-stream cl:*features*))) + #+(or cmu sbcl) (progn (defstruct (byte-array-output-stream (:include #+cmu system:lisp-stream - #+sbcl sb-impl::file-stream + #+(and sbcl old-sb-file-stream) sb-impl::file-stream + #+(and sbcl (not old-sb-file-stream)) sb-sys:fd-stream (bout #'byte-array-bout) (misc #'byte-array-out-misc)) (:print-function %print-byte-array-output-stream) @@ -85,11 +93,23 @@ Make-Byte-Array-Output-Stream since the last call to this function." ) ; progn +#+sbcl +(eval-when (:compile-toplevel :load-toplevel :execute) + (sb-ext:without-package-locks + (defvar *system-copy-fn* (if (fboundp (intern "COPY-SYSTEM-AREA" "SB-KERNEL")) + (intern "COPY-SYSTEM-AREA" "SB-KERNEL") + (intern "COPY-SYSTEM-UB8-AREA" "SB-KERNEL"))) + (defconstant +system-copy-multiplier+ (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL")) + sb-vm:n-byte-bits + 1)))) + #+(or cmu sbcl) (progn (defstruct (byte-array-input-stream (:include #+cmu system:lisp-stream - #+sbcl sb-impl::file-stream + ;;#+sbcl sb-impl::file-stream + #+(and sbcl old-sb-file-stream) sb-impl::file-stream + #+(and sbcl (not old-sb-file-stream)) sb-sys:fd-stream (in #'byte-array-inch) (bin #'byte-array-binch) (n-bin #'byte-array-stream-read-n-bytes) @@ -102,10 +122,11 @@ Make-Byte-Array-Output-Stream since the last call to this function." (current nil) (end nil)) + (defun %print-byte-array-input-stream (s stream d) (declare (ignore s d)) (write-string "#" stream)) - + (defun byte-array-inch (stream eof-errorp eof-value) (let ((byte-array (byte-array-input-stream-byte-array stream)) (index (byte-array-input-stream-current stream))) @@ -152,13 +173,13 @@ Make-Byte-Array-Output-Stream since the last call to this function." (* copy vm:byte-bits))) #+sbcl (sb-sys:without-gcing - (sb-kernel:system-area-copy (sb-sys:vector-sap byte-array) - (* index sb-vm:n-byte-bits) + (funcall *system-copy-fn* (sb-sys:vector-sap byte-array) + (* index +system-copy-multiplier+) (if (typep buffer 'sb-sys::system-area-pointer) buffer (sb-sys:vector-sap buffer)) - (* start sb-vm:n-byte-bits) - (* copy sb-vm:n-byte-bits)))) + (* start +system-copy-multiplier+) + (* copy +system-copy-multiplier+)))) (if (and (> requested copy) eof-errorp) (error 'end-of-file :stream stream) copy))) @@ -184,6 +205,8 @@ Make-Byte-Array-Output-Stream since the last call to this function." ) ;; progn +(eval-when (:compile-toplevel :load-toplevel :execute) + (setq cl:*features* (delete :old-sb-file-stream cl:*features*))) ;;; Simple streams implementation by Kevin Rosenberg @@ -220,6 +243,7 @@ Make-Byte-Array-Output-Stream since the last call to this function." (defmethod excl:device-extend ((stream extendable-buffer-output-stream) need action) + (declare (ignore action)) (let* ((len (file-position stream)) (new-len (max (+ len need) (* 2 len))) (old-buf (slot-value stream 'excl::buffer)) @@ -241,3 +265,5 @@ Make-Byte-Array-Output-Stream since the last call to this function." (end (length buffer))) (excl:make-buffer-input-stream buffer start end :octets)) ) ;; progn + +