Function: edebug-make-form-wrapper
edebug-make-form-wrapper is a byte-compiled function defined in
edebug.el.gz.
Signature
(edebug-make-form-wrapper CURSOR FORM-BEGIN FORM-END &optional SPECLIST)
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/edebug.el.gz
(defun edebug-make-form-wrapper (cursor form-begin form-end
&optional speclist)
;; Wrap a form, usually a defining form, but any evaluated one.
;; If speclist is non-nil, this is being called by edebug-defining-form.
;; Otherwise it is being called from edebug-read-and-maybe-wrap-form1.
;; This is a hack, but I haven't figured out a simpler way yet.
(let* ((form-data-entry (edebug-get-form-data-entry form-begin form-end))
;; Set this marker before parsing.
(edebug-form-begin-marker
(if form-data-entry
(edebug--form-data-begin form-data-entry)
;; Buffer must be current-buffer for this to work:
(set-marker (make-marker) form-begin))))
(let (edebug-offset-list
(edebug-offset-index 0)
result
;; For definitions.
;; (edebug-containing-def-name edebug-def-name)
;; Get name from form-data, if any.
(edebug-old-def-name (edebug--form-data-name form-data-entry))
edebug-def-name
edebug-def-args
edebug-inside-func;; whether wrapped code executes inside a function.
)
(setq result
(if speclist
(edebug-match cursor speclist)
;; else wrap as an enter-form.
(edebug-make-enter-wrapper (list (edebug-form cursor)))))
;; Set the name here if it was not set by edebug-make-enter-wrapper.
(setq edebug-def-name
(or edebug-def-name edebug-old-def-name (gensym "edebug-anon")))
;; Add this def as a dependent of containing def. Buggy.
'(if (and edebug-containing-def-name
(not (get edebug-containing-def-name 'edebug-dependents)))
(put edebug-containing-def-name 'edebug-dependents
(cons edebug-def-name
(get edebug-containing-def-name
'edebug-dependents))))
;; Create a form-data-entry or modify existing entry's markers.
;; In the latter case, pointers to the entry remain eq.
(if (not form-data-entry)
(setq form-data-entry
(edebug--make-form-data-entry
edebug-def-name
edebug-form-begin-marker
;; Buffer must be current-buffer.
(set-marker (make-marker) form-end)
))
(edebug-set-form-data-entry
form-data-entry edebug-def-name ;; in case name is changed
form-begin form-end))
;; (message "defining: %s" edebug-def-name) (sit-for 2)
(edebug-make-top-form-data-entry form-data-entry)
;;(debug edebug-def-name)
;; Destructively reverse edebug-offset-list and make vector from it.
(setq edebug-offset-list (vconcat (nreverse edebug-offset-list)))
;; Side effects on the property list of edebug-def-name.
(edebug-clear-frequency-count edebug-def-name)
(edebug-clear-coverage edebug-def-name)
;; Set up the initial window data.
(if (not edebug-top-window-data) ;; if not already set, do it now.
(let ((window ;; Find the best window for this buffer.
(or (get-buffer-window (current-buffer))
(selected-window))))
(setq edebug-top-window-data
(cons window (window-start window)))))
;; Store the edebug data in symbol's property list.
;; We actually want to remove this property entirely, but can't.
(put edebug-def-name 'ghost-edebug nil)
(put edebug-def-name 'edebug
;; A struct or vector would be better here!!
(list edebug-form-begin-marker
(edebug--restore-breakpoints edebug-old-def-name)
edebug-offset-list
edebug-top-window-data))
(funcall edebug-new-definition-function edebug-def-name)
result
)))