+ ;; If buffer-undo-list is neither t (in which case undo
+ ;; information is not recorded) nor equal to buffer-undo-list
+ ;; before body was evaluated (in which case evaluating body
+ ;; did not add items to buffer-undo-list) ...
+ (when (and (not (eq buffer-undo-list t))
+ (not (eq buffer-undo-list old-bul)))
+ (let ((ptr buffer-undo-list) body-undo-list)
+ ;; ... then loop over buffer-undo-list, until the head of
+ ;; buffer-undo-list before body was evaluated is found ...
+ (while (not (eq ptr old-bul))
+ ;; ... and add the entries to body-undo-list, unless
+ ;; they are of the form (t . <something>), which are
+ ;; entries that record buffer modification timestamps.
+ (unless (and (consp (car ptr))
+ (eq (caar ptr) t))
+ (push (car ptr) body-undo-list))
+ (setq ptr (cdr ptr)))
+ (setq body-undo-list (nreverse body-undo-list))
+ ;; Add an (apply ...) entry to buffer-undo-list, using
+ ;; body-undo-list ...
+ (push (list 'apply
+ (- end end-marker)
+ beg
+ (marker-position end-marker)
+ #'undo--wrap-and-run-primitive-undo
+ beg (marker-position end-marker)
+ body-undo-list)
+ buffer-undo-list)
+ ;; ... and set the cdr of buffer-undo-list to
+ ;; buffer-undo-list before body was evaluated.
+ (setcdr buffer-undo-list old-bul)))