X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=d4a4af51cce1c54924edcda04d5b70b472847907;hb=742e0b2aed0e06a5ac6036c6b576088e3f91208f;hp=7135e5f5312058802888a061a0035fd6b0f05ffe;hpb=34dd23563d2f5cf05c72b971da0d0b065a09bf2a;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 7135e5f..d4a4af5 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -80,7 +80,7 @@ ;; KLUDGE: Note that neither of these slots is ever accessed by its ;; accessor name as of sbcl-0.pre7.63. Presumably everything works ;; by puns based on absolute locations. Fun fun fun.. -- WHN 2001-10-30 - :slot-names (clos-slots name) + :slot-names (clos-slots name hash-code) :boa-constructor %make-pcl-funcallable-instance :superclass-name sb-kernel:funcallable-instance :metaclass-name sb-kernel:random-pcl-class @@ -97,31 +97,23 @@ (import 'sb-kernel:funcallable-instance-p) -;;; This "works" on non-PCL FINs, which allows us to weaken -;;; FUNCALLABLE-INSTANCE-P to return true for all FINs. This is also -;;; necessary for bootstrapping to work, since the layouts for early -;;; GFs are not initially initialized. -(defmacro funcallable-instance-data-1 (fin slot) - (ecase (eval slot) - (wrapper `(sb-kernel:%funcallable-instance-layout ,fin)) - (slots `(sb-kernel:%funcallable-instance-info ,fin 0)))) - -;;; FIXME: Now that we no longer try to make our CLOS implementation -;;; portable to other implementations of Common Lisp, all the -;;; funcallable instance wrapper logic here can go away in favor -;;; of direct calls to native SBCL funcallable instance operations. (defun set-funcallable-instance-fun (fin new-value) (declare (type function new-value)) (aver (funcallable-instance-p fin)) (setf (sb-kernel:funcallable-instance-fun fin) new-value)) (defmacro fsc-instance-p (fin) `(funcallable-instance-p ,fin)) -(defmacro fsc-instance-class (fin) - `(wrapper-class (funcallable-instance-data-1 ,fin 'wrapper))) (defmacro fsc-instance-wrapper (fin) - `(funcallable-instance-data-1 ,fin 'wrapper)) + `(sb-kernel:%funcallable-instance-layout ,fin)) +;;; FIXME: This seems to bear no relation at all to the CLOS-SLOTS +;;; slot in the FUNCALLABLE-INSTANCE structure, above, which +;;; (bizarrely) seems to be set to the NAME of the +;;; FUNCALLABLE-INSTANCE. At least, the index 1 seems to return the +;;; NAME, and the index 2 NIL. Weird. -- CSR, 2002-11-07 (defmacro fsc-instance-slots (fin) - `(funcallable-instance-data-1 ,fin 'slots)) + `(sb-kernel:%funcallable-instance-info ,fin 0)) +(defmacro fsc-instance-hash (fin) + `(sb-kernel:%funcallable-instance-info ,fin 3)) (declaim (inline clos-slots-ref (setf clos-slots-ref))) (declaim (ftype (function (simple-vector index) t) clos-slots-ref)) @@ -265,7 +257,7 @@ (slots nil)) |# (sb-kernel:!defstruct-with-alternate-metaclass standard-instance - :slot-names (slots) + :slot-names (slots hash-code) :boa-constructor %make-standard-instance :superclass-name sb-kernel:instance :metaclass-name cl:standard-class @@ -277,6 +269,9 @@ ;;; weakening of STD-INSTANCE-P. (defmacro std-instance-slots (x) `(sb-kernel:%instance-ref ,x 1)) (defmacro std-instance-wrapper (x) `(sb-kernel:%instance-layout ,x)) +;;; KLUDGE: This one doesn't "work" on structures. However, we +;;; ensure, in SXHASH and friends, never to call it on structures. +(defmacro std-instance-hash (x) `(sb-kernel:%instance-ref ,x 2)) ;;; FIXME: These functions are called every place we do a ;;; CALL-NEXT-METHOD, and probably other places too. It's likely worth @@ -290,6 +285,10 @@ (std-instance-slots instance) (fsc-instance-slots instance))) (defun get-slots-or-nil (instance) + ;; Supress a code-deletion note. FIXME: doing the FIXME above, + ;; integrating PCL more with the compiler, would remove the need for + ;; this icky stuff. + (declare (optimize (inhibit-warnings 3))) (when (pcl-instance-p instance) (get-slots instance))) @@ -309,6 +308,20 @@ ,wrapper nil))) +;;;; support for useful hashing of PCL instances +(let ((hash-code 0)) + (declare (fixnum hash-code)) + (defun get-instance-hash-code () + (if (< hash-code most-positive-fixnum) + (incf hash-code) + (setq hash-code 0)))) + +(defun sb-impl::sxhash-instance (x) + (cond + ((std-instance-p x) (std-instance-hash x)) + ((fsc-instance-p x) (fsc-instance-hash x)) + (t (bug "SXHASH-INSTANCE called on some weird thing: ~S" x)))) + ;;;; structure-instance stuff ;;;; ;;;; FIXME: Now that the code is SBCL-only, this extra layer of