summaryrefslogtreecommitdiff
path: root/Lisp/internal-utilities.lisp
diff options
context:
space:
mode:
authorMatthias Benkard <code@mail.matthias.benkard.de>2007-09-17 23:29:58 +0200
committerMatthias Benkard <code@mail.matthias.benkard.de>2007-09-17 23:29:58 +0200
commitf98c79811e81eff07f967f28c108b76a4a7d1343 (patch)
tree9ad511a4309f00306e0f4bea95001c85578b0868 /Lisp/internal-utilities.lisp
parent909b52ce5a0c7a9beca639b830f5f57380af64ff (diff)
INVOKE-WITH-CONVERSION: Support classes as message receivers.
darcs-hash:f27d973190d6ada1ef35ab041229d1c0b88ee11c
Diffstat (limited to 'Lisp/internal-utilities.lisp')
-rw-r--r--Lisp/internal-utilities.lisp29
1 files changed, 18 insertions, 11 deletions
diff --git a/Lisp/internal-utilities.lisp b/Lisp/internal-utilities.lisp
index 4e9d481..13d4e47 100644
--- a/Lisp/internal-utilities.lisp
+++ b/Lisp/internal-utilities.lisp
@@ -90,14 +90,21 @@ collector."
(let ((hash-table (gensym))
(value (gensym))
(default-value (gensym))
- (hash-key (gensym)))
- `(let ((,hash-table (tg:make-weak-hash-table :weakness :key
- :test 'equal)))
- (defun ,name ,lambda-list
- (let* ((,hash-key ,hashing-form)
- (,value (gethash ,hash-key ,hash-table ',default-value)))
- (if (eq ',default-value ,value)
- (values-list
- (setf (gethash ,hash-key ,hash-table)
- (multiple-value-list (progn ,@body))))
- (values-list ,value)))))))
+ (hash-key (gensym))
+ (no-weak-hashing-p (handler-case
+ (prog1 nil
+ (tg:make-weak-hash-table :weakness :key
+ :test 'equal))
+ (serious-condition () t))))
+ (if no-weak-hashing-p
+ `(defun ,name ,lambda-list ,@body)
+ `(let ((,hash-table (tg:make-weak-hash-table :weakness :key
+ :test 'equal)))
+ (defun ,name ,lambda-list
+ (let* ((,hash-key ,hashing-form)
+ (,value (gethash ,hash-key ,hash-table ',default-value)))
+ (if (eq ',default-value ,value)
+ (values-list
+ (setf (gethash ,hash-key ,hash-table)
+ (multiple-value-list (progn ,@body))))
+ (values-list ,value))))))))