0.9.6.36:
authorChristophe Rhodes <csr21@cam.ac.uk>
Wed, 9 Nov 2005 13:02:46 +0000 (13:02 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Wed, 9 Nov 2005 13:02:46 +0000 (13:02 +0000)
More checking.  No more CHANGE-CLASS to metaobject classes,
except for FORWARD-REFERENCED-CLASS -> CLASS

src/code/condition.lisp
src/pcl/methods.lisp
src/pcl/std-class.lisp
version.lisp-expr

index 165fa06..32db3f7 100644 (file)
      (destructuring-bind (type data) (cdr reference)
        (ecase type
          (:initialization
-          (format stream "Initialization of ~A Metaobjects" data))
+          (format stream "Initialization of ~:(~A~) Metaobjects"
+                  (substitute #\  #\- (symbol-name data))))
          (:generic-function (format stream "Generic Function ~S" data))
          (:section (format stream "Section ~{~D~^.~}" data)))))
     (:ansi-cl
index 9b8487f..041bcd6 100644 (file)
@@ -63,7 +63,7 @@
                  (error 'metaobject-initialization-violation
                   :format-control ,(format nil "~@<~A~@:>" control)
                   :format-arguments (list ',name)
-                  :references (list '(:amop :initialization "Method"))))))
+                  :references (list '(:amop :initialization method))))))
   (def reinitialize-instance ((method method) &rest initargs)
     "Method objects cannot be redefined by ~S.")
   (def change-class ((method method) new &rest initargs)
index 651437a..9952a16 100644 (file)
 (defmethod change-class ((instance standard-object) (new-class standard-class)
                          &rest initargs)
   (let ((cpl (class-precedence-list new-class)))
-    (when (member (find-class 'method) cpl)
-      (error 'metaobject-initialization-violation
-             :format-control "~@<Cannot ~S objects into ~S metaobjects.~@:>"
-             :format-arguments (list 'change-class 'method)
-             :references (list '(:amop :initialization "Method")))))
+    (dolist (class cpl)
+      (macrolet
+          ((frob (class-name)
+             `(when (eq class (find-class ',class-name))
+               (error 'metaobject-initialization-violation
+                :format-control "~@<Cannot ~S objects into ~S metaobjects.~@:>"
+                :format-arguments (list 'change-class ',class-name)
+                :references (list '(:amop :initialization ,class-name))))))
+        (frob class)
+        (frob generic-function)
+        (frob method)
+        (frob slot-definition))))
+  (change-class-internal instance new-class initargs))
+
+(defmethod change-class ((instance forward-referenced-class)
+                         (new-class standard-class) &rest initargs)
+  (let ((cpl (class-precedence-list new-class)))
+    (dolist (class cpl
+             (error 'metaobject-initialization-violation
+                    :format-control
+                    "~@<Cannot ~S ~S objects into non-~S objects.~@:>"
+                    :format-arguments
+                    (list 'change-class 'forward-referenced-class 'class)
+                    :references
+                    (list '(:amop :generic-function ensure-class-using-class)
+                          '(:amop :initialization class))))
+      (when (eq class (find-class 'class))
+        (return nil))))
   (change-class-internal instance new-class initargs))
 
 (defmethod change-class ((instance funcallable-standard-object)
index 93edf13..7914857 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.6.35"
+"0.9.6.36"