;;; of like READ-SEQUENCE specialized for files of (UNSIGNED-BYTE 8),
;;; with an automatic conversion from (UNSIGNED-BYTE 8) into CHARACTER
;;; for each element read
-(declaim (ftype (function (stream simple-string &optional index) (values)) read-string-as-bytes))
+(declaim (ftype (function (stream simple-string &optional index) (values))
+ read-string-as-bytes #!+sb-unicode read-string-as-words))
(defun read-string-as-bytes (stream string &optional (length (length string)))
(dotimes (i length)
(setf (aref string i)
- (code-char (read-byte stream))))
+ (sb!xc:code-char (read-byte stream))))
;; FIXME: The classic CMU CL code to do this was
;; (READ-N-BYTES FILE STRING START END).
;; It was changed for SBCL because we needed a portable version for
;; significantly better than the portable version here. If it is, then use
;; it as an alternate definition, protected with #-SB-XC-HOST.
(values))
+#!+sb-unicode
+(defun read-string-as-words (stream string &optional (length (length string)))
+ #+sb-xc-host (bug "READ-STRING-AS-WORDS called")
+ (dotimes (i length)
+ (setf (aref string i)
+ (sb!xc:code-char (logior
+ (read-byte stream)
+ (ash (read-byte stream) 8)
+ (ash (read-byte stream) 16)
+ (ash (read-byte stream) 24)))))
+ (values))
\f
;;;; miscellaneous fops
#-sb-xc-host
(%primitive sb!c:make-other-immediate-type 0 sb!vm:unbound-marker-widetag))
-;;; CMU CL had FOP-CHARACTER as fop 68, but it's not needed in current
-;;; SBCL as we have no extended characters, only 1-byte characters.
-;;; (Ditto for CMU CL, actually: FOP-CHARACTER was speculative generality.)
-(define-fop (fop-short-character 69)
- (code-char (read-byte-arg)))
+(define-cloned-fops (fop-character 68) (fop-short-character 69)
+ (code-char (clone-arg)))
(define-cloned-fops (fop-struct 48) (fop-small-struct 49)
(let* ((size (clone-arg))
(make-string (* ,n-size 2))))
(done-with-fast-read-byte)
(let ((,n-buffer *fasl-symbol-buffer*))
+ #+sb-xc-host
(read-string-as-bytes *fasl-input-stream*
,n-buffer
,n-size)
+ #-sb-xc-host
+ (#!+sb-unicode read-string-as-words
+ #!-sb-unicode read-string-as-bytes
+ *fasl-input-stream*
+ ,n-buffer
+ ,n-size)
(push-fop-table (without-package-locks
(intern* ,n-buffer
,n-size
(fop-uninterned-small-symbol-save 13)
(let* ((arg (clone-arg))
(res (make-string arg)))
+ #!-sb-unicode
(read-string-as-bytes *fasl-input-stream* res)
+ #!+sb-unicode
+ (read-string-as-words *fasl-input-stream* res)
(push-fop-table (make-symbol res))))
(define-fop (fop-package 14)
\f
;;;; fops for loading arrays
-(define-cloned-fops (fop-string 37) (fop-small-string 38)
+(define-cloned-fops (fop-base-string 37) (fop-small-base-string 38)
(let* ((arg (clone-arg))
- (res (make-string arg)))
+ (res (make-string arg :element-type 'base-char)))
(read-string-as-bytes *fasl-input-stream* res)
res))
+#!+sb-unicode
+(progn
+ #+sb-xc-host
+ (define-cloned-fops (fop-character-string 161) (fop-small-character-string 162)
+ (bug "CHARACTER-STRING FOP encountered"))
+
+ #-sb-xc-host
+ (define-cloned-fops (fop-character-string 161) (fop-small-character-string 162)
+ (let* ((arg (clone-arg))
+ (res (make-string arg)))
+ (read-string-as-words *fasl-input-stream* res)
+ res)))
+
(define-cloned-fops (fop-vector 39) (fop-small-vector 40)
(let* ((size (clone-arg))
(res (make-array size)))
\f
;;;; assemblerish fops
+(define-fop (fop-assembler-code 144)
+ (error "cannot load assembler code except at cold load"))
+
+(define-fop (fop-assembler-routine 145)
+ (error "cannot load assembler code except at cold load"))
+
(define-fop (fop-foreign-fixup 147)
(let* ((kind (pop-stack))
(code-object (pop-stack))
(len (read-byte-arg))
- (sym (make-string len)))
+ (sym (make-string len :element-type 'base-char)))
(read-n-bytes *fasl-input-stream* sym 0 len)
(sb!vm:fixup-code-object code-object
(read-word-arg)
kind)
code-object))
-(define-fop (fop-assembler-code 144)
- (error "cannot load assembler code except at cold load"))
-
-(define-fop (fop-assembler-routine 145)
- (error "cannot load assembler code except at cold load"))
-
(define-fop (fop-assembler-fixup 148)
(let ((routine (pop-stack))
(kind (pop-stack))
(sb!vm:fixup-code-object code-object (read-word-arg)
(get-lisp-obj-address code-object) kind)
code-object))
+
+#!+linkage-table
+(define-fop (fop-foreign-dataref-fixup 150)
+ (let* ((kind (pop-stack))
+ (code-object (pop-stack))
+ (len (read-byte-arg))
+ (sym (make-string len :element-type 'base-char)))
+ (read-n-bytes *fasl-input-stream* sym 0 len)
+ (sb!vm:fixup-code-object code-object
+ (read-word-arg)
+ (foreign-symbol-address-as-integer sym t)
+ kind)
+ code-object))