~ chicken-core (chicken-5) 1bfc0df86da217edb58c36f3155f6ac799d8a69c


commit 1bfc0df86da217edb58c36f3155f6ac799d8a69c
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Sat Feb 13 19:21:33 2016 +0100
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sun Feb 14 08:56:18 2016 +1300

    Preserve type of argument in car in assq/assv procedure results.
    
    If the result is a pair, the car will always be the same type as the
    first procedure argument.  The list may consist of pairs of union
    types or unknown types, so this allows us to recover some type info
    due to the first argument in most cases being more specific.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/types.db b/types.db
index aa386489..920e4295 100644
--- a/types.db
+++ b/types.db
@@ -195,13 +195,13 @@
 	((* (list-of (or symbol procedure immediate)))
 	 (##core#inline "C_u_i_memq" #(1) #(2))))
 
-(assq (forall (a b) (#(procedure #:clean) assq (* (list-of (pair a b)))
-		     (or false (pair a b))))
+(assq (forall (a b c) (#(procedure #:clean) assq (a (list-of (pair b c)))
+		       (or false (pair a c))))
       ((* null) (let ((#(tmp) #(1))) '#f))
       ((* (list-of pair)) (##core#inline "C_u_i_assq" #(1) #(2))))
 
-(assv (forall (a b) (#(procedure #:clean) assv (* (list-of (pair a b)))
-		     (or false (pair a b))))
+(assv (forall (a b c) (#(procedure #:clean) assv (a (list-of (pair b c)))
+		       (or false (pair a c))))
       ((* null) (let ((#(tmp) #(1))) '#f))
       (((or symbol immediate procedure) (list-of pair))
        (##core#inline "C_u_i_assq" #(1) #(2)))
Trap