`(dotimes (,var (the fixnum ,count) ,result)
(declare (fixnum ,var))
,@body))
+
+(declaim (inline random-fixnum))
+(defun random-fixnum ()
+ (random (1+ most-positive-fixnum)))
+
+(defconstant n-fixnum-bits #.(integer-length most-positive-fixnum))
+
+;;; Lambda which executes its body (or not) randomly. Used to drop
+;;; random cache entries.
+(defmacro randomly-punting-lambda (lambda-list &body body)
+ (with-unique-names (drops drop-pos)
+ `(let ((,drops (random-fixnum))
+ (,drop-pos n-fixnum-bits))
+ (declare (fixnum ,drops)
+ (type (integer 0 #.n-fixnum-bits) ,drop-pos))
+ (lambda ,lambda-list
+ (when (logbitp (the unsigned-byte (decf ,drop-pos)) ,drops)
+ (locally ,@body))
+ (when (zerop ,drop-pos)
+ (setf ,drops (random-fixnum)
+ ,drop-pos n-fixnum-bits))))))
\f
;;;; early definition of WRAPPER
;;;;
(declare (type function new-value))
(aver (funcallable-instance-p fin))
(setf (funcallable-instance-fun fin) new-value))
+
;;; FIXME: these macros should just go away. It's not clear whether
;;; the inline functions defined by
;;; !DEFSTRUCT-WITH-ALTERNATE-METACLASS are as efficient as they could
;;; be; ordinary defstruct accessors are defined as source transforms.
-(defmacro fsc-instance-p (fin)
+(defun fsc-instance-p (fin)
+ (funcallable-instance-p fin))
+(define-compiler-macro fsc-instance-p (fin)
`(funcallable-instance-p ,fin))
(defmacro fsc-instance-wrapper (fin)
`(%funcallable-instance-layout ,fin))
;;; and normal instances, so we can return true on structures also. A
;;; few uses of (OR STD-INSTANCE-P FSC-INSTANCE-P) are changed to
;;; PCL-INSTANCE-P.
-(defmacro std-instance-p (x)
+(defun std-instance-p (x)
+ (%instancep x))
+(define-compiler-macro std-instance-p (x)
`(%instancep ,x))
;; a temporary definition used for debugging the bootstrap
;;; this an interned symbol. That means that the fast check to see
;;; whether a slot is unbound is to say (EQ <val> '..SLOT-UNBOUND..).
;;; That is considerably faster than looking at the value of a special
-;;; variable. Be careful, there are places in the code which actually
-;;; use ..SLOT-UNBOUND.. rather than this variable. So much for
-;;; modularity..
+;;; variable.
;;;
-;;; FIXME: Now that we're tightly integrated into SBCL, we could use
-;;; the SBCL built-in unbound value token instead. Perhaps if we did
-;;; so it would be a good idea to define collections of CLOS slots as
-;;; a new type of heap object, instead of using bare SIMPLE-VECTOR, in
-;;; order to avoid problems (in the debugger if nowhere else) with
-;;; SIMPLE-VECTORs some of whose elements are unbound tokens.
-(defconstant +slot-unbound+ '..slot-unbound..)
+;;; It seems only reasonable to also export this for users, since
+;;; otherwise dealing with STANDARD-INSTANCE-ACCESS becomes harder
+;;; -- and slower -- than it needs to be.
+(defconstant +slot-unbound+ '..slot-unbound..
+ "SBCL specific extentions to MOP: if this value is read from an
+instance using STANDARD-INSTANCE-ACCESS, the slot is unbound.
+Similarly, an :INSTANCE allocated slot can be made unbound by
+assigning this to it using (SETF STANDARD-INSTANCE-ACCESS).
+
+Value of +SLOT-UNBOUND+ is unspecified, and should not be relied to be
+of any particular type, but it is guaranteed to be suitable for EQ
+comparison.")
(defmacro %allocate-static-slot-storage--class (no-of-slots)
`(make-array ,no-of-slots :initial-element +slot-unbound+))
(defun set-fun-name (fun new-name)
#+sb-doc
"Set the name of a compiled function object. Return the function."
- (declare (special *boot-state* *the-class-standard-generic-function*))
(when (valid-function-name-p fun)
(setq fun (fdefinition fun)))
(typecase fun
(sb-eval:interpreted-function
(setf (sb-eval:interpreted-function-name fun) new-name))
(funcallable-instance ;; KLUDGE: probably a generic function...
- (cond ((if (eq *boot-state* 'complete)
+ (cond ((if (eq **boot-state** 'complete)
(typep fun 'generic-function)
(eq (class-of fun) *the-class-standard-generic-function*))
(setf (%funcallable-instance-info fun 2) new-name))