Skip to content

Commit

Permalink
0.9.11.22
Browse files Browse the repository at this point in the history
  * fixed type derivation of float boundaries from numbers outside the
    appropriate float range
  • Loading branch information
Gabor Melis committed Apr 7, 2006
1 parent 44c608e commit 9be4fff
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 19 deletions.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ changes in sbcl-0.9.12 relative to sbcl-0.9.11:
* fixed bug: Tests for the (VECTOR T) type gave the wrong answer
when given a vector displaced to an adjustable array. (reported
by Utz-Uwe Haus)
* bug fix: derivation of float boundaries from numbers outside the
appropriate float range (reported by John Wiseman)
* improvements to DOCUMENTATION for TYPE and STRUCTURE doc-types:
allow condition class objects as arguments to DOCUMENTATION and
(SETF DOCUMENTATION); only find and set documentation for
Expand Down
38 changes: 22 additions & 16 deletions src/compiler/float-tran.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -267,24 +267,30 @@
;;; defined range. Quite useful if we want to convert some type of
;;; bounded integer into a float.
(macrolet
((frob (fun type)
((frob (fun type most-negative most-positive)
(let ((aux-name (symbolicate fun "-DERIVE-TYPE-AUX")))
`(progn
(defun ,aux-name (num)
;; When converting a number to a float, the limits are
;; the same.
(let* ((lo (bound-func (lambda (x)
(coerce x ',type))
(numeric-type-low num)))
(hi (bound-func (lambda (x)
(coerce x ',type))
(numeric-type-high num))))
(specifier-type `(,',type ,(or lo '*) ,(or hi '*)))))

(defoptimizer (,fun derive-type) ((num))
(one-arg-derive-type num #',aux-name #',fun))))))
(frob %single-float single-float)
(frob %double-float double-float))
(defun ,aux-name (num)
;; When converting a number to a float, the limits are
;; the same.
(let* ((lo (bound-func (lambda (x)
(if (< x ,most-negative)
,most-negative
(coerce x ',type)))
(numeric-type-low num)))
(hi (bound-func (lambda (x)
(if (< ,most-positive x )
,most-positive
(coerce x ',type)))
(numeric-type-high num))))
(specifier-type `(,',type ,(or lo '*) ,(or hi '*)))))

(defoptimizer (,fun derive-type) ((num))
(one-arg-derive-type num #',aux-name #',fun))))))
(frob %single-float single-float
most-negative-single-float most-positive-single-float)
(frob %double-float double-float
most-negative-double-float most-positive-double-float))
) ; PROGN

;;;; float contagion
Expand Down
3 changes: 1 addition & 2 deletions tests/compiler.pure.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -2036,8 +2036,7 @@
;; Reported by John Wiseman, sbcl-devel
;; Subject: [Sbcl-devel] float type derivation bug?
;; Date: Tue, 4 Apr 2006 15:28:15 -0700
(with-test (:name (:type-derivation :float-bounds)
:fails-on :sbcl)
(with-test (:name (:type-derivation :float-bounds))
(compile nil '(lambda (bits)
(let* ((s (if (= (ash bits -31) 0) 1 -1))
(e (logand (ash bits -23) #xff))
Expand Down
2 changes: 1 addition & 1 deletion version.lisp-expr
Original file line number Diff line number Diff line change
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.11.21"
"0.9.11.22"

0 comments on commit 9be4fff

Please sign in to comment.