- (let ((res (copy-policy policy)))
- (dolist (quality (cdr spec))
- (let ((quality (if (atom quality) (list quality 3) quality)))
- (if (and (consp (cdr quality)) (null (cddr quality))
- (typep (second quality) 'real) (<= 0 (second quality) 3))
- (let ((value (rational (second quality))))
- (case (first quality)
- (speed (setf (policy-speed res) value))
- (space (setf (policy-space res) value))
- (safety (setf (policy-safety res) value))
- (compilation-speed (setf (policy-cspeed res) value))
- ;; FIXME: BREVITY is an undocumented name for it,
- ;; should go away. And INHIBIT-WARNINGS is a
- ;; misleading name for it. Perhaps BREVITY would be
- ;; better. But the ideal name would have connotations
- ;; of suppressing only optimization-related notes,
- ;; which I think is the behavior. Perhaps
- ;; INHIBIT-NOTES?
- ((inhibit-warnings brevity) (setf (policy-brevity res) value))
- ((debug-info debug) (setf (policy-debug res) value))
- (t
- (compiler-warning "unknown optimization quality ~S in ~S"
- (car quality) spec))))
- (compiler-warning
- "malformed optimization quality specifier ~S in ~S"
- quality spec))))
- res))
+ (let ((result policy)) ; may have new entries pushed on it below
+ (dolist (q-and-v-or-just-q (cdr spec))
+ (multiple-value-bind (quality raw-value)
+ (if (atom q-and-v-or-just-q)
+ (values q-and-v-or-just-q 3)
+ (destructuring-bind (quality raw-value) q-and-v-or-just-q
+ (values quality raw-value)))
+ (cond ((not (policy-quality-p quality))
+ (compiler-warning "ignoring unknown optimization quality ~
+ ~S in ~S"
+ quality spec))
+ ((not (and (typep raw-value 'real) (<= 0 raw-value 3)))
+ (compiler-warning "ignoring bad optimization value ~S in ~S"
+ raw-value spec))
+ (t
+ (push (cons quality (rational raw-value))
+ result)))))
+ result))