Function: edebug--display-1
edebug--display-1 is a byte-compiled function defined in edebug.el.gz.
Signature
(edebug--display-1 VALUE OFFSET-INDEX ARG-MODE)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/edebug.el.gz
(defun edebug--display-1 (value offset-index arg-mode)
(unless (marker-position edebug-def-mark)
;; The buffer holding the source has been killed.
;; Let's at least show a backtrace so the user can figure out
;; which function we're talking about.
(debug))
;; If we're in a `track-mouse' setting, then any previous mouse
;; movements will make `input-pending-p' later return true. So
;; discard the inputs in that case. (And `discard-input' doesn't
;; work here.)
(when track-mouse
(while (input-pending-p)
(read-event)))
;; Setup windows for edebug, determine mode, maybe enter recursive-edit.
;; Uses local variables of edebug-enter, edebug-before, edebug-after
;; and edebug-debugger.
(let ((edebug-active t) ; For minor mode alist.
(edebug-with-timeout-suspend (with-timeout-suspend))
edebug-stop ; Should we enter recursive-edit?
(edebug-point (+ edebug-def-mark
(aref (nth 2 edebug-data) offset-index)))
edebug-buffer-outside-point ; current point in edebug-buffer
;; window displaying edebug-buffer
(edebug-window-data (nth 3 edebug-data))
(edebug-outside-window (selected-window))
(edebug-outside-buffer (current-buffer))
(edebug-outside-point (point))
(edebug-outside-mark (mark t))
edebug-outside-windows ; Window or screen configuration.
edebug-buffer-points
edebug-eval-buffer ; Declared here so we can kill it below.
(eval-result-list (and edebug-eval-list
(edebug-eval-result-list)))
edebug-trace-window
edebug-trace-window-start
(edebug-outside-d-c-i-n-s-w
(default-value 'cursor-in-non-selected-windows)))
(unwind-protect
(let ((cursor-in-echo-area nil)
(unread-command-events nil)
;; any others??
)
(setq-default cursor-in-non-selected-windows t)
(if (not (buffer-name edebug-buffer))
(user-error "Buffer defining %s not found" edebug-function))
(if (eq 'after arg-mode)
;; Compute result string now before windows are modified.
(edebug-compute-previous-result value))
(if edebug-save-windows
;; Save windows now before we modify them.
(setq edebug-outside-windows
(edebug-current-windows edebug-save-windows)))
(if edebug-save-displayed-buffer-points
(setq edebug-buffer-points (edebug-get-displayed-buffer-points)))
;; First move the edebug buffer point to edebug-point
;; so that window start doesn't get changed when we display it.
;; I don't know if this is going to help.
;;(set-buffer edebug-buffer)
;;(goto-char edebug-point)
;; If edebug-buffer is not currently displayed,
;; first find a window for it.
(edebug-pop-to-buffer edebug-buffer (car edebug-window-data))
(setcar edebug-window-data (selected-window))
;; Now display eval list, if any.
;; This is done after the pop to edebug-buffer
;; so that buffer-window correspondence is correct after quitting.
(edebug-eval-display eval-result-list)
;; The evaluation list better not have deleted edebug-window-data.
(select-window (car edebug-window-data))
(if (not (memq (framep (selected-frame)) '(nil t pc)))
(x-focus-frame (selected-frame)))
(set-buffer edebug-buffer)
(setq edebug-buffer-outside-point (point))
(goto-char edebug-point)
(if (eq 'before arg-mode)
;; Check whether positions are up-to-date.
;; This assumes point is never before symbol.
(if (not (memq (following-char) '(?\( ?\# ?\` )))
(user-error "Source has changed - reevaluate definition of %s"
edebug-function)
))
;; Make sure we bind those in the right buffer (bug#16410).
(let ((overlay-arrow-position overlay-arrow-position)
(overlay-arrow-string overlay-arrow-string))
;; Now display arrow based on mode.
(edebug-overlay-arrow)
(cond
((eq 'error arg-mode)
;; Display error message
(setq edebug-execution-mode 'step)
(edebug-overlay-arrow)
(beep)
(if (eq 'quit (car value))
(message "Quit")
(edebug-report-error value)))
(edebug-break
(cond
(edebug-global-break
(message "Global Break: %s => %s"
edebug-global-break-condition
edebug-global-break-result))
(edebug-break-condition
(message "Break: %s => %s"
edebug-break-condition
edebug-break-result))
((not (eq edebug-execution-mode 'Continue-fast))
(message "Break"))
(t)))
(t (message "")))
(if (eq 'after arg-mode)
(progn
;; Display result of previous evaluation.
(if (and edebug-break
edebug-sit-on-break
(not (eq edebug-execution-mode 'Continue-fast)))
(sit-for edebug-sit-for-seconds)) ; Show message.
(edebug-previous-result)))
(cond
(edebug-break
(cond
((eq edebug-execution-mode 'continue)
(sit-for edebug-sit-for-seconds))
((eq edebug-execution-mode 'Continue-fast) (sit-for 0))
(t (setq edebug-stop t))))
;; not edebug-break
((eq edebug-execution-mode 'trace)
(sit-for edebug-sit-for-seconds)) ; Force update and pause.
((eq edebug-execution-mode 'Trace-fast)
(sit-for 0))) ; Force update and continue.
(when (input-pending-p)
(setq edebug-stop t)
(setq edebug-execution-mode 'step) ; for `edebug-overlay-arrow'
(edebug-stop))
(edebug-overlay-arrow)
(edebug--overlay-breakpoints edebug-function)
(unwind-protect
(if (or edebug-stop
(memq edebug-execution-mode '(step next))
(eq arg-mode 'error))
(edebug--recursive-edit arg-mode)) ; <--- Recursive edit
;; Reset the edebug-window-data to whatever it is now.
(let ((window (if (eq (window-buffer) edebug-buffer)
(selected-window)
(get-buffer-window edebug-buffer))))
;; Remember window-start for edebug-buffer, if still displayed.
(if window
(progn
(setcar edebug-window-data window)
(setcdr edebug-window-data (window-start window)))))
;; Save trace window point before restoring outside windows.
;; Could generalize this for other buffers.
(setq edebug-trace-window
(get-buffer-window edebug-trace-buffer))
(if edebug-trace-window
(setq edebug-trace-window-start
(and edebug-trace-window
(window-start edebug-trace-window))))
;; Restore windows before continuing.
(if edebug-save-windows
(progn
(edebug-set-windows edebug-outside-windows)
;; Restore displayed buffer points.
;; Needed even if restoring windows because
;; window-points are not restored. (should they be??)
(if edebug-save-displayed-buffer-points
(edebug-set-buffer-points edebug-buffer-points))
;; Unrestore trace window's window-point.
(if edebug-trace-window
(set-window-start edebug-trace-window
edebug-trace-window-start))
;; Unrestore edebug-buffer's window-start, if displayed.
(let ((window (car edebug-window-data)))
(if (and (window-live-p window)
(eq (window-buffer) edebug-buffer))
(progn
(set-window-start window (cdr edebug-window-data)
'no-force)
;; Unrestore edebug-buffer's window-point.
;; Needed in addition to setting the buffer point
;; - otherwise quitting doesn't leave point as is.
;; But can this causes point to not be restored.
;; Also, it may not be a visible window.
;; (set-window-point window edebug-point)
)))
;; Unrestore edebug-buffer's point. Rerestored below.
;; (goto-char edebug-point) ;; in edebug-buffer
)
;; Since we may be in a save-excursion, in case of quit,
;; reselect the outside window only.
;; Only needed if we are not recovering windows??
(if (window-live-p edebug-outside-window)
(select-window edebug-outside-window))
) ; if edebug-save-windows
;; Restore current buffer always, in case application needs it.
(if (buffer-name edebug-outside-buffer)
(set-buffer edebug-outside-buffer))
;; Restore point, and mark.
;; Needed even if restoring windows because
;; that doesn't restore point and mark in the current buffer.
;; But don't restore point if edebug-buffer is current buffer.
(if (not (eq edebug-buffer edebug-outside-buffer))
(goto-char edebug-outside-point))
(if (marker-buffer (mark-marker))
(set-marker (mark-marker) edebug-outside-mark))
)) ; unwind-protect
;; None of the following is done if quit or signal occurs.
;; Restore edebug-buffer's outside point.
;; (edebug-trace "restore edebug-buffer point: %s"
;; edebug-buffer-outside-point)
(with-current-buffer edebug-buffer
(goto-char edebug-buffer-outside-point))
;; ... nothing more.
)
(edebug--overlay-breakpoints-remove (point-min) (point-max))
;; Could be an option to keep eval display up.
(if edebug-eval-buffer (kill-buffer edebug-eval-buffer))
(with-timeout-unsuspend edebug-with-timeout-suspend)
;; Reset global variables to outside values in case they were changed.
(setq-default cursor-in-non-selected-windows edebug-outside-d-c-i-n-s-w)
)))