Skip to content

Commit

Permalink
0.9.17.3:
Browse files Browse the repository at this point in the history
	Fix negation of character-set types (reported by Anton Kazennikov
        on comp.lang.lisp).
  • Loading branch information
jsnell committed Oct 2, 2006
1 parent bfb7c2d commit 1f1ffa3
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 24 deletions.
2 changes: 2 additions & 0 deletions NEWS
@@ -1,6 +1,8 @@
;;;; -*- coding: utf-8; -*-
changes in sbcl-0.9.18 (1.0.beta?) relative to sbcl-0.9.16:
* bug fix: two potential GC deadlocks affecting threaded builds.
* bug fix: (TYPEP #\A '(NOT (MEMBER #\" #\{ #\:))) now correctly
returns T (reported by Anton Kazennikov)

changes in sbcl-0.9.17 (0.9.99?) relative to sbcl-0.9.16:
* feature: weak hash tables, see MAKE-HASH-TABLE documentation
Expand Down
46 changes: 23 additions & 23 deletions src/code/late-type.lisp
Expand Up @@ -3104,29 +3104,29 @@ used for a COMPLEX component.~:@>"
(!define-type-method (character-set :negate) (type)
(let ((pairs (character-set-type-pairs type)))
(if (and (= (length pairs) 1)
(= (caar pairs) 0)
(= (cdar pairs) (1- sb!xc:char-code-limit)))
(make-negation-type :type type)
(let ((not-character
(make-negation-type
:type (make-character-set-type
:pairs '((0 . #.(1- sb!xc:char-code-limit)))))))
(type-union
not-character
(make-character-set-type
:pairs (let (not-pairs)
(when (> (caar pairs) 0)
(push (cons 0 (1- (caar pairs))) not-pairs))
(do* ((tail pairs (cdr tail))
(high1 (cdar tail))
(low2 (caadr tail)))
((null (cdr tail))
(when (< (cdar tail) (1- sb!xc:char-code-limit))
(push (cons (1+ (cdar tail))
(1- sb!xc:char-code-limit))
not-pairs))
(nreverse not-pairs))
(push (cons (1+ high1) (1- low2)) not-pairs)))))))))
(= (caar pairs) 0)
(= (cdar pairs) (1- sb!xc:char-code-limit)))
(make-negation-type :type type)
(let ((not-character
(make-negation-type
:type (make-character-set-type
:pairs '((0 . #.(1- sb!xc:char-code-limit)))))))
(type-union
not-character
(make-character-set-type
:pairs (let (not-pairs)
(when (> (caar pairs) 0)
(push (cons 0 (1- (caar pairs))) not-pairs))
(do* ((tail pairs (cdr tail))
(high1 (cdar tail) (cdar tail))
(low2 (caadr tail) (caadr tail)))
((null (cdr tail))
(when (< (cdar tail) (1- sb!xc:char-code-limit))
(push (cons (1+ (cdar tail))
(1- sb!xc:char-code-limit))
not-pairs))
(nreverse not-pairs))
(push (cons (1+ high1) (1- low2)) not-pairs)))))))))

(!define-type-method (character-set :unparse) (type)
(cond
Expand Down
18 changes: 18 additions & 0 deletions tests/type.pure.lisp
Expand Up @@ -257,6 +257,7 @@
(let ((deriver (intern (format nil "~A-DERIVE-UNSIGNED-~:[HIGH~;LOW~]-BOUND"
op minimize)
(find-package :sb-c))))
(format t "testing type derivation: ~A~%" deriver)
(loop for a from 0 below size do
(loop for b from a below size do
(loop for c from 0 below size do
Expand Down Expand Up @@ -346,3 +347,20 @@ ACTUAL ~D DERIVED ~D~%"

(assert (typep #p"" 'sb-kernel:instance))
(assert (subtypep '(member #p"") 'sb-kernel:instance))

(with-test (:name (:typep :character-set :negation))
(flet ((generate-chars ()
(loop repeat 100
collect (code-char (random char-code-limit)))))
(dotimes (i 1000)
(let* ((chars (generate-chars))
(type `(member ,@chars))
(not-type `(not ,type)))
(dolist (char chars)
(assert (typep char type))
(assert (not (typep char not-type))))
(let ((other-chars (generate-chars)))
(dolist (char other-chars)
(unless (member char chars)
(assert (not (typep char type)))
(assert (typep char not-type)))))))))
2 changes: 1 addition & 1 deletion version.lisp-expr
Expand Up @@ -17,4 +17,4 @@
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
"0.9.17.2"
"0.9.17.3"

0 comments on commit 1f1ffa3

Please sign in to comment.