X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Ftypetran.lisp;h=c1b19088ae5529a6e36cb3cd6b3362eabd73b97e;hb=2034cb134af58c5998f4e305673af6e2c75bc179;hp=976b54a88c08ed95f8a1a580f4802a8c6e776507;hpb=15e14ef1ccd3ab6f4711632435a40493dc4cdd9d;p=sbcl.git diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp index 976b54a..c1b1908 100644 --- a/src/compiler/typetran.lisp +++ b/src/compiler/typetran.lisp @@ -292,6 +292,21 @@ `((typep (cdr ,n-obj) ',(type-specifier cdr-type)))))))))) +(defun source-transform-character-set-typep (object type) + (let ((pairs (character-set-type-pairs type))) + (if (and (= (length pairs) 1) + (= (caar pairs) 0) + (= (cdar pairs) (1- sb!xc:char-code-limit))) + `(characterp ,object) + (once-only ((n-obj object)) + (let ((n-code (gensym "CODE"))) + `(and (characterp ,n-obj) + (let ((,n-code (sb!xc:char-code ,n-obj))) + (or + ,@(loop for pair in pairs + collect + `(<= ,(car pair) ,n-code ,(cdr pair))))))))))) + ;;; Return the predicate and type from the most specific entry in ;;; *TYPE-PREDICATES* that is a supertype of TYPE. (defun find-supertype-predicate (type) @@ -371,7 +386,7 @@ ;; If not properly named, error. ((not (and name (eq (find-classoid name) class))) (compiler-error "can't compile TYPEP of anonymous or undefined ~ - class:~% ~S" + class:~% ~S" class)) (t ;; Delay the type transform to give type propagation a chance. @@ -493,6 +508,8 @@ (source-transform-array-typep object type)) (cons-type (source-transform-cons-typep object type)) + (character-set-type + (source-transform-character-set-typep object type)) (t nil)) `(%typep ,object ,spec))) (values nil t)))