@@ -84,21 +84,32 @@ or SUBOPTIMAL-NOTE is non-NIL, then emits a OPTIMIZATION-FAILURE-NOTE
8484
8585(with-eval-always
8686 (defun sbcl-version-spec-list (&optional version)
87- (mapcar #' parse-integer
88- (uiop :split-string (or version (lisp-implementation-version ))
89- :separator ' (#\. ))))
87+ (let ((spec-list (uiop :split-string (or version (lisp-implementation-version ))
88+ :separator ' (#\. ))))
89+ (cond ((nth 2 spec-list) ; there are atleast three elements
90+ (handler-case (loop :for elt :in spec-list
91+ :collect (parse-integer elt :junk-allowed t ))
92+ (parse-error () ` (0 0 0 ))))
93+ (t
94+ ` (0 0 0 )))))
9095
9196 (defun sbcl-version-spec-integer (&optional version)
92- (destructuring-bind (major-1 major-2 minor)
97+ (destructuring-bind (major-1 major-2 minor &rest sub-minor )
9398 (sbcl-version-spec-list version)
99+ (declare (ignore sub-minor))
94100 (+ (* 12 (+ (* 10 major-1) major-2))
95101 minor))))
96102
97103(define-constant +optimize-speed-or-compilation-speed+
98104 ; ; optimize for compilation-speed for SBCL>2.2.3 else for speed
99105 (if (and (string= " SBCL" (lisp-implementation-type ))
100- (< (sbcl-version-spec-integer " 2.2.3" )
101- (sbcl-version-spec-integer (lisp-implementation-version ))))
106+ (let ((spec-integer (sbcl-version-spec-integer (lisp-implementation-version ))))
107+ (if (zerop spec-integer)
108+ (progn
109+ (warn " Detected implementation to be SBCL but could not parse version ~A as X.Y.Z~% Optimizing polymorphic-functions for compilation-speed." (lisp-implementation-version ))
110+ t )
111+ (< (sbcl-version-spec-integer " 2.2.3" )
112+ spec-integer))))
102113 ` (optimize compilation-speed )
103114 ` (optimize speed ))
104115 :test #' equal )
0 commit comments