-(when (and (not (featurep 'xemacs))
- (= emacs-major-version 21)
- (>= emacs-minor-version 3)
- (condition-case code
- (let ((byte-compile-error-on-warn t))
- (byte-optimize-form (quote (pop x)) t)
- nil)
- (error (string-match "called for effect"
- (error-message-string code)))))
- (defadvice byte-optimize-form-code-walker (around silence-warn-for-pop
- (form for-effect)
- activate)
- "Silence the warning \"...called for effect\" for the `pop' form.
-It is effective only when the `pop' macro is defined by cl.el rather
-than subr.el."
- (let (tmp)
- (if (and (eq (car-safe form) 'car)
- for-effect
- (setq tmp (get 'car 'side-effect-free))
- (not byte-compile-delete-errors)
- (not (eq tmp 'error-free))
- (eq (car-safe (cadr form)) 'prog1)
- (let ((var (cadr (cadr form)))
- (last (nth 2 (cadr form))))
- (and (symbolp var)
- (null (nthcdr 3 (cadr form)))
- (eq (car-safe last) 'setq)
- (eq (cadr last) var)
- (eq (car-safe (nth 2 last)) 'cdr)
- (eq (cadr (nth 2 last)) var))))
- (progn
- (put 'car 'side-effect-free 'error-free)
- (unwind-protect
- ad-do-it
- (put 'car 'side-effect-free tmp)))
- ad-do-it))))
-
-(when (and (not (featurep 'xemacs))
- (byte-optimize-form '(and (> 0 1) foo) t))
- (defadvice byte-optimize-form-code-walker
- (around fix-bug-in-and/or-forms (form for-effect) activate)
- "Optimize the rest of the and/or forms.
-It has been fixed in XEmacs before releasing 21.4 and also has been
-fixed in Emacs after 21.3."
- (if (and for-effect (memq (car-safe form) '(and or)))
- (let ((fn (car form))
- (backwards (reverse (cdr form))))
- (while (and backwards
- (null (setcar backwards
- (byte-optimize-form (car backwards) t))))
- (setq backwards (cdr backwards)))
- (if (and (cdr form) (null backwards))
- (byte-compile-log
- " all subforms of %s called for effect; deleted" form))
- (when backwards
- (setcdr backwards
- (mapcar 'byte-optimize-form (cdr backwards))))
- (setq ad-return-value (cons fn (nreverse backwards))))
- ad-do-it)))
-