(sb!xc:defmacro bad-sequence-type-error (type-spec)
`(error 'simple-type-error
:datum ,type-spec
- ;; FIXME: This is actually wrong, and should be something
- ;; like (SATISFIES IS-A-VALID-SEQUENCE-TYPE-SPECIFIER-P).
- :expected-type 'sequence
+ :expected-type '(satisfies is-a-valid-sequence-type-specifier-p)
:format-control "~S is a bad type specifier for sequences."
:format-arguments (list ,type-spec)))
;; ANSI. Essentially, we are justified in throwing this on
;; e.g. '(OR SIMPLE-VECTOR (VECTOR FIXNUM)), but maybe not (by ANSI)
;; on '(CONS * (CONS * NULL)) -- CSR, 2002-10-18
- `(error 'simple-type-error
- :datum ,type-spec
- ;; FIXME: as in BAD-SEQUENCE-TYPE-ERROR, this is wrong.
- :expected-type 'sequence
+
+ ;; On the other hand, I'm not sure it deserves to be a type-error,
+ ;; either. -- bem, 2005-08-10
+ `(error 'simple-program-error
:format-control "~S is too hairy for sequence functions."
:format-arguments (list ,type-spec)))
) ; EVAL-WHEN
+(defun is-a-valid-sequence-type-specifier-p (type)
+ (let ((type (specifier-type type)))
+ (or (csubtypep type (specifier-type 'list))
+ (csubtypep type (specifier-type 'vector)))))
+
;;; It's possible with some sequence operations to declare the length
;;; of a result vector, and to be safe, we really ought to verify that
;;; the actual result has the declared length.
;;; is open if either X or Y is open.
;;;
;;; FIXME: only used in this file, not needed in target runtime
+
+;;; ANSI contaigon specifies coercion to floating point if one of the
+;;; arguments is floating point. Here we should check to be sure that
+;;; the other argument is within the bounds of that floating point
+;;; type.
+
+(defmacro safely-binop (op x y)
+ `(cond
+ ((typep ,x 'single-float)
+ (if (<= most-negative-single-float ,y most-positive-single-float)
+ (,op ,x ,y)))
+ ((typep ,x 'double-float)
+ (if (<= most-negative-double-float ,y most-positive-double-float)
+ (,op ,x ,y)))
+ ((typep ,y 'single-float)
+ (if (<= most-negative-single-float ,x most-positive-single-float)
+ (,op ,x ,y)))
+ ((typep ,y 'double-float)
+ (if (<= most-negative-double-float ,x most-positive-double-float)
+ (,op ,x ,y)))
+ (t (,op ,x ,y))))
+
(defmacro bound-binop (op x y)
`(and ,x ,y
(with-float-traps-masked (:underflow :overflow :inexact :divide-by-zero)
(error "can't compile a lexical closure"))
(compile nil lambda)))
-(defun compiled-fun-or-lose (thing &optional (name thing))
+(defun valid-extended-function-designator-for-disassemble-p (thing)
(cond ((legal-fun-name-p thing)
(compiled-fun-or-lose (fdefinition thing) thing))
((functionp thing)
((and (listp thing)
(eq (car thing) 'lambda))
(compile nil thing))
- (t
- (error "can't make a compiled function from ~S" name))))
+ (t nil)))
+
+(defun compiled-fun-or-lose (thing &optional (name thing))
+ (let ((fun (valid-extended-function-designator-for-disassemble-p thing)))
+ (if fun
+ fun
+ (error 'simple-type-error
+ :datum thing
+ :expected-type '(satisfies valid-extended-function-designator-for-disassemble-p)
+ :format-control "can't make a compiled function from ~S"
+ :format-arguments (list name)))))
(defun disassemble (object &key
(stream *standard-output*)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.3.38"
+"0.9.3.39"