0.7.9.49:
[sbcl.git] / src / pcl / low.lisp
index 44c4036..d4a4af5 100644 (file)
@@ -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
 
 (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))
 \f
 (declaim (inline clos-slots-ref (setf clos-slots-ref)))
 (declaim (ftype (function (simple-vector index) t) clos-slots-ref))
 ;;; SET-FUN-NAME-INTERN which takes a list spec for a function
 ;;; name and turns it into a symbol if need be.
 ;;;
-;;; When given a funcallable instance, SET-FUN-NAME *must*
-;;; side-effect that FIN to give it the name. When given any other
-;;; kind of function SET-FUN-NAME is allowed to return a new
-;;; function which is "the same" except that it has the name.
+;;; When given a funcallable instance, SET-FUN-NAME *must* side-effect
+;;; that FIN to give it the name. When given any other kind of
+;;; function SET-FUN-NAME is allowed to return a new function which is
+;;; "the same" except that it has the name.
 ;;;
 ;;; In all cases, SET-FUN-NAME must return the new (or same)
 ;;; function. (Unlike other functions to set stuff, it does not return
                 (typep fcn 'generic-function)
                 (eq (class-of fcn) *the-class-standard-generic-function*))
             (setf (sb-kernel:%funcallable-instance-info fcn 1) new-name)
-            (error 'simple-type-error
-                   :datum fcn
-                   :expected-type 'generic-function
-                   :format-control "internal error: bad function type"))
+            (bug "unanticipated function type"))
         fcn)
        (t
         ;; pw-- This seems wrong and causes trouble. Tests show
   (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
 ;;; 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
       (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)))
 
         ,wrapper
         nil)))
 \f
+;;;; 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))))
+\f
 ;;;; structure-instance stuff
 ;;;;
 ;;;; FIXME: Now that the code is SBCL-only, this extra layer of