Update of /project/elephant/cvsroot/elephant/src In directory common-lisp.net:/tmp/cvs-serv32303/src
Modified Files: metaclasses.lisp Log Message: merged in andrew's fixes: class slots, inheritence. added slot-boundp, slot-makunbound.
Date: Mon Aug 30 23:15:13 2004 Author: blee
Index: elephant/src/metaclasses.lisp diff -u elephant/src/metaclasses.lisp:1.2 elephant/src/metaclasses.lisp:1.3 --- elephant/src/metaclasses.lisp:1.2 Sun Aug 29 22:40:06 2004 +++ elephant/src/metaclasses.lisp Mon Aug 30 23:15:12 2004 @@ -80,14 +80,14 @@ (defmethod slot-definition-allocation ((slot-definition persistent-slot-definition)) :class)
-#+(or cmu sbcl) -(defmethod initialize-internal-slot-functions ((slot persistent-slot-definition)) - (handle-optimized-accessors slot)) - (defmethod direct-slot-definition-class ((class persistent-metaclass) &rest initargs) (let ((allocation-key (getf initargs :allocation)) (transient-p (getf initargs :transient))) - (cond ((or (eq allocation-key :class) transient-p) + (cond ((and (eq allocation-key :class) transient-p) + (find-class 'transient-direct-slot-definition)) + ((and (eq allocation-key :class) (not transient-p)) + (error "Persistent class slots are not supported, try :transient t.")) + (transient-p (find-class 'transient-direct-slot-definition)) (t (find-class 'persistent-direct-slot-definition))))) @@ -95,6 +95,9 @@ (defmethod validate-superclass ((class persistent-metaclass) (super standard-class)) t)
+(defmethod validate-superclass ((class standard-class) (super persistent-metaclass)) + nil) + (defgeneric persistent-p (class))
(defmethod persistent-p ((class t)) @@ -103,6 +106,9 @@ (defmethod persistent-p ((class persistent-metaclass)) t)
+(defmethod persistent-p ((class persistent-slot-definition)) + t) + (defmethod effective-slot-definition-class ((class persistent-metaclass) &rest initargs) (let ((transient-p (getf initargs :transient))) (cond (transient-p @@ -110,6 +116,29 @@ (t (find-class 'persistent-effective-slot-definition)))))
+#+(or cmu sbcl) +(defgeneric ensure-storage-exists (class slot-definition slot-name)) + +#+(or cmu sbcl) +(defmethod ensure-storage-exists (class slot-definition slot-name) + nil) + +#+(or cmu sbcl) +(defmethod ensure-storage-exists (class (slot-definition persistent-slot-definition) slot-name) + (let ((use-class (or (slot-definition-allocation-class slot-definition) + class))) + (when (not (assoc slot-name (class-slot-cells use-class))) + (setf (plist-value use-class 'class-slot-cells) + (append + (plist-value use-class 'class-slot-cells) + (list (cons slot-name +slot-unbound+))))))) + +#+(or cmu sbcl) +(defmethod compute-effective-slot-definition :around ((class persistent-metaclass) slot-name direct-slot-definitions) + (let ((slot-definition (call-next-method))) + (ensure-storage-exists class slot-definition slot-name) + slot-definition)) + (defun ensure-transient-chain (slot-definitions initargs) (declare (ignore initargs)) (loop for slot-definition in slot-definitions @@ -123,8 +152,6 @@ (setf (getf initargs :allocation) :class) initargs))))
-(defparameter *buffer* (make-array 1000)) - (defmacro persistent-slot-reader (instance name) `(progn (buffer-write-int (oid ,instance) *key-buf*) @@ -139,10 +166,11 @@ #-cmu (error 'unbound-slot :instance ,instance :name ,name)))))
+#+(or cmu sbcl) (defun make-persistent-reader (name) (lambda (instance) (declare (optimize (speed 3)) - (type persistent instance)) + (type persistent-object instance)) (persistent-slot-reader instance name)))
(defmacro persistent-slot-writer (new-value instance name) @@ -157,23 +185,39 @@ :auto-commit *auto-commit*) ,new-value)))
+#+(or cmu sbcl) (defun make-persistent-writer (name) (lambda (new-value instance) (declare (optimize (speed 3)) - (type persistent instance)) + (type persistent-object instance)) (persistent-slot-writer new-value instance name)))
-(defgeneric handle-optimized-accessors (slot-def)) +(defmacro persistent-slot-boundp (instance name) + `(progn + (buffer-write-int (oid ,instance) *key-buf*) + (let* ((key-length (serialize ,name *key-buf*)) + (buf (db-get-key-buffered + (controller-db *store-controller*) + (buffer-stream-buffer *key-buf*) + key-length))) + (if buf T nil))))
-(defmethod handle-optimized-accessors ((slot-def t)) - slot-def) +#+(or cmu sbcl) +(defun make-persistent-slot-boundp (name) + (lambda (instance) + (declare (optimize (speed 3)) + (type persistent-object instance)) + (persistent-slot-boundp instance name)))
-(defmethod handle-optimized-accessors ((slot-def persistent-slot-definition)) +#+(or cmu sbcl) +(defmethod initialize-internal-slot-functions ((slot-def persistent-slot-definition)) (let ((name (slot-definition-name slot-def))) (setf (slot-definition-reader-function slot-def) (make-persistent-reader name)) (setf (slot-definition-writer-function slot-def) - (make-persistent-writer name))) + (make-persistent-writer name)) + (setf (slot-definition-boundp-function slot-def) + (make-persistent-slot-boundp name))) slot-def)
(defun persistent-slot-names (class) @@ -181,3 +225,9 @@ (loop for slot-definition in slot-definitions when (equalp (class-of slot-definition) (find-class 'persistent-effective-slot-definition)) collect (slot-definition-name slot-definition)))) + +(defun transient-slot-names (class) + (let ((slot-definitions (class-slots class))) + (loop for slot-definition in slot-definitions + unless (persistent-p slot-definition) + collect (slot-definition-name slot-definition)))) \ No newline at end of file