X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsharpm.lisp;h=758114ffa198150f3b34ad6ad8aac053227649e5;hb=d335afdcf50b641a0aafd32741e0777d4e12a59b;hp=dfd32d282fc12fd7b788b9649d912583b9cbda0f;hpb=42702bd5e2af3e0042c9f27372c6f5d92335df12;p=sbcl.git diff --git a/src/code/sharpm.lisp b/src/code/sharpm.lisp index dfd32d2..758114f 100644 --- a/src/code/sharpm.lisp +++ b/src/code/sharpm.lisp @@ -93,10 +93,15 @@ (when *read-suppress* (read stream t nil t) (return-from sharp-A nil)) - (unless dimensions (simple-reader-error stream - "no dimensions argument to #A")) + (unless dimensions + (simple-reader-error stream "No dimensions argument to #A.")) (collect ((dims)) - (let* ((contents (read stream t nil t)) + (let* ((*bq-error* + (if (zerop *backquote-count*) + *bq-error* + "Comma inside a backquoted array (not a list or general vector.)")) + (*backquote-count* 0) + (contents (read stream t nil t)) (seq contents)) (dotimes (axis dimensions (make-array (dims) :initial-contents contents)) @@ -122,8 +127,14 @@ (when *read-suppress* (read stream t nil t) (return-from sharp-S nil)) - (let ((body (if (char= (read-char stream t) #\( ) - (read-list stream nil) + (let* ((*bq-error* + (if (zerop *backquote-count*) + *bq-error* + "Comma inside backquoted structure (not a list or general vector.)")) + (*backquote-count* 0) + (body (if (char= (read-char stream t) #\( ) + (let ((*backquote-count* 0)) + (read-list stream nil)) (simple-reader-error stream "non-list following #S")))) (unless (listp body) (simple-reader-error stream "non-list following #S: ~S" body)) @@ -256,13 +267,22 @@ (unless (eq old new) (setf (aref data i) new)))))) ((typep tree 'instance) - (do ((i 1 (1+ i)) - (end (%instance-length tree))) - ((= i end)) - (let* ((old (%instance-ref tree i)) - (new (circle-subst old-new-alist old))) - (unless (eq old new) - (setf (%instance-ref tree i) new))))) + (let* ((n-untagged (layout-n-untagged-slots (%instance-layout tree))) + (n-tagged (- (%instance-length tree) n-untagged))) + ;; N-TAGGED includes the layout as well (at index 0), which + ;; we don't grovel. + (do ((i 1 (1+ i))) + ((= i n-tagged)) + (let* ((old (%instance-ref tree i)) + (new (circle-subst old-new-alist old))) + (unless (eq old new) + (setf (%instance-ref tree i) new)))) + (do ((i 0 (1+ i))) + ((= i n-untagged)) + (let* ((old (%raw-instance-ref/word tree i)) + (new (circle-subst old-new-alist old))) + (unless (= old new) + (setf (%raw-instance-ref/word tree i) new)))))) ((typep tree 'funcallable-instance) (do ((i 1 (1+ i)) (end (- (1+ (get-closure-length tree)) sb!vm:funcallable-instance-info-offset))) @@ -378,7 +398,9 @@ ((character-decoding-error #'(lambda (decoding-error) (declare (ignorable decoding-error)) - (style-warn "Character decoding error in a #|-comment at position ~A reading source file ~A, resyncing." (file-position stream) stream) + (style-warn + 'sb!kernel::character-decoding-error-in-dispatch-macro-char-comment + :sub-char sub-char :position (file-position stream) :stream stream) (invoke-restart 'attempt-resync)))) (let ((stream (in-synonym-of stream))) (if (ansi-stream-p stream)