[Openmcl-cvs-notifications] r11121 - /trunk/source/level-1/l1-typesys.lisp
gz at clozure.com
gz at clozure.com
Fri Oct 17 08:34:34 EDT 2008
Author: gz
Date: Fri Oct 17 08:34:34 2008
New Revision: 11121
Log:
>From working-0711 branch: class/class subtypep method uses bitmaps and ordi=
nals, for better performance
Modified:
trunk/source/level-1/l1-typesys.lisp
Modified: trunk/source/level-1/l1-typesys.lisp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/level-1/l1-typesys.lisp (original)
+++ trunk/source/level-1/l1-typesys.lisp Fri Oct 17 08:34:34 2008
@@ -1746,7 +1746,6 @@
(istruct-typep x 'negation-ctype))
=
(setf (type-predicate 'negation-ctype) 'negation-ctype-p)
-
=
(define-type-method (negation :unparse) (x)
`(not ,(type-specifier (negation-ctype-type x))))
@@ -3436,8 +3435,6 @@
(member (istruct-type-name x)
'(args-ctype values-ctype function-ct=
ype))))
=
-(defun valuec-ctype-p (x) (istruct-typep x 'values-ctype))
-
(setf (type-predicate 'args-ctype) 'args-ctype-p
(type-predicate 'function-ctype) 'function-ctype-p
(type-predicate 'values-ctype) 'values-ctype-p)
@@ -3455,15 +3452,28 @@
(let* ((class1 (if (class-ctype-p type1) (class-ctype-class type1)))
(class2 (if (class-ctype-p type2) (class-ctype-class type2))))
(if (and class1 class2)
- (if (memq class2 (class-direct-superclasses class1))
- (values t t)
- (if (or (class-has-a-forward-referenced-superclass-p class1)
- (typep class1 'compile-time-class))
- (values nil nil)
- (let ((supers (%inited-class-cpl class1)))
- (if (memq class2 supers)
- (values t t)
- (values nil t)))))
+ (let* ((ordinal2 (%class-ordinal class2))
+ (wrapper1 (%class.own-wrapper class1))
+ (bits1 (if wrapper1 (%wrapper-cpl-bits wrapper1))))
+ (if bits1
+ (locally (declare (simple-bit-vector bits1)
+ (optimize (speed 3) (safety 0)))
+ (values (if (< ordinal2 (length bits1))
+ (not (eql 0 (sbit bits1 ordinal2))))
+ t))
+ (if (%standard-instance-p class1)
+ (if (memq class2 (%class.local-supers class1))
+ (values t t)
+ (if (eq (%class-of-instance class1)
+ *forward-referenced-class-class*)
+ (values nil nil)
+ ;; %INITED-CLASS-CPL will return NIL if class1 can't
+ ;; be finalized; in that case, we don't know the answer.
+ (let ((supers (%inited-class-cpl class1)))
+ (if (memq class2 supers)
+ (values t t)
+ (values nil (not (null supers)))))))
+ (values nil t))))
(values nil t))))
=
(defun find-class-intersection (c1 c2)
More information about the Openmcl-cvs-notifications
mailing list