0.9.0.38:
[sbcl.git] / src / code / early-extensions.lisp
index 5fb2c0f..7ae0061 100644 (file)
 
 (defmacro define-cached-synonym
     (name &optional (original (symbolicate "%" name)))
-  (let ((cached-name (symbolicate "%%" name "-cached")))
+  (let ((cached-name (symbolicate "%%" name "-CACHED")))
     `(progn
        (defun-cached (,cached-name :hash-bits 8
                                    :hash-function (lambda (x)
 ;;;; various operations on names
 
 ;;; Is NAME a legal function name?
+(declaim (inline legal-fun-name-p))
 (defun legal-fun-name-p (name)
   (values (valid-function-name-p name)))
 
   (unless (legal-fun-name-p name)
     (error 'simple-type-error
           :datum name
-          :expected-type '(or symbol list)
+          :expected-type '(or symbol (cons (member setf) (cons symbol null)))
           :format-control "invalid function name: ~S"
           :format-arguments (list name))))
 
      (%failed-aver ,(format nil "~A" expr))))
 
 (defun %failed-aver (expr-as-string)
+  ;; hackish way to tell we're in a cold sbcl and output the
+  ;; message before signallign error, as it may be this is too
+  ;; early in the cold init.
+  (when (find-package "SB!C")
+    (fresh-line)
+    (write-line "failed AVER:")
+    (write-line expr-as-string)
+    (terpri))
   (bug "~@<failed AVER: ~2I~_~S~:>" expr-as-string))
 
-;;; We need a definition of BUG here for the host compiler to be able
-;;; to deal with BUGs in sbcl. This should never affect an end-user,
-;;; who will pick up the definition that signals a CONDITION of
-;;; condition-class BUG; however, this is not defined on the host
-;;; lisp, but for the target. SBCL developers sometimes trigger BUGs
-;;; in their efforts, and it is useful to get the details of the BUG
-;;; rather than an undefined function error. - CSR, 2002-04-12
-#+sb-xc-host
 (defun bug (format-control &rest format-arguments)
-  (error 'simple-error
-        :format-control "~@<  ~? ~:@_~?~:>"
-        :format-arguments `(,format-control
-                            ,format-arguments
-                            "~@<If you see this and are an SBCL ~
-developer, then it is probable that you have made a change to the ~
-system that has broken the ability for SBCL to compile, usually by ~
-removing an assumed invariant of the system, but sometimes by making ~
-an averrance that is violated (check your code!). If you are a user, ~
-please submit a bug report to the developers' mailing list, details of ~
-which can be found at <http://sbcl.sourceforge.net/>.~:@>"
-                            ())))
+  (error 'bug
+        :format-control format-control
+        :format-arguments format-arguments))
 
 (defmacro enforce-type (value type)
   (once-only ((value value))
@@ -826,8 +818,10 @@ which can be found at <http://sbcl.sourceforge.net/>.~:@>"
        (%failed-enforce-type ,value ',type))))
 
 (defun %failed-enforce-type (value type)
-  (error 'simple-type-error ; maybe should be TYPE-BUG, subclass of BUG?
-        :value value
+  ;; maybe should be TYPE-BUG, subclass of BUG?  If it is changed,
+  ;; check uses of it in user-facing code (e.g. WARN)
+  (error 'simple-type-error 
+        :datum value
         :expected-type type
         :format-control "~@<~S ~_is not a ~_~S~:>"
         :format-arguments (list value type)))
@@ -1174,3 +1168,17 @@ which can be found at <http://sbcl.sourceforge.net/>.~:@>"
        (*read-suppress* *read-suppress*)
        (*readtable* *readtable*))
     (funcall function)))
+
+;;; Bind a few "potentially dangerous" printer control variables to
+;;; safe values, respecting current values if possible.
+(defmacro with-sane-io-syntax (&body forms)
+  `(call-with-sane-io-syntax (lambda () ,@forms)))
+
+(defun call-with-sane-io-syntax (function)
+  (declare (type function function))
+  (macrolet ((true (sym)
+               `(and (boundp ',sym) ,sym)))
+    (let ((*print-readably* nil)
+          (*print-level* (or (true *print-level*) 6))
+          (*print-length* (or (true *print-length*) 12)))
+      (funcall function))))