X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=9de576360eac270de4bd1886243cc1bc33c0523f;hb=a339d8610329763e596d0dcbadbb3aee8dd10afb;hp=bb0b613f20fbc6dc16bc7241f2c6a968b9189535;hpb=29003bacae52b0b32626b30e67d6f82a9f4dbce7;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index bb0b613..9de5763 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -46,6 +46,27 @@ `(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)))))) ;;;; early definition of WRAPPER ;;;; @@ -102,11 +123,14 @@ (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)) @@ -128,7 +152,9 @@ ;;; 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 @@ -176,7 +202,6 @@ (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 @@ -185,7 +210,7 @@ (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))