From ef0891e470ff35840def7a5717ede18a58266e76 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Sat, 22 Sep 2012 21:55:50 +0300 Subject: [PATCH] fix "unable to read" compiler-error reporting during SBCL build By moving stream-error-position-info into early-extensions.lisp, so it's available early enough. --- src/code/condition.lisp | 43 ---------------------------------------- src/code/early-extensions.lisp | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/code/condition.lisp b/src/code/condition.lisp index ab6e942..a0f108a 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -13,26 +13,6 @@ (in-package "SB!KERNEL") -;;;; miscellaneous support utilities - -;;; Signalling an error when trying to print an error condition is -;;; generally a PITA, so whatever the failure encountered when -;;; wondering about FILE-POSITION within a condition printer, 'tis -;;; better silently to give up than to try to complain. -(defun file-position-or-nil-for-error (stream &optional (pos nil posp)) - ;; Arguably FILE-POSITION shouldn't be signalling errors at all; but - ;; "NIL if this cannot be determined" in the ANSI spec doesn't seem - ;; absolutely unambiguously to prohibit errors when, e.g., STREAM - ;; has been closed so that FILE-POSITION is a nonsense question. So - ;; my (WHN) impression is that the conservative approach is to - ;; IGNORE-ERRORS. (I encountered this failure from within a homebrew - ;; defsystemish operation where the ERROR-STREAM had been CL:CLOSEd, - ;; I think by nonlocally exiting through a WITH-OPEN-FILE, by the - ;; time an error was reported.) - (if posp - (ignore-errors (file-position stream pos)) - (ignore-errors (file-position stream)))) - ;;;; the CONDITION class (/show0 "condition.lisp 20") @@ -769,29 +749,6 @@ (:report (lambda (condition stream) (%report-reader-error condition stream :simple t)))) -(defun stream-error-position-info (stream &optional position) - (unless (interactive-stream-p stream) - (let ((now (file-position-or-nil-for-error stream)) - (pos position)) - (when (and (not pos) now (plusp now)) - ;; FILE-POSITION is the next character -- error is at the previous one. - (setf pos (1- now))) - (let (lineno colno) - (when (and pos - (< pos sb!xc:array-dimension-limit) - (file-position stream :start)) - (let ((string - (make-string pos :element-type (stream-element-type stream)))) - (when (= pos (read-sequence string stream)) - ;; Lines count from 1, columns from 0. It's stupid and traditional. - (setq lineno (1+ (count #\Newline string)) - colno (- pos (or (position #\Newline string :from-end t) 0))))) - (file-position-or-nil-for-error stream now)) - (remove-if-not #'second - (list (list :line lineno) - (list :column colno) - (list :file-position pos))))))) - ;;; base REPORTing of a READER-ERROR ;;; ;;; When SIMPLE, we expect and use SIMPLE-CONDITION-ish FORMAT-CONTROL diff --git a/src/code/early-extensions.lisp b/src/code/early-extensions.lisp index 8b657cc..74f0b8f 100644 --- a/src/code/early-extensions.lisp +++ b/src/code/early-extensions.lisp @@ -1381,3 +1381,44 @@ to :INTERPRET, an interpreter will be used.") (defun ,name (,@head &more ,more-context ,more-count) ,@body)) (setf (%simple-fun-arglist #',name) ',lambda-list)))) + +;;; Signalling an error when trying to print an error condition is +;;; generally a PITA, so whatever the failure encountered when +;;; wondering about FILE-POSITION within a condition printer, 'tis +;;; better silently to give up than to try to complain. +(defun file-position-or-nil-for-error (stream &optional (pos nil posp)) + ;; Arguably FILE-POSITION shouldn't be signalling errors at all; but + ;; "NIL if this cannot be determined" in the ANSI spec doesn't seem + ;; absolutely unambiguously to prohibit errors when, e.g., STREAM + ;; has been closed so that FILE-POSITION is a nonsense question. So + ;; my (WHN) impression is that the conservative approach is to + ;; IGNORE-ERRORS. (I encountered this failure from within a homebrew + ;; defsystemish operation where the ERROR-STREAM had been CL:CLOSEd, + ;; I think by nonlocally exiting through a WITH-OPEN-FILE, by the + ;; time an error was reported.) + (if posp + (ignore-errors (file-position stream pos)) + (ignore-errors (file-position stream)))) + +(defun stream-error-position-info (stream &optional position) + (unless (interactive-stream-p stream) + (let ((now (file-position-or-nil-for-error stream)) + (pos position)) + (when (and (not pos) now (plusp now)) + ;; FILE-POSITION is the next character -- error is at the previous one. + (setf pos (1- now))) + (let (lineno colno) + (when (and pos + (< pos sb!xc:array-dimension-limit) + (file-position stream :start)) + (let ((string + (make-string pos :element-type (stream-element-type stream)))) + (when (= pos (read-sequence string stream)) + ;; Lines count from 1, columns from 0. It's stupid and traditional. + (setq lineno (1+ (count #\Newline string)) + colno (- pos (or (position #\Newline string :from-end t) 0))))) + (file-position-or-nil-for-error stream now)) + (remove-if-not #'second + (list (list :line lineno) + (list :column colno) + (list :file-position pos))))))) -- 1.7.10.4