From b7de1001e4c2602174506d875e1c1460258fbc07 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Fri, 4 Jan 2013 16:46:43 +0400 Subject: [PATCH] Fix reading `#3(x). Previously it returned #(x), while it should be #(x x x). Fixes lp#1095918. --- NEWS | 1 + src/code/sharpm.lisp | 42 +++++++++++++++++++++--------------------- tests/reader.pure.lisp | 3 +++ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/NEWS b/NEWS index 11036e5..666ead1 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ changes relative to sbcl-1.1.3: * bug fix: very long (or infinite) constant lists in DOLIST do not result in very long compile times or heap exhaustion anymore. (lp#1095488) + * bug fix: `#3(1) is read as #(1 1 1), not as #(1). (lp#1095918) changes in sbcl-1.1.3 relative to sbcl-1.1.2: * enhancement: warnings about bad locale settings, LANG, LC_CTYPE, etc. diff --git a/src/code/sharpm.lisp b/src/code/sharpm.lisp index 758114f..39c8e66 100644 --- a/src/code/sharpm.lisp +++ b/src/code/sharpm.lisp @@ -21,32 +21,32 @@ (defun sharp-left-paren (stream ignore length) (declare (ignore ignore) (special *backquote-count*)) (let* ((list (read-list stream nil)) - (listlength (handler-case (length list) - (type-error - (error) - (declare (ignore error)) - (simple-reader-error stream - "improper list in #(): ~S" - list))))) + (list-length (handler-case (length list) + (type-error () + (simple-reader-error stream + "Improper list in #(): ~S." + list))))) (declare (list list) - (fixnum listlength)) + (fixnum list-length)) (cond (*read-suppress* nil) + ((and length (> list-length length)) + (simple-reader-error + stream + "Vector longer than the specified length: #~S~S." + length list)) ((zerop *backquote-count*) (if length - (cond ((> listlength (the fixnum length)) - (simple-reader-error - stream - "vector longer than specified length: #~S~S" - length list)) - (t - (fill (the simple-vector - (replace (the simple-vector - (make-array length)) - list)) - (car (last list)) - :start listlength))) + (fill (replace (make-array length) list) + (car (last list)) + :start list-length) (coerce list 'vector))) - (t (cons *bq-vector-flag* list))))) + (t + (cons *bq-vector-flag* + (if length + (append list + (make-list (- length list-length) + :initial-element (car (last list)))) + list)))))) (defun sharp-star (stream ignore numarg) (declare (ignore ignore)) diff --git a/tests/reader.pure.lisp b/tests/reader.pure.lisp index 04d9dda..567235d 100644 --- a/tests/reader.pure.lisp +++ b/tests/reader.pure.lisp @@ -288,3 +288,6 @@ (with-timeout 10 (assert (raises-error? (read-from-string "10e10000000000000000000") sb-kernel:reader-impossible-number-error)))) + +(with-test (:name :bug-1095918) + (assert (= (length `#3(1)) 3))) -- 1.7.10.4