[Openmcl-cvs-notifications] r10722 - /trunk/source/lib/setf.lisp
gz at clozure.com
gz at clozure.com
Fri Sep 12 10:13:56 EDT 2008
Author: gz
Date: Fri Sep 12 10:13:55 2008
New Revision: 10722
Log:
make incf/decf propagate explicit type info, so that (incf (the fixnum (svr=
ef x y))) knows to do a fixnum addition without overflow checking
Modified:
trunk/source/lib/setf.lisp
Modified: trunk/source/lib/setf.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/lib/setf.lisp (original)
+++ trunk/source/lib/setf.lisp Fri Sep 12 10:13:55 2008
@@ -315,11 +315,17 @@
`(setq ,place (+ ,place ,delta))
(multiple-value-bind (dummies vals newval setter getter)
(get-setf-method place env)
- (let ((d (gensym)))
+ (let ((d (gensym))
+ ;; Doesn't propagate inferred types, but better than nothing.
+ (d-type (cond ((constantp delta) (type-of delta))
+ ((and (consp delta) (eq (car delta) 'the)) (cadr=
delta))
+ (t t)))
+ (v-type (if (and (consp place) (eq (car place) 'the)) (cadr pl=
ace) t)))
`(let* (,@(mapcar #'list dummies vals)
(,d ,delta)
(,(car newval) (+ ,getter ,d)))
- ,setter)))))
+ (declare (type ,d-type ,d) (type ,v-type ,(car newval)))
+ ,setter)))))
=
(defmacro decf (place &optional (delta 1) &environment env)
"The first argument is some location holding a number. This number is
@@ -331,11 +337,17 @@
`(setq ,place (- ,place ,delta))
(multiple-value-bind (dummies vals newval setter getter)
(get-setf-method place env)
- (let ((d (gensym)))
+ (let* ((d (gensym))
+ ;; Doesn't propagate inferred types, but better than nothing.
+ (d-type (cond ((constantp delta) (type-of delta))
+ ((and (consp delta) (eq (car delta) 'the)) (cad=
r delta))
+ (t t)))
+ (v-type (if (and (consp place) (eq (car place) 'the)) (cadr p=
lace) t)))
`(let* (,@(mapcar #'list dummies vals)
(,d ,delta)
(,(car newval) (- ,getter ,d)))
- ,setter)))))
+ (declare (type ,d-type ,d) (type ,v-type ,(car newval)))
+ ,setter)))))
=
(defmacro psetf (&whole call &rest pairs &environment env) ;same structur=
e as psetq
"This is to SETF as PSETQ is to SETQ. Args are alternating place
More information about the Openmcl-cvs-notifications
mailing list