From: Nikodemus S. <nik...@ra...> - 2009-04-25 11:12:27
|
2009/4/25 Tobias C. Rittweiler <tc...@fr...>: > The patch does not guard against > > (defun foo (y) > (declare (optimize safety)) > (let ((x (cons 1 2))) > (declare (type (cons fixnum fixnum) x)) > (setf (car x) y) > (+ (car x) (cdr x)))) It's not intended to -- you're lying to the compiler. Inserting casts for things like that would be possible, but not in the general case: replace the (SETF CAR) with a call to FOO that does the same, and the compiler has no way to guard against it. (Ok, I suppose we could check the type again after any unknown call, but that would suck pretty badly -- not to mention that type TYPE-ERROR would arise after the damage has been done, which would be pretty wierd. The only thing that I can think of that could be done would be to never trust a specific CONS type or the dimensions of a non-simple ARRAY is safe code -- even if it is declared. Hm, yes, that might be a good idea. ...and note the wierdness of CONS and non-simple ARRAY types in the manual, of course... > And allowing just one LEAF reference is so simplistic that it may not > make any difference in praxis. But of course, once it's there even > though simplistic it can be improved in the future. :-) Yeah. There are probably a few case where it could be allowed -- like multiple CAR or CDR calls, but even then only if the type of CAR or CDR is not itself a "type that needs conservativism". Tricky, and I'm not quite convinced that it's worth the effort. > For example, the patch will inhibit deriving X,Y,Z to be of type FIXNUM > in the following: > > (declaim (ftype (function (fixnum fixnum) > (cons fixnum (cons fixnum (cons fixnum null)))) > compute-fixed-list)) > (defun compute-fixed-list (x y) > (list (1+ x) (1- y) (+ x y))) > > (defun bar (y) > (declare (optimize safety)) > (destructuring-bind (x y z) (compute-fixed-list 1 y) > (+ x y z))) > > For me that's the most obvious use case for specifying compound list > types. I believe the most common case is when you need to store pairs of fixnums and want to save one word as opposed to using (COMPLEX FIXNUM). I'll probably merge this patch as 1.0.28.early, and people who use (CONS FIXNUM) can then test it to see if they get performance regressions in their applications. Cheers, -- Nikodemus |