(ctor-function-name ctor))))
(defun make-ctor-function-name (class-name initargs safe-code-p)
- (list* 'ctor class-name safe-code-p initargs))
+ (labels ((arg-name (x)
+ (typecase x
+ ;; this list of types might look arbitrary but it is
+ ;; exactly the set of types descended into by EQUAL,
+ ;; which is the predicate used by globaldb to test for
+ ;; name equality.
+ (list (gensym "LIST-INITARG-"))
+ (string (gensym "STRING-INITARG-"))
+ (bit-vector (gensym "BIT-VECTOR-INITARG-"))
+ (pathname (gensym "PATHNAME-INITARG-"))
+ (t x)))
+ (munge (list)
+ (let ((*gensym-counter* 0))
+ (mapcar #'arg-name list))))
+ (list* 'ctor class-name safe-code-p (munge initargs))))
;;; Keep this a separate function for testing.
(defun ensure-ctor (function-name class-name initargs safe-code-p)
(declare (ignore ii-methods si-methods))
(let ((class (ctor-class ctor))
(lambda-list (make-ctor-parameter-list ctor))
- (initargs (quote-plist-keys (ctor-initargs ctor))))
+ (initargs (ctor-initargs ctor)))
(if use-make-instance
`(lambda ,lambda-list
(declare #.*optimize-speed*)
;; *COMPILING-OPTIMIZED-CONSTRUCTOR* which is bound around
;; compilation of the constructor, hence avoiding the
;; possibility of endless recursion.
- (make-instance ,class ,@initargs))
+ (make-instance ,class ,@(quote-plist-keys initargs)))
(let ((defaults (class-default-initargs class)))
(when defaults
(setf initargs (ctor-default-initargs initargs defaults)))
`(lambda ,lambda-list
(declare #.*optimize-speed*)
- (fast-make-instance ,class ,@initargs))))))
+ (fast-make-instance ,class ,@(quote-plist-keys initargs)))))))
;;; Not as good as the real optimizing generator, but faster than going
;;; via MAKE-INSTANCE: 1 GF call less, and no need to check initargs.