Mercurial > hg > xemacs-beta
comparison lisp/edebug/edebug.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | 56c54cf7c5b6 |
children | b9518feda344 |
comparison
equal
deleted
inserted
replaced
69:804d1389bcd6 | 70:131b0175ea99 |
---|---|
2 | 2 |
3 ;; Copyright (C) 1988,'89,'90,'91,'92,'93,'94,'95 Free Software Foundation, Inc | 3 ;; Copyright (C) 1988,'89,'90,'91,'92,'93,'94,'95 Free Software Foundation, Inc |
4 | 4 |
5 ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu> | 5 ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu> |
6 ;; Keywords: lisp, tools, maint | 6 ;; Keywords: lisp, tools, maint |
7 | |
8 ;; This file is part of XEmacs. | |
9 | |
10 ;; XEmacs is free software; you can redistribute it and/or modify it | |
11 ;; under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; XEmacs is distributed in the hope that it will be useful, but | |
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 ;; General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with XEmacs; see the file COPYING. If not, write to the Free | |
22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
23 ;; 02111-1307, USA. | |
24 | |
25 ;;; Synched up with: FSF 19.34. | |
26 | |
27 ;;; Commentary: | |
28 | 7 |
29 ;; LCD Archive Entry: | 8 ;; LCD Archive Entry: |
30 ;; edebug|Daniel LaLiberte|liberte@cs.uiuc.edu | 9 ;; edebug|Daniel LaLiberte|liberte@cs.uiuc.edu |
31 ;; |A source level debugger for Emacs Lisp. | 10 ;; |A source level debugger for Emacs Lisp. |
32 ;; |$Date: 1997/08/21 06:23:41 $|$Revision: 1.3 $|~/modes/edebug.el| | 11 ;; |$Date: 1996/12/18 22:43:07 $|$Revision: 1.1.1.1 $|~/modes/edebug.el| |
33 | 12 |
34 ;; This minor mode allows programmers to step through Emacs Lisp | 13 ;; This file is part of GNU Emacs. |
35 ;; source code while executing functions. You can also set | 14 |
36 ;; breakpoints, trace (stopping at each expression), evaluate | 15 ;; GNU Emacs is free software; you can redistribute it and/or modify |
37 ;; expressions as if outside Edebug, reevaluate and display a list of | 16 ;; it under the terms of the GNU General Public License as published by |
38 ;; expressions, trap errors normally caught by debug, and display a | 17 ;; the Free Software Foundation; either version 2, or (at your option) |
39 ;; debug style backtrace. | 18 ;; any later version. |
40 | 19 |
41 ;;; Installation | 20 ;; GNU Emacs is distributed in the hope that it will be useful, |
42 ;; ============= | 21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
43 | 22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
44 ;; Put edebug.el in some directory in your load-path and | 23 ;; GNU General Public License for more details. |
45 ;; byte-compile it. Also read the beginning of edebug-epoch.el, | 24 |
46 ;; cl-specs.el, and edebug-cl-read.el if they apply to you. | 25 ;; You should have received a copy of the GNU General Public License |
47 | 26 ;; along with GNU Emacs; see the file COPYING. If not, write to |
48 ;; Unless you are using Emacs 19 which is already set up to use Edebug, | 27 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
49 ;; put the following forms in your .emacs file. | 28 |
50 ;; (define-key emacs-lisp-mode-map "\C-xx" 'edebug-eval-top-level-form) | 29 ;;;; Commentary: |
51 ;; (autoload 'edebug-eval-top-level-form "edebug") | 30 |
52 | 31 ;;; This minor mode allows programmers to step through Emacs Lisp |
53 ;; If you wish to change the default edebug global command prefix, change: | 32 ;;; source code while executing functions. You can also set |
54 ;; (setq edebug-global-prefix "\C-xX") | 33 ;;; breakpoints, trace (stopping at each expression), evaluate |
55 | 34 ;;; expressions as if outside Edebug, reevaluate and display a list of |
56 ;; Other options, are described in the manual. | 35 ;;; expressions, trap errors normally caught by debug, and display a |
57 | 36 ;;; debug style backtrace. |
58 ;; In previous versions of Edebug, users were directed to set | 37 |
59 ;; `debugger' to `edebug-debug'. This is no longer necessary | 38 ;;;; Installation |
60 ;; since Edebug automatically sets it whenever Edebug is active. | 39 ;;; ============= |
61 | 40 |
62 ;;; Minimal Instructions | 41 ;;; Put edebug.el in some directory in your load-path and |
63 ;; ===================== | 42 ;;; byte-compile it. Also read the beginning of edebug-epoch.el, |
64 | 43 ;;; cl-specs.el, and edebug-cl-read.el if they apply to you. |
65 ;; First evaluate a defun with C-xx, then run the function. Step | 44 |
66 ;; through the code with SPC, mark breakpoints with b, go until a | 45 ;;; Unless you are using Emacs 19 which is already set up to use Edebug, |
67 ;; breakpoint is reached with g, and quit execution with q. Use the | 46 ;;; put the following forms in your .emacs file. |
68 ;; "?" command in edebug to describe other commands. See edebug.tex | 47 ;;; (define-key emacs-lisp-mode-map "\C-xx" 'edebug-eval-top-level-form) |
69 ;; or the Emacs 19 Lisp Reference Manual for more instructions. | 48 ;;; (autoload 'edebug-eval-top-level-form "edebug") |
70 | 49 |
71 ;; Send me your enhancements, ideas, bugs, or fixes. | 50 ;;; If you wish to change the default edebug global command prefix, change: |
72 ;; For bugs, you can call edebug-submit-bug-report if you have reporter.el. | 51 ;;; (setq edebug-global-prefix "\C-xX") |
73 ;; There is an edebug mailing list if you want to keep up | 52 |
74 ;; with the latest developments. Requests to: edebug-request@cs.uiuc.edu | 53 ;;; Other options, are described in the manual. |
75 | 54 |
76 ;; Daniel LaLiberte 217-398-4114 | 55 ;;; In previous versions of Edebug, users were directed to set |
77 ;; University of Illinois, Urbana-Champaign | 56 ;;; `debugger' to `edebug-debug'. This is no longer necessary |
78 ;; Department of Computer Science | 57 ;;; since Edebug automatically sets it whenever Edebug is active. |
79 ;; 1304 W Springfield | 58 |
80 ;; Urbana, IL 61801 | 59 ;;;; Minimal Instructions |
81 | 60 ;;; ===================== |
82 ;; uiucdcs!liberte | 61 |
83 ;; liberte@cs.uiuc.edu | 62 ;;; First evaluate a defun with C-xx, then run the function. Step |
84 | 63 ;;; through the code with SPC, mark breakpoints with b, go until a |
85 ;; For the early revision history, see edebug-history. | 64 ;;; breakpoint is reached with g, and quit execution with q. Use the |
86 | 65 ;;; "?" command in edebug to describe other commands. See edebug.tex |
87 ;;; Code: | 66 ;;; or the Emacs 19 Lisp Reference Manual for more instructions. |
67 | |
68 ;;; Send me your enhancements, ideas, bugs, or fixes. | |
69 ;;; For bugs, you can call edebug-submit-bug-report if you have reporter.el. | |
70 ;;; There is an edebug mailing list if you want to keep up | |
71 ;;; with the latest developments. Requests to: edebug-request@cs.uiuc.edu | |
72 | |
73 ;;; Daniel LaLiberte 217-398-4114 | |
74 ;;; University of Illinois, Urbana-Champaign | |
75 ;;; Department of Computer Science | |
76 ;;; 1304 W Springfield | |
77 ;;; Urbana, IL 61801 | |
78 | |
79 ;;; uiucdcs!liberte | |
80 ;;; liberte@cs.uiuc.edu | |
81 | |
82 ;;; =============================== | |
83 ;;; For the early revision history, see edebug-history. | |
88 | 84 |
89 (defconst edebug-version | 85 (defconst edebug-version |
90 (let ((raw-version "$Revision: 1.3 $")) | 86 (let ((raw-version "$Revision: 1.1.1.1 $")) |
91 (substring raw-version (string-match "[0-9.]*" raw-version) | 87 (substring raw-version (string-match "[0-9.]*" raw-version) |
92 (match-end 0)))) | 88 (match-end 0)))) |
93 | 89 |
94 (require 'backquote) | 90 (require 'backquote) |
95 | 91 |
96 ;; Emacs 18 doesn't have defalias. | 92 ;; Emacs 18 doesnt have defalias. |
97 (eval-and-compile | 93 (eval-and-compile |
98 (or (fboundp 'defalias) (fset 'defalias 'fset))) | 94 (or (fboundp 'defalias) (fset 'defalias 'fset))) |
99 | 95 |
100 | 96 |
101 ;;; Bug reporting | 97 ;;;; Bug reporting |
98 ;;; ============== | |
102 | 99 |
103 (defconst edebug-maintainer-address "liberte@cs.uiuc.edu") | 100 (defconst edebug-maintainer-address "liberte@cs.uiuc.edu") |
104 | 101 |
105 (defun edebug-submit-bug-report () | 102 (defun edebug-submit-bug-report () |
106 "Submit, via mail, a bug report on edebug." | 103 "Submit, via mail, a bug report on edebug." |
124 'edebug-print-length | 121 'edebug-print-length |
125 'edebug-print-level | 122 'edebug-print-level |
126 'edebug-print-circle | 123 'edebug-print-circle |
127 )))) | 124 )))) |
128 | 125 |
129 ;;; Options | 126 |
127 ;;;; Options | |
128 ;;; =============================== | |
130 | 129 |
131 (defvar edebug-setup-hook nil | 130 (defvar edebug-setup-hook nil |
132 "*Functions to call before edebug is used. | 131 "*Functions to call before edebug is used. |
133 Each time it is set to a new value, Edebug will call those functions | 132 Each time it is set to a new value, Edebug will call those functions |
134 once and then `edebug-setup-hook' is reset to nil. You could use this | 133 once and then `edebug-setup-hook' is reset to nil. You could use this |
246 | 245 |
247 (defvar edebug-global-break-condition nil | 246 (defvar edebug-global-break-condition nil |
248 "*If non-nil, an expression to test for at every stop point. | 247 "*If non-nil, an expression to test for at every stop point. |
249 If the result is non-nil, then break. Errors are ignored.") | 248 If the result is non-nil, then break. Errors are ignored.") |
250 | 249 |
251 ;;; Form spec utilities. | 250 |
251 ;;;; Form spec utilities. | |
252 ;;; =============================== | |
252 | 253 |
253 ;;;###autoload | 254 ;;;###autoload |
254 (defmacro def-edebug-spec (symbol spec) | 255 (defmacro def-edebug-spec (symbol spec) |
255 "Set the edebug-form-spec property of SYMBOL according to SPEC. | 256 "Set the edebug-form-spec property of SYMBOL according to SPEC. |
256 Both SYMBOL and SPEC are unevaluated. The SPEC can be 0, t, a symbol | 257 Both SYMBOL and SPEC are unevaluated. The SPEC can be 0, t, a symbol |
271 ;; (edebug-trace "indirection: %s" edebug-form-spec) | 272 ;; (edebug-trace "indirection: %s" edebug-form-spec) |
272 (setq edebug-form-spec indirect)) | 273 (setq edebug-form-spec indirect)) |
273 edebug-form-spec | 274 edebug-form-spec |
274 )) | 275 )) |
275 | 276 |
276 ;;; Utilities | 277 |
278 ;;;; Utilities | |
279 ;;; =============================== | |
277 | 280 |
278 ;; Define edebug-gensym - from old cl.el | 281 ;; Define edebug-gensym - from old cl.el |
279 (defvar edebug-gensym-index 0 | 282 (defvar edebug-gensym-index 0 |
280 "Integer used by `edebug-gensym' to produce new names.") | 283 "Integer used by `edebug-gensym' to produce new names.") |
281 | 284 |
320 (point)) | 323 (point)) |
321 (point))))) | 324 (point))))) |
322 | 325 |
323 (defun edebug-window-list () | 326 (defun edebug-window-list () |
324 "Return a list of windows, in order of `next-window'." | 327 "Return a list of windows, in order of `next-window'." |
325 ;; This doesn't work for epoch. | 328 ;; This doesnt work for epoch. |
326 (let* ((first-window (selected-window)) | 329 (let* ((first-window (selected-window)) |
327 (window-list (list first-window)) | 330 (window-list (list first-window)) |
328 (next (next-window first-window))) | 331 (next (next-window first-window))) |
329 (while (not (eq next first-window)) | 332 (while (not (eq next first-window)) |
330 (setq window-list (cons next window-list)) | 333 (setq window-list (cons next window-list)) |
362 | 365 |
363 (defun edebug-functionp (object) | 366 (defun edebug-functionp (object) |
364 "Returns the function named by OBJECT, or nil if it is not a function." | 367 "Returns the function named by OBJECT, or nil if it is not a function." |
365 (setq object (edebug-lookup-function object)) | 368 (setq object (edebug-lookup-function object)) |
366 (if (or (subrp object) | 369 (if (or (subrp object) |
367 (compiled-function-p object) ; XEmacs | 370 (byte-code-function-p object) |
368 (and (listp object) | 371 (and (listp object) |
369 (eq (car object) 'lambda) | 372 (eq (car object) 'lambda) |
370 (listp (car (cdr object))))) | 373 (listp (car (cdr object))))) |
371 object)) | 374 object)) |
372 | 375 |
393 (progn (,@ body)) | 396 (progn (,@ body)) |
394 (save-excursion | 397 (save-excursion |
395 (set-buffer (marker-buffer edebug:s-r-beg)) | 398 (set-buffer (marker-buffer edebug:s-r-beg)) |
396 (narrow-to-region edebug:s-r-beg edebug:s-r-end)))))) | 399 (narrow-to-region edebug:s-r-beg edebug:s-r-end)))))) |
397 | 400 |
398 ;;; Display | 401 ;;;; Display |
402 ;;; ============ | |
399 | 403 |
400 (defconst edebug-trace-buffer "*edebug-trace*" | 404 (defconst edebug-trace-buffer "*edebug-trace*" |
401 "Name of the buffer to put trace info in.") | 405 "Name of the buffer to put trace info in.") |
402 | 406 |
403 (defun edebug-pop-to-buffer (buffer &optional window) | 407 (defun edebug-pop-to-buffer (buffer &optional window) |
415 (select-window window) | 419 (select-window window) |
416 (if (one-window-p) | 420 (if (one-window-p) |
417 (split-window)) | 421 (split-window)) |
418 ;; (message "next window: %s" (next-window)) (sit-for 1) | 422 ;; (message "next window: %s" (next-window)) (sit-for 1) |
419 (if (eq (get-buffer-window edebug-trace-buffer) (next-window)) | 423 (if (eq (get-buffer-window edebug-trace-buffer) (next-window)) |
420 ;; Don't select trace window | 424 ;; Dont select trace window |
421 nil | 425 nil |
422 (select-window (next-window)))) | 426 (select-window (next-window)))) |
423 (set-window-buffer (selected-window) buffer) | 427 (set-window-buffer (selected-window) buffer) |
424 (set-window-hscroll (selected-window) 0);; should this be?? | 428 (set-window-hscroll (selected-window) 0);; should this be?? |
425 ;; Selecting the window does not set the buffer until command loop. | 429 ;; Selecting the window does not set the buffer until command loop. |
487 (defalias 'edebug-get-buffer-window 'get-buffer-window) | 491 (defalias 'edebug-get-buffer-window 'get-buffer-window) |
488 (defalias 'edebug-sit-for 'sit-for) | 492 (defalias 'edebug-sit-for 'sit-for) |
489 (defalias 'edebug-input-pending-p 'input-pending-p) | 493 (defalias 'edebug-input-pending-p 'input-pending-p) |
490 | 494 |
491 | 495 |
492 ;;; Redefine read and eval functions | 496 ;;;; Redefine read and eval functions |
493 ;; read is redefined to maybe instrument forms. | 497 ;;; ================================= |
494 ;; eval-defun is redefined to check edebug-all-forms and edebug-all-defs. | 498 ;;; read is redefined to maybe instrument forms. |
495 | 499 ;;; eval-defun is redefined to check edebug-all-forms and edebug-all-defs. |
496 ;; Use the Lisp version of eval-region. | 500 |
501 ;;; Use the Lisp version of eval-region. | |
497 (require 'eval-reg "eval-reg") | 502 (require 'eval-reg "eval-reg") |
498 | 503 |
499 ;; Save the original read function | 504 ;; Save the original read function |
500 (or (fboundp 'edebug-original-read) | 505 (or (fboundp 'edebug-original-read) |
501 (defalias 'edebug-original-read (symbol-function 'read))) | 506 (defalias 'edebug-original-read (symbol-function 'read))) |
510 call it with a char as argument to push a char back) | 515 call it with a char as argument to push a char back) |
511 a string (takes text from string, starting at the beginning) | 516 a string (takes text from string, starting at the beginning) |
512 t (read text line using minibuffer and use it). | 517 t (read text line using minibuffer and use it). |
513 | 518 |
514 This version, from Edebug, maybe instruments the expression. But the | 519 This version, from Edebug, maybe instruments the expression. But the |
515 STREAM must be the current buffer to do so. Whether it instruments is | 520 STREAM must be the current buffer to do so. Whether it instuments is |
516 also dependent on the values of `edebug-all-defs' and | 521 also dependent on the values of `edebug-all-defs' and |
517 `edebug-all-forms'." | 522 `edebug-all-forms'." |
518 (or stream (setq stream standard-input)) | 523 (or stream (setq stream standard-input)) |
519 (if (eq stream (current-buffer)) | 524 (if (eq stream (current-buffer)) |
520 (edebug-read-and-maybe-wrap-form) | 525 (edebug-read-and-maybe-wrap-form) |
521 (edebug-original-read stream))) | 526 (edebug-original-read stream))) |
522 | 527 |
523 (or (fboundp 'edebug-original-eval-defun) | 528 (or (fboundp 'edebug-original-eval-defun) |
524 (defalias 'edebug-original-eval-defun (symbol-function 'eval-defun))) | 529 (defalias 'edebug-original-eval-defun (symbol-function 'eval-defun))) |
525 | 530 |
526 ;; We should somehow arrange to be able to do this | |
527 ;; without actually replacing the eval-defun command. | |
528 (defun edebug-eval-defun (edebug-it) | 531 (defun edebug-eval-defun (edebug-it) |
529 "Evaluate the top-level form containing point, or after point. | 532 "Evaluate the top-level form containing point, or after point. |
530 | 533 |
531 This version, from Edebug, has the following differences: With a | 534 This version, from Edebug, has the following differences: With a |
532 prefix argument instrument the code for Edebug. If `edebug-all-defs' is | 535 prefix argument instrument the code for Edebug. If `edebug-all-defs' is |
533 non-nil, then the code is instrumented *unless* there is a prefix | 536 non-nil, then the code is instrumented *unless* there is a prefix |
534 argument. If instrumenting, it prints: `Edebug: FUNCTIONNAME'. | 537 argument. If instrumenting, it prints: `Edebug: FUNCTIONNAME'. |
535 Otherwise, it prints in the minibuffer." | 538 Otherwise, it prints in the minibuffer." |
536 (interactive "P") | 539 (interactive "P") |
537 (let* ((edebugging (not (eq (not edebug-it) (not edebug-all-defs)))) | 540 (let ((edebugging (not (eq (not edebug-it) (not edebug-all-defs)))) |
538 (edebug-result) | 541 (edebug-result)) |
539 (form | 542 (setq edebug-result |
540 (let ((edebug-all-forms edebugging) | 543 (eval |
541 (edebug-all-defs (eq edebug-all-defs (not edebug-it)))) | 544 (let ((edebug-all-forms edebugging) |
542 (edebug-read-top-level-form)))) | 545 (edebug-all-defs (eq edebug-all-defs (not edebug-it)))) |
543 (if (and (eq (car form) 'defvar) | 546 (edebug-read-top-level-form)))) |
544 (cdr-safe (cdr-safe form))) | |
545 (setq form (cons 'defconst (cdr form)))) | |
546 (setq edebug-result (eval form)) | |
547 (if (not edebugging) | 547 (if (not edebugging) |
548 (princ edebug-result) | 548 (princ edebug-result) |
549 edebug-result))) | 549 edebug-result))) |
550 | 550 |
551 | 551 |
558 This is like `eval-defun', but the code is always instrumented for Edebug. | 558 This is like `eval-defun', but the code is always instrumented for Edebug. |
559 Print its name in the minibuffer and leave point where it is, | 559 Print its name in the minibuffer and leave point where it is, |
560 or if an error occurs, leave point after it with mark at the original point." | 560 or if an error occurs, leave point after it with mark at the original point." |
561 (interactive) | 561 (interactive) |
562 (eval | 562 (eval |
563 ;; Bind edebug-all-forms only while reading, not while evalling | 563 ;; Bind edebug-all-forms only while reading, not while evaling |
564 ;; but this causes problems while edebugging edebug. | 564 ;; but this causes problems while edebugging edebug. |
565 (let ((edebug-all-forms t) | 565 (let ((edebug-all-forms t) |
566 (edebug-all-defs t)) | 566 (edebug-all-defs t)) |
567 (edebug-read-top-level-form)))) | 567 (edebug-read-top-level-form)))) |
568 | 568 |
609 (elisp-eval-region-uninstall) | 609 (elisp-eval-region-uninstall) |
610 (defalias 'read (symbol-function 'edebug-original-read)) | 610 (defalias 'read (symbol-function 'edebug-original-read)) |
611 (defalias 'eval-defun (symbol-function 'edebug-original-eval-defun))) | 611 (defalias 'eval-defun (symbol-function 'edebug-original-eval-defun))) |
612 | 612 |
613 | 613 |
614 ;;; Edebug internal data | 614 ;;;; Edebug internal data |
615 | 615 ;;; =============================== |
616 ;; The internal data that is needed for edebugging is kept in the | 616 |
617 ;; buffer-local variable `edebug-form-data'. | 617 ;;; The internal data that is needed for edebugging is kept in the |
618 ;;; buffer-local variable `edebug-form-data'. | |
618 | 619 |
619 ;; XEmacs change? | 620 ;; XEmacs change? |
620 (defconst edebug-form-data nil) | 621 (defconst edebug-form-data nil) |
621 (make-variable-buffer-local 'edebug-form-data) | 622 (make-variable-buffer-local 'edebug-form-data) |
622 | 623 |
694 ;; (get (car entry) 'edebug-dependents)) | 695 ;; (get (car entry) 'edebug-dependents)) |
695 ;; (set-marker (nth 1 entry) nil) | 696 ;; (set-marker (nth 1 entry) nil) |
696 ;; (set-marker (nth 2 entry) nil) | 697 ;; (set-marker (nth 2 entry) nil) |
697 (setq edebug-form-data (delq entry edebug-form-data))))) | 698 (setq edebug-form-data (delq entry edebug-form-data))))) |
698 | 699 |
699 ;;; Parser utilities | 700 |
701 ;;;; Parser utilities | |
702 ;;; =============================== | |
703 | |
700 | 704 |
701 (defun edebug-syntax-error (&rest args) | 705 (defun edebug-syntax-error (&rest args) |
702 ;; Signal an invalid-read-syntax with ARGS. | 706 ;; Signal an invalid-read-syntax with ARGS. |
703 (signal 'invalid-read-syntax args)) | 707 (signal 'invalid-read-syntax args)) |
704 | 708 |
712 (aset table i 'space) | 716 (aset table i 'space) |
713 (setq i (1+ i))) | 717 (setq i (1+ i))) |
714 (aset table ?\( 'lparen) | 718 (aset table ?\( 'lparen) |
715 (aset table ?\) 'rparen) | 719 (aset table ?\) 'rparen) |
716 (aset table ?\' 'quote) | 720 (aset table ?\' 'quote) |
717 (aset table ?\` 'backquote) | |
718 (aset table ?\, 'comma) | |
719 (aset table ?\" 'string) | 721 (aset table ?\" 'string) |
720 (aset table ?\? 'char) | 722 (aset table ?\? 'char) |
721 (aset table ?\[ 'lbracket) | 723 (aset table ?\[ 'lbracket) |
722 (aset table ?\] 'rbracket) | 724 (aset table ?\] 'rbracket) |
723 (aset table ?\. 'dot) | 725 (aset table ?\. 'dot) |
724 (aset table ?\# 'hash) | 726 (aset table ?\# 'hash) |
725 ;; We treat numbers as symbols, because of confusion with -, -1, and 1-. | 727 ;; We treat numbers as symbols, because of confusion with -, -1, and 1-. |
726 ;; We don't care about any other chars since they won't be seen. | 728 ;; We dont care about any other chars since they wont be seen. |
727 table)) | 729 table)) |
728 | 730 |
729 (defun edebug-next-token-class () | 731 (defun edebug-next-token-class () |
730 ;; Move to the next token and return its class. We only care about | 732 ;; Move to the next token and return its class. We only care about |
731 ;; lparen, rparen, dot, quote, backquote, comma, string, char, vector, | 733 ;; lparen, rparen, dot, quote, string, char, vector, or symbol. |
732 ;; or symbol. | |
733 (edebug-skip-whitespace) | 734 (edebug-skip-whitespace) |
734 (aref edebug-read-syntax-table (following-char))) | 735 (aref edebug-read-syntax-table (following-char))) |
735 | 736 |
736 | 737 |
737 (defun edebug-skip-whitespace () | 738 (defun edebug-skip-whitespace () |
764 (edebug-original-read (current-buffer)) | 765 (edebug-original-read (current-buffer)) |
765 (if (/= (preceding-char) ?\") | 766 (if (/= (preceding-char) ?\") |
766 (forward-char -1)))) | 767 (forward-char -1)))) |
767 ((eq class 'quote) (forward-char 1) | 768 ((eq class 'quote) (forward-char 1) |
768 (list 'quote (edebug-read-sexp))) | 769 (list 'quote (edebug-read-sexp))) |
769 ((eq class 'backquote) | |
770 (list '\` (edebug-read-sexp))) | |
771 ((eq class 'comma) | |
772 (list '\, (edebug-read-sexp))) | |
773 (t ; anything else, just read it. | 770 (t ; anything else, just read it. |
774 (edebug-original-read (current-buffer)))))) | 771 (edebug-original-read (current-buffer)))))) |
775 | 772 |
776 ;;; Offsets for reader | 773 |
774 ;;;; Offsets for reader | |
775 ;;; ============================== | |
777 | 776 |
778 ;; Define a structure to represent offset positions of expressions. | 777 ;; Define a structure to represent offset positions of expressions. |
779 ;; Each offset structure looks like: (before . after) for constituents, | 778 ;; Each offset structure looks like: (before . after) for constituents, |
780 ;; or for structures that have elements: (before <subexpressions> . after) | 779 ;; or for structures that have elements: (before <subexpressions> . after) |
781 ;; where the <subexpressions> are the offset structures for subexpressions | 780 ;; where the <subexpressions> are the offset structures for subexpressions |
846 (edebug-store-before-offset (, point)) | 845 (edebug-store-before-offset (, point)) |
847 (,@ body)) | 846 (,@ body)) |
848 (edebug-store-after-offset (point))))) | 847 (edebug-store-after-offset (point))))) |
849 | 848 |
850 | 849 |
851 ;;; Reader for Emacs Lisp. | 850 ;;;; Reader for Emacs Lisp. |
852 | 851 ;;; ========================================== |
853 ;; Uses edebug-next-token-class (and edebug-skip-whitespace) above. | 852 ;; Uses edebug-next-token-class (and edebug-skip-whitespace) above. |
854 | 853 |
855 (defconst edebug-read-alist | 854 (defconst edebug-read-alist |
856 '((symbol . edebug-read-symbol) | 855 '((symbol . edebug-read-symbol) |
857 (lparen . edebug-read-list) | 856 (lparen . edebug-read-list) |
858 (string . edebug-read-string) | 857 (string . edebug-read-string) |
859 (quote . edebug-read-quote) | 858 (quote . edebug-read-quote) |
860 (backquote . edebug-read-backquote) | |
861 (comma . edebug-read-comma) | |
862 (lbracket . edebug-read-vector) | 859 (lbracket . edebug-read-vector) |
863 (hash . edebug-read-function) | 860 (hash . edebug-read-function) |
864 )) | 861 )) |
865 | 862 |
866 (defun edebug-read-storing-offsets (stream) | 863 (defun edebug-read-storing-offsets (stream) |
893 (forward-char 1) | 890 (forward-char 1) |
894 (list | 891 (list |
895 (edebug-storing-offsets (point) 'quote) | 892 (edebug-storing-offsets (point) 'quote) |
896 (edebug-read-storing-offsets stream))) | 893 (edebug-read-storing-offsets stream))) |
897 | 894 |
898 (defun edebug-read-backquote (stream) | |
899 ;; Turn `thing into (\` thing) | |
900 (let ((opoint (point))) | |
901 (forward-char 1) | |
902 ;; Generate the same structure of offsets we would have | |
903 ;; if the resulting list appeared verbatim in the input text. | |
904 (edebug-storing-offsets opoint | |
905 (list | |
906 (edebug-storing-offsets opoint '\`) | |
907 (edebug-read-storing-offsets stream))))) | |
908 | |
909 (defvar edebug-read-backquote-new nil | |
910 "Non-nil if reading the inside of a new-style backquote with no parens around it. | |
911 Value of nil means reading the inside of an old-style backquote construct | |
912 which is surrounded by an extra set of parentheses. | |
913 This controls how we read comma constructs.") | |
914 | |
915 (defun edebug-read-comma (stream) | |
916 ;; Turn ,thing into (\, thing). Handle ,@ and ,. also. | |
917 (let ((opoint (point))) | |
918 (forward-char 1) | |
919 (let ((symbol '\,)) | |
920 (cond ((eq (following-char) ?\.) | |
921 (setq symbol '\,\.) | |
922 (forward-char 1)) | |
923 ((eq (following-char) ?\@) | |
924 (setq symbol '\,@) | |
925 (forward-char 1))) | |
926 ;; Generate the same structure of offsets we would have | |
927 ;; if the resulting list appeared verbatim in the input text. | |
928 (if edebug-read-backquote-new | |
929 (list | |
930 (edebug-storing-offsets opoint symbol) | |
931 (edebug-read-storing-offsets stream)) | |
932 (edebug-storing-offsets opoint symbol))))) | |
933 | |
934 (defun edebug-read-function (stream) | 895 (defun edebug-read-function (stream) |
935 ;; Turn #'thing into (function thing) | 896 ;; Turn #'thing into (function thing) |
936 (forward-char 1) | 897 (forward-char 1) |
937 (if (/= ?\' (following-char)) (edebug-syntax-error "Bad char")) | 898 (if (/= ?\' (following-char)) (edebug-syntax-error "Bad char")) |
938 (forward-char 1) | 899 (forward-char 1) |
944 (defun edebug-read-list (stream) | 905 (defun edebug-read-list (stream) |
945 (forward-char 1) ; skip \( | 906 (forward-char 1) ; skip \( |
946 (prog1 | 907 (prog1 |
947 (let ((elements)) | 908 (let ((elements)) |
948 (while (not (memq (edebug-next-token-class) '(rparen dot))) | 909 (while (not (memq (edebug-next-token-class) '(rparen dot))) |
949 (if (eq (edebug-next-token-class) 'backquote) | 910 (setq elements (cons (edebug-read-storing-offsets stream) elements))) |
950 (let ((edebug-read-backquote-new (not (null elements))) | |
951 (opoint (point))) | |
952 (if edebug-read-backquote-new | |
953 (setq elements (cons (edebug-read-backquote stream) elements)) | |
954 (forward-char 1) ; Skip backquote. | |
955 ;; Call edebug-storing-offsets here so that we | |
956 ;; produce the same offsets we would have had | |
957 ;; if the backquote were an ordinary symbol. | |
958 (setq elements (cons (edebug-storing-offsets opoint '\`) | |
959 elements)))) | |
960 (setq elements (cons (edebug-read-storing-offsets stream) elements)))) | |
961 (setq elements (nreverse elements)) | 911 (setq elements (nreverse elements)) |
962 (if (eq 'dot (edebug-next-token-class)) | 912 (if (eq 'dot (edebug-next-token-class)) |
963 (let (dotted-form) | 913 (let (dotted-form) |
964 (forward-char 1) ; skip \. | 914 (forward-char 1) ; skip \. |
965 (setq dotted-form (edebug-read-storing-offsets stream)) | 915 (setq dotted-form (edebug-read-storing-offsets stream)) |
980 (setq elements (cons (edebug-read-storing-offsets stream) elements))) | 930 (setq elements (cons (edebug-read-storing-offsets stream) elements))) |
981 (apply 'vector (nreverse elements))) | 931 (apply 'vector (nreverse elements))) |
982 (forward-char 1) ; skip \] | 932 (forward-char 1) ; skip \] |
983 )) | 933 )) |
984 | 934 |
985 ;;; Cursors for traversal of list and vector elements with offsets. | 935 |
936 | |
937 ;;;; Cursors for traversal of list and vector elements with offsets. | |
938 ;;;==================================================================== | |
986 | 939 |
987 (defvar edebug-dotted-spec nil) | 940 (defvar edebug-dotted-spec nil) |
988 | 941 |
989 (defun edebug-new-cursor (expressions offsets) | 942 (defun edebug-new-cursor (expressions offsets) |
990 ;; Return a new cursor for EXPRESSIONS with OFFSETS. | 943 ;; Return a new cursor for EXPRESSIONS with OFFSETS. |
1057 (let ((offset (edebug-top-offset cursor))) | 1010 (let ((offset (edebug-top-offset cursor))) |
1058 (while (consp offset) | 1011 (while (consp offset) |
1059 (setq offset (cdr offset))) | 1012 (setq offset (cdr offset))) |
1060 offset)) | 1013 offset)) |
1061 | 1014 |
1062 ;;; The Parser | 1015 ;;;; The Parser |
1063 | 1016 ;;; =============================== |
1064 ;; The top level function for parsing forms is | 1017 |
1065 ;; edebug-read-and-maybe-wrap-form; it calls all the rest. It checks the | 1018 ;;; The top level function for parsing forms is |
1066 ;; syntax a bit and leaves point at any error it finds, but otherwise | 1019 ;;; edebug-read-and-maybe-wrap-form; it calls all the rest. It checks the |
1067 ;; should appear to work like eval-defun. | 1020 ;;; syntax a bit and leaves point at any error it finds, but otherwise |
1068 | 1021 ;;; should appear to work like eval-defun. |
1069 ;; The basic plan is to surround each expression with a call to | 1022 |
1070 ;; the edebug debugger together with indexes into a table of positions of | 1023 ;;; The basic plan is to surround each expression with a call to |
1071 ;; all expressions. Thus an expression "exp" becomes: | 1024 ;;; the edebug debugger together with indexes into a table of positions of |
1072 | 1025 ;;; all expressions. Thus an expression "exp" becomes: |
1073 ;; (edebug-after (edebug-before 1) 2 exp) | 1026 |
1074 | 1027 ;;; (edebug-after (edebug-before 1) 2 exp) |
1075 ;; When this is evaluated, first point is moved to the beginning of | 1028 |
1076 ;; exp at offset 1 of the current function. The expression is | 1029 ;;; When this is evaluated, first point is moved to the beginning of |
1077 ;; evaluated, which may cause more edebug calls, and then point is | 1030 ;;; exp at offset 1 of the current function. The expression is |
1078 ;; moved to offset 2 after the end of exp. | 1031 ;;; evaluated, which may cause more edebug calls, and then point is |
1079 | 1032 ;;; moved to offset 2 after the end of exp. |
1080 ;; The highest level expressions of the function are wrapped in a call to | 1033 |
1081 ;; edebug-enter, which supplies the function name and the actual | 1034 ;;; The highest level expressions of the function are wrapped in a call to |
1082 ;; arguments to the function. See functions edebug-enter, edebug-before, | 1035 ;;; edebug-enter, which supplies the function name and the actual |
1083 ;; and edebug-after for more details. | 1036 ;;; arguments to the function. See functions edebug-enter, edebug-before, |
1037 ;;; and edebug-after for more details. | |
1084 | 1038 |
1085 ;; Dynamically bound vars, left unbound, but globally declared. | 1039 ;; Dynamically bound vars, left unbound, but globally declared. |
1086 ;; This is to quiet the byte compiler. | 1040 ;; This is to quiet the byte compiler. |
1087 | 1041 |
1088 ;; Window data of the highest definition being wrapped. | 1042 ;; Window data of the highest definition being wrapped. |
1109 (setq edebug-setup-hook nil) | 1063 (setq edebug-setup-hook nil) |
1110 | 1064 |
1111 (let (result | 1065 (let (result |
1112 edebug-top-window-data | 1066 edebug-top-window-data |
1113 edebug-def-name;; make sure it is locally nil | 1067 edebug-def-name;; make sure it is locally nil |
1114 ;; I don't like these here!! | 1068 ;; I dont like these here!! |
1115 edebug-&optional | 1069 edebug-&optional |
1116 edebug-&rest | 1070 edebug-&rest |
1117 edebug-gate | 1071 edebug-gate |
1118 edebug-best-error | 1072 edebug-best-error |
1119 edebug-error-point | 1073 edebug-error-point |
1133 (defun edebug-read-and-maybe-wrap-form1 () | 1087 (defun edebug-read-and-maybe-wrap-form1 () |
1134 (let (spec | 1088 (let (spec |
1135 def-kind | 1089 def-kind |
1136 defining-form-p | 1090 defining-form-p |
1137 def-name | 1091 def-name |
1138 ;; These offset things don't belong here, but to support recursive | 1092 ;; These offset things dont belong here, but to support recursive |
1139 ;; calls to edebug-read, they need to be here. | 1093 ;; calls to edebug-read, they need to be here. |
1140 edebug-offsets | 1094 edebug-offsets |
1141 edebug-offsets-stack | 1095 edebug-offsets-stack |
1142 edebug-current-offset ; reset to nil | 1096 edebug-current-offset ; reset to nil |
1143 ) | 1097 ) |
1227 (or edebug-def-name edebug-old-def-name (edebug-gensym "edebug-anon"))) | 1181 (or edebug-def-name edebug-old-def-name (edebug-gensym "edebug-anon"))) |
1228 (` (edebug-enter | 1182 (` (edebug-enter |
1229 (quote (, edebug-def-name)) | 1183 (quote (, edebug-def-name)) |
1230 (, (if edebug-inside-func | 1184 (, (if edebug-inside-func |
1231 (` (list (,@ | 1185 (` (list (,@ |
1232 ;; Doesn't work with more than one def-body!! | 1186 ;; Doesnt work with more than one def-body!! |
1233 ;; But the list will just be reversed. | 1187 ;; But the list will just be reversed. |
1234 (nreverse edebug-def-args)))) | 1188 (nreverse edebug-def-args)))) |
1235 'nil)) | 1189 'nil)) |
1236 (function (lambda () (,@ forms))) | 1190 (function (lambda () (,@ forms))) |
1237 ))) | 1191 ))) |
1256 ;; Return the edebug form for the current function at offset BEFORE-INDEX | 1210 ;; Return the edebug form for the current function at offset BEFORE-INDEX |
1257 ;; given FORM. Looks like: | 1211 ;; given FORM. Looks like: |
1258 ;; (edebug-after (edebug-before BEFORE-INDEX) AFTER-INDEX FORM) | 1212 ;; (edebug-after (edebug-before BEFORE-INDEX) AFTER-INDEX FORM) |
1259 ;; Also increment the offset index for subsequent use. | 1213 ;; Also increment the offset index for subsequent use. |
1260 ;; if (not edebug-stop-before-symbols) and form is a symbol, | 1214 ;; if (not edebug-stop-before-symbols) and form is a symbol, |
1261 ;; then don't call edebug-before. | 1215 ;; then dont call edebug-before. |
1262 (list 'edebug-after | 1216 (list 'edebug-after |
1263 (list 'edebug-before before-index) | 1217 (list 'edebug-before before-index) |
1264 after-index form)) | 1218 after-index form)) |
1265 | 1219 |
1266 (defun edebug-make-after-form (form after-index) | 1220 (defun edebug-make-after-form (form after-index) |
1445 (edebug-inc-offset (edebug-cursor-offsets new-cursor)))) | 1399 (edebug-inc-offset (edebug-cursor-offsets new-cursor)))) |
1446 ))) | 1400 ))) |
1447 | 1401 |
1448 ((symbolp form) | 1402 ((symbolp form) |
1449 (cond | 1403 (cond |
1450 ;; Check for constant symbols that don't get wrapped. | 1404 ;; Check for constant symbols that dont get wrapped. |
1451 ((or (memq form '(t nil)) | 1405 ((or (memq form '(t nil)) |
1452 (and (fboundp 'edebug-keywordp) (edebug-keywordp form))) | 1406 (and (fboundp 'edebug-keywordp) (edebug-keywordp form))) |
1453 form) | 1407 form) |
1454 | 1408 |
1455 ;; This option may go away. | 1409 ;; This option may go away. |
1534 | 1488 |
1535 (t (edebug-syntax-error | 1489 (t (edebug-syntax-error |
1536 "Head of list form must be a symbol or lambda expression."))) | 1490 "Head of list form must be a symbol or lambda expression."))) |
1537 )) | 1491 )) |
1538 | 1492 |
1539 ;;; Matching of specs. | 1493 |
1494 ;;;; Matching of specs. | |
1495 ;;; =================== | |
1540 | 1496 |
1541 (defvar edebug-after-dotted-spec nil) | 1497 (defvar edebug-after-dotted-spec nil) |
1542 | 1498 |
1543 (defvar edebug-matching-depth 0) ;; initial value | 1499 (defvar edebug-matching-depth 0) ;; initial value |
1544 (defconst edebug-max-depth 150) ;; maximum number of matching recursions. | 1500 (defconst edebug-max-depth 150) ;; maximum number of matching recursions. |
1545 | 1501 |
1546 | 1502 |
1547 ;;; Failure to match | 1503 ;;;; Failure to match |
1548 | 1504 ;;; ================== |
1549 ;; This throws to no-match, if there are higher alternatives. | 1505 ;; This throws to no-match, if there are higher alternatives. |
1550 ;; Otherwise it signals an error. The place of the error is found | 1506 ;; Otherwise it signals an error. The place of the error is found |
1551 ;; with the two before- and after-offset functions. | 1507 ;; with the two before- and after-offset functions. |
1552 | 1508 |
1553 (defun edebug-no-match (cursor &rest edebug-args) | 1509 (defun edebug-no-match (cursor &rest edebug-args) |
1631 (edebug-match-one-spec cursor spec))) | 1587 (edebug-match-one-spec cursor spec))) |
1632 (funcall remainder-handler cursor rest remainder-handler))))))) | 1588 (funcall remainder-handler cursor rest remainder-handler))))))) |
1633 | 1589 |
1634 | 1590 |
1635 ;; Define specs for all the symbol specs with functions used to process them. | 1591 ;; Define specs for all the symbol specs with functions used to process them. |
1636 ;; Perhaps we shouldn't be doing this with edebug-form-specs since the | 1592 ;; Perhaps we shouldnt be doing this with edebug-form-specs since the |
1637 ;; user may want to define macros or functions with the same names. | 1593 ;; user may want to define macros or functions with the same names. |
1638 ;; We could use an internal obarray for these primitive specs. | 1594 ;; We could use an internal obarray for these primitive specs. |
1639 | 1595 |
1640 (mapcar | 1596 (mapcar |
1641 (function (lambda (pair) | 1597 (function (lambda (pair) |
1749 (catch 'no-match | 1705 (catch 'no-match |
1750 (throw 'matched | 1706 (throw 'matched |
1751 (let (edebug-gate ;; only while matching each spec | 1707 (let (edebug-gate ;; only while matching each spec |
1752 edebug-best-error | 1708 edebug-best-error |
1753 edebug-error-point) | 1709 edebug-error-point) |
1754 ;; Doesn't support e.g. &or symbolp &rest form | 1710 ;; Doesnt support e.g. &or symbolp &rest form |
1755 (edebug-match-one-spec cursor (car specs))))) | 1711 (edebug-match-one-spec cursor (car specs))))) |
1756 ;; Match failed, so reset and try again. | 1712 ;; Match failed, so reset and try again. |
1757 (setq specs (cdr specs)) | 1713 (setq specs (cdr specs)) |
1758 ;; Reset the cursor for the next match. | 1714 ;; Reset the cursor for the next match. |
1759 (edebug-set-cursor cursor this-form this-offset)) | 1715 (edebug-set-cursor cursor this-form this-offset)) |
1778 (def-edebug-spec &key edebug-match-&key) | 1734 (def-edebug-spec &key edebug-match-&key) |
1779 | 1735 |
1780 (defun edebug-match-&key (cursor specs) | 1736 (defun edebug-match-&key (cursor specs) |
1781 ;; Following specs must look like (<name> <spec>) ... | 1737 ;; Following specs must look like (<name> <spec>) ... |
1782 ;; where <name> is the name of a keyword, and spec is its spec. | 1738 ;; where <name> is the name of a keyword, and spec is its spec. |
1783 ;; This really doesn't save much over the expanded form and takes time. | 1739 ;; This really doesnt save much over the expanded form and takes time. |
1784 (edebug-match-&rest | 1740 (edebug-match-&rest |
1785 cursor | 1741 cursor |
1786 (cons '&or | 1742 (cons '&or |
1787 (mapcar (function (lambda (pair) | 1743 (mapcar (function (lambda (pair) |
1788 (vector (format ":%s" (car pair)) | 1744 (vector (format ":%s" (car pair)) |
1882 (defun edebug-match-function (cursor) | 1838 (defun edebug-match-function (cursor) |
1883 (error "Use function-form instead of function in edebug spec")) | 1839 (error "Use function-form instead of function in edebug spec")) |
1884 | 1840 |
1885 (defun edebug-match-&define (cursor specs) | 1841 (defun edebug-match-&define (cursor specs) |
1886 ;; Match a defining form. | 1842 ;; Match a defining form. |
1887 ;; Normally, &define is interpreted specially other places. | 1843 ;; Normally, &define is interpretted specially other places. |
1888 ;; This should only be called inside of a spec list to match the remainder | 1844 ;; This should only be called inside of a spec list to match the remainder |
1889 ;; of the current list. e.g. ("lambda" &define args def-body) | 1845 ;; of the current list. e.g. ("lambda" &define args def-body) |
1890 (edebug-make-form-wrapper | 1846 (edebug-make-form-wrapper |
1891 cursor | 1847 cursor |
1892 (edebug-before-offset cursor) | 1848 (edebug-before-offset cursor) |
2004 edebug-spec-p ;; Including all the special ones e.g. form. | 1960 edebug-spec-p ;; Including all the special ones e.g. form. |
2005 symbolp;; a predicate | 1961 symbolp;; a predicate |
2006 )) | 1962 )) |
2007 | 1963 |
2008 | 1964 |
2009 ;;;* Emacs special forms and some functions. | 1965 ;;;;* Emacs special forms and some functions. |
2010 | 1966 |
2011 ;; quote expects only one argument, although it allows any number. | 1967 ;; quote expects only one argument, although it allows any number. |
2012 (def-edebug-spec quote sexp) | 1968 (def-edebug-spec quote sexp) |
2013 | 1969 |
2014 ;; The standard defining forms. | 1970 ;; The standard defining forms. |
2021 [&optional ("interactive" interactive)] | 1977 [&optional ("interactive" interactive)] |
2022 def-body)) | 1978 def-body)) |
2023 (def-edebug-spec defmacro | 1979 (def-edebug-spec defmacro |
2024 (&define name lambda-list def-body)) | 1980 (&define name lambda-list def-body)) |
2025 | 1981 |
2026 (def-edebug-spec arglist lambda-list) ;; deprecated - use lambda-list. | 1982 (def-edebug-spec arglist lambda-list) ;; denegrated - use lambda-list. |
2027 | 1983 |
2028 (def-edebug-spec lambda-list | 1984 (def-edebug-spec lambda-list |
2029 (([&rest arg] | 1985 (([&rest arg] |
2030 [&optional ["&optional" arg &rest arg]] | 1986 [&optional ["&optional" arg &rest arg]] |
2031 &optional ["&rest" arg] | 1987 &optional ["&rest" arg] |
2122 (def-edebug-spec eval-and-compile t) | 2078 (def-edebug-spec eval-and-compile t) |
2123 | 2079 |
2124 ;; Anything else? | 2080 ;; Anything else? |
2125 | 2081 |
2126 | 2082 |
2083 ;;==================== | |
2127 ;; Some miscellaneous specs for macros in public packages. | 2084 ;; Some miscellaneous specs for macros in public packages. |
2128 ;; Send me yours. | 2085 ;; Send me yours. |
2129 | 2086 |
2130 ;; advice.el by Hans Chalupsky (hans@cs.buffalo.edu) | 2087 ;; advice.el by Hans Chalupsky (hans@cs.buffalo.edu) |
2131 | 2088 |
2139 ) | 2096 ) |
2140 [&optional stringp] | 2097 [&optional stringp] |
2141 [&optional ("interactive" interactive)] | 2098 [&optional ("interactive" interactive)] |
2142 def-body)) | 2099 def-body)) |
2143 | 2100 |
2144 ;;; The debugger itself | 2101 |
2102 ;;;; The debugger itself | |
2103 ;;; =============================== | |
2145 | 2104 |
2146 (defvar edebug-active nil) ;; Non-nil when edebug is active | 2105 (defvar edebug-active nil) ;; Non-nil when edebug is active |
2147 | 2106 |
2148 ;;; add minor-mode-alist entry | 2107 ;;; add minor-mode-alist entry |
2149 (or (assq 'edebug-active minor-mode-alist) | 2108 (or (assq 'edebug-active minor-mode-alist) |
2206 (defvar post-command-idle-hook nil) | 2165 (defvar post-command-idle-hook nil) |
2207 | 2166 |
2208 (defvar cl-lexical-debug) ;; Defined in cl.el | 2167 (defvar cl-lexical-debug) ;; Defined in cl.el |
2209 | 2168 |
2210 ;;; Handling signals | 2169 ;;; Handling signals |
2170 ;;; ================= | |
2211 | 2171 |
2212 (if (not (fboundp 'edebug-original-signal)) | 2172 (if (not (fboundp 'edebug-original-signal)) |
2213 (defalias 'edebug-original-signal (symbol-function 'signal))) | 2173 (defalias 'edebug-original-signal (symbol-function 'signal))) |
2214 ;; We should use advise for this!! | 2174 ;; We should use advise for this!! |
2215 | 2175 |
2234 ;; i.e. the signal is not continuable, yet. | 2194 ;; i.e. the signal is not continuable, yet. |
2235 (edebug-original-signal edebug-signal-name edebug-signal-data)) | 2195 (edebug-original-signal edebug-signal-name edebug-signal-data)) |
2236 | 2196 |
2237 | 2197 |
2238 ;;; Entering Edebug | 2198 ;;; Entering Edebug |
2199 ;;; ================== | |
2239 | 2200 |
2240 (defun edebug-enter (edebug-function edebug-args edebug-body) | 2201 (defun edebug-enter (edebug-function edebug-args edebug-body) |
2241 ;; Entering FUNC. The arguments are ARGS, and the body is BODY. | 2202 ;; Entering FUNC. The arguments are ARGS, and the body is BODY. |
2242 ;; Setup edebug variables and evaluate BODY. This function is called | 2203 ;; Setup edebug variables and evaluate BODY. This function is called |
2243 ;; when a function evaluated with edebug-eval-top-level-form is entered. | 2204 ;; when a function evaluated with edebug-eval-top-level-form is entered. |
2264 | 2225 |
2265 ;; Lexical bindings must be uncompiled for this to work. | 2226 ;; Lexical bindings must be uncompiled for this to work. |
2266 (cl-lexical-debug t) | 2227 (cl-lexical-debug t) |
2267 | 2228 |
2268 ;; Save the outside value of executing macro. (here??) | 2229 ;; Save the outside value of executing macro. (here??) |
2269 (edebug-outside-executing-macro executing-kbd-macro) | 2230 (edebug-outside-executing-macro executing-macro) |
2270 (edebug-outside-pre-command-hook pre-command-hook) | 2231 (edebug-outside-pre-command-hook pre-command-hook) |
2271 (edebug-outside-post-command-hook post-command-hook) | 2232 (edebug-outside-post-command-hook post-command-hook) |
2272 (edebug-outside-post-command-idle-hook post-command-idle-hook)) | 2233 (edebug-outside-post-command-idle-hook post-command-idle-hook)) |
2273 (unwind-protect | 2234 (unwind-protect |
2274 (let (;; Don't keep reading from an executing kbd macro | 2235 (let (;; Don't keep reading from an executing kbd macro |
2275 ;; within edebug unless edebug-continue-kbd-macro is | 2236 ;; within edebug unless edebug-continue-kbd-macro is |
2276 ;; non-nil. Again, local binding may not be best. | 2237 ;; non-nil. Again, local binding may not be best. |
2277 (executing-kbd-macro | 2238 (executing-macro |
2278 (if edebug-continue-kbd-macro executing-kbd-macro)) | 2239 (if edebug-continue-kbd-macro executing-macro)) |
2279 | 2240 |
2280 ;; Disable command hooks. This is essential when | 2241 ;; Disable command hooks. This is essential when |
2281 ;; a hook function is instrumented - to avoid infinite loop. | 2242 ;; a hook function is instrumented - to avoid infinite loop. |
2282 ;; This may be more than we need, however. | 2243 ;; This may be more than we need, however. |
2283 (pre-command-hook nil) | 2244 (pre-command-hook nil) |
2291 (fset 'signal 'edebug-signal) | 2252 (fset 'signal 'edebug-signal) |
2292 (unwind-protect | 2253 (unwind-protect |
2293 (edebug-enter edebug-function edebug-args edebug-body) | 2254 (edebug-enter edebug-function edebug-args edebug-body) |
2294 (fset 'signal (symbol-function 'edebug-original-signal)))) | 2255 (fset 'signal (symbol-function 'edebug-original-signal)))) |
2295 ;; Reset global variables in case outside value was changed. | 2256 ;; Reset global variables in case outside value was changed. |
2296 (setq executing-kbd-macro edebug-outside-executing-macro | 2257 (setq executing-macro edebug-outside-executing-macro |
2297 pre-command-hook edebug-outside-pre-command-hook | 2258 pre-command-hook edebug-outside-pre-command-hook |
2298 post-command-hook edebug-outside-post-command-hook | 2259 post-command-hook edebug-outside-post-command-hook |
2299 post-command-idle-hook edebug-outside-post-command-idle-hook | 2260 post-command-idle-hook edebug-outside-post-command-idle-hook |
2300 ))) | 2261 ))) |
2301 | 2262 |
2550 | 2511 |
2551 (if edebug-save-displayed-buffer-points | 2512 (if edebug-save-displayed-buffer-points |
2552 (setq edebug-buffer-points (edebug-get-displayed-buffer-points))) | 2513 (setq edebug-buffer-points (edebug-get-displayed-buffer-points))) |
2553 | 2514 |
2554 ;; First move the edebug buffer point to edebug-point | 2515 ;; First move the edebug buffer point to edebug-point |
2555 ;; so that window start doesn't get changed when we display it. | 2516 ;; so that window start doesnt get changed when we display it. |
2556 ;; I don't know if this is going to help. | 2517 ;; I dont know if this is going to help. |
2557 ;;(set-buffer edebug-buffer) | 2518 ;;(set-buffer edebug-buffer) |
2558 ;;(goto-char edebug-point) | 2519 ;;(goto-char edebug-point) |
2559 | 2520 |
2560 ;; If edebug-buffer is not currently displayed, | 2521 ;; If edebug-buffer is not currently displayed, |
2561 ;; first find a window for it. | 2522 ;; first find a window for it. |
2646 (if (or edebug-stop | 2607 (if (or edebug-stop |
2647 (memq edebug-execution-mode '(step next)) | 2608 (memq edebug-execution-mode '(step next)) |
2648 (eq edebug-arg-mode 'error)) | 2609 (eq edebug-arg-mode 'error)) |
2649 (progn | 2610 (progn |
2650 ;; (setq edebug-execution-mode 'step) | 2611 ;; (setq edebug-execution-mode 'step) |
2651 ;; (edebug-overlay-arrow) ; this doesn't always show up. | 2612 ;; (edebug-overlay-arrow) ; this doesnt always show up. |
2652 (edebug-recursive-edit))) ; <---------- Recursive edit | 2613 (edebug-recursive-edit))) ; <---------- Recursive edit |
2653 | 2614 |
2654 ;; Reset the edebug-window-data to whatever it is now. | 2615 ;; Reset the edebug-window-data to whatever it is now. |
2655 (let ((window (if (eq (window-buffer) edebug-buffer) | 2616 (let ((window (if (eq (window-buffer) edebug-buffer) |
2656 (selected-window) | 2617 (selected-window) |
2692 (progn | 2653 (progn |
2693 (set-window-start window (cdr edebug-window-data) | 2654 (set-window-start window (cdr edebug-window-data) |
2694 'no-force) | 2655 'no-force) |
2695 ;; Unrestore edebug-buffer's window-point. | 2656 ;; Unrestore edebug-buffer's window-point. |
2696 ;; Needed in addition to setting the buffer point | 2657 ;; Needed in addition to setting the buffer point |
2697 ;; - otherwise quitting doesn't leave point as is. | 2658 ;; - otherwise quitting doesnt leave point as is. |
2698 ;; But this causes point to not be restored at times. | 2659 ;; But this causes point to not be restored at times. |
2699 ;; Also, it may not be a visible window. | 2660 ;; Also, it may not be a visible window. |
2700 ;; (set-window-point window edebug-point) | 2661 ;; (set-window-point window edebug-point) |
2701 ))) | 2662 ))) |
2702 | 2663 |
2712 | 2673 |
2713 ;; Restore current buffer always, in case application needs it. | 2674 ;; Restore current buffer always, in case application needs it. |
2714 (set-buffer edebug-outside-buffer) | 2675 (set-buffer edebug-outside-buffer) |
2715 ;; Restore point, and mark. | 2676 ;; Restore point, and mark. |
2716 ;; Needed even if restoring windows because | 2677 ;; Needed even if restoring windows because |
2717 ;; that doesn't restore point and mark in the current buffer. | 2678 ;; that doesnt restore point and mark in the current buffer. |
2718 ;; But don't restore point if edebug-buffer is current buffer. | 2679 ;; But dont restore point if edebug-buffer is current buffer. |
2719 (if (not (eq edebug-buffer edebug-outside-buffer)) | 2680 (if (not (eq edebug-buffer edebug-outside-buffer)) |
2720 (goto-char edebug-outside-point)) | 2681 (goto-char edebug-outside-point)) |
2721 (if (marker-buffer (edebug-mark-marker)) | 2682 (if (marker-buffer (edebug-mark-marker)) |
2722 ;; Does zmacs-regions need to be nil while doing set-marker? | 2683 ;; Does zmacs-regions need to be nil while doing set-marker? |
2723 (set-marker (edebug-mark-marker) edebug-outside-mark)) | 2684 (set-marker (edebug-mark-marker) edebug-outside-mark)) |
2937 )) | 2898 )) |
2938 )) | 2899 )) |
2939 | 2900 |
2940 | 2901 |
2941 ;;; Display related functions | 2902 ;;; Display related functions |
2903 ;;; =============================== | |
2942 | 2904 |
2943 (defun edebug-adjust-window (old-start) | 2905 (defun edebug-adjust-window (old-start) |
2944 ;; If pos is not visible, adjust current window to fit following context. | 2906 ;; If pos is not visible, adjust current window to fit following context. |
2945 ;;; (message "window: %s old-start: %s window-start: %s pos: %s" | 2907 ;;; (message "window: %s old-start: %s window-start: %s pos: %s" |
2946 ;;; (selected-window) old-start (window-start) (point)) (sit-for 5) | 2908 ;;; (selected-window) old-start (window-start) (point)) (sit-for 5) |
3109 (delq buffer edebug-display-buffer-list) | 3071 (delq buffer edebug-display-buffer-list) |
3110 (cons buffer edebug-display-buffer-list))) | 3072 (cons buffer edebug-display-buffer-list))) |
3111 (message "Displaying %s %s" buffer | 3073 (message "Displaying %s %s" buffer |
3112 (if already-displaying "off" "on")))) | 3074 (if already-displaying "off" "on")))) |
3113 | 3075 |
3076 | |
3114 ;;; Breakpoint related functions | 3077 ;;; Breakpoint related functions |
3078 ;;; =============================== | |
3115 | 3079 |
3116 (defun edebug-find-stop-point () | 3080 (defun edebug-find-stop-point () |
3117 ;; Return (function . index) of the nearest edebug stop point. | 3081 ;; Return (function . index) of the nearest edebug stop point. |
3118 (let* ((edebug-def-name (edebug-form-data-symbol)) | 3082 (let* ((edebug-def-name (edebug-form-data-symbol)) |
3119 (edebug-data | 3083 (edebug-data |
3173 ;; goto the first breakpoint | 3137 ;; goto the first breakpoint |
3174 (car edebug-breakpoints))) | 3138 (car edebug-breakpoints))) |
3175 (goto-char (+ edebug-def-mark | 3139 (goto-char (+ edebug-def-mark |
3176 (aref offset-vector (car breakpoint)))) | 3140 (aref offset-vector (car breakpoint)))) |
3177 | 3141 |
3178 (message "%s" | 3142 (message (concat (if (nth 2 breakpoint) |
3179 (concat (if (nth 2 breakpoint) | |
3180 "Temporary " "") | 3143 "Temporary " "") |
3181 (if (car (cdr breakpoint)) | 3144 (if (car (cdr breakpoint)) |
3182 (format "Condition: %s" | 3145 (format "Condition: %s" |
3183 (edebug-safe-prin1-to-string | 3146 (edebug-safe-prin1-to-string |
3184 (car (cdr breakpoint)))) | 3147 (car (cdr breakpoint)))) |
3269 (format "%s" edebug-global-break-condition)))) | 3232 (format "%s" edebug-global-break-condition)))) |
3270 (setq edebug-global-break-condition expression)) | 3233 (setq edebug-global-break-condition expression)) |
3271 | 3234 |
3272 | 3235 |
3273 ;;; Mode switching functions | 3236 ;;; Mode switching functions |
3237 ;;; =============================== | |
3274 | 3238 |
3275 (defun edebug-set-mode (mode shortmsg msg) | 3239 (defun edebug-set-mode (mode shortmsg msg) |
3276 ;; Set the edebug mode to MODE. | 3240 ;; Set the edebug mode to MODE. |
3277 ;; Display SHORTMSG, or MSG if not within edebug. | 3241 ;; Display SHORTMSG, or MSG if not within edebug. |
3278 (if (eq (1+ edebug-recursion-depth) (recursion-depth)) | 3242 (if (eq (1+ edebug-recursion-depth) (recursion-depth)) |
3493 ;; "Go until the current function exits." | 3457 ;; "Go until the current function exits." |
3494 ;; (interactive) | 3458 ;; (interactive) |
3495 ;; (edebug-set-mode 'exiting "Exit...")) | 3459 ;; (edebug-set-mode 'exiting "Exit...")) |
3496 | 3460 |
3497 | 3461 |
3462 ;;; ----------------------------------------------------------------- | |
3498 ;;; The following initial mode setting definitions are not used yet. | 3463 ;;; The following initial mode setting definitions are not used yet. |
3499 | 3464 |
3500 '(defconst edebug-initial-mode-alist | 3465 '(defconst edebug-initial-mode-alist |
3501 '((edebug-Continue-fast . Continue-fast) | 3466 '((edebug-Continue-fast . Continue-fast) |
3502 (edebug-Trace-fast . Trace-fast) | 3467 (edebug-Trace-fast . Trace-fast) |
3538 (message "Initial mode for %s is now: %s" | 3503 (message "Initial mode for %s is now: %s" |
3539 this-function mode)) | 3504 this-function mode)) |
3540 (error "Key must map to one of the mode changing commands") | 3505 (error "Key must map to one of the mode changing commands") |
3541 ))) | 3506 ))) |
3542 | 3507 |
3508 | |
3543 ;;; Evaluation of expressions | 3509 ;;; Evaluation of expressions |
3510 ;;; =============================== | |
3544 | 3511 |
3545 (def-edebug-spec edebug-outside-excursion t) | 3512 (def-edebug-spec edebug-outside-excursion t) |
3546 | 3513 |
3547 (defmacro edebug-outside-excursion (&rest body) | 3514 (defmacro edebug-outside-excursion (&rest body) |
3548 "Evaluate an expression list in the outside context. | 3515 "Evaluate an expression list in the outside context. |
3575 (last-nonmenu-event edebug-outside-last-nonmenu-event) | 3542 (last-nonmenu-event edebug-outside-last-nonmenu-event) |
3576 (track-mouse edebug-outside-track-mouse) | 3543 (track-mouse edebug-outside-track-mouse) |
3577 (standard-output edebug-outside-standard-output) | 3544 (standard-output edebug-outside-standard-output) |
3578 (standard-input edebug-outside-standard-input) | 3545 (standard-input edebug-outside-standard-input) |
3579 | 3546 |
3580 (executing-kbd-macro edebug-outside-executing-macro) | 3547 (executing-macro edebug-outside-executing-macro) |
3581 (defining-kbd-macro edebug-outside-defining-kbd-macro) | 3548 (defining-kbd-macro edebug-outside-defining-kbd-macro) |
3582 (pre-command-hook edebug-outside-pre-command-hook) | 3549 (pre-command-hook edebug-outside-pre-command-hook) |
3583 (post-command-hook edebug-outside-post-command-hook) | 3550 (post-command-hook edebug-outside-post-command-hook) |
3584 (post-command-idle-hook edebug-outside-post-command-idle-hook) | 3551 (post-command-idle-hook edebug-outside-post-command-idle-hook) |
3585 | 3552 |
3617 edebug-outside-last-nonmenu-event last-nonmenu-event | 3584 edebug-outside-last-nonmenu-event last-nonmenu-event |
3618 edebug-outside-track-mouse track-mouse | 3585 edebug-outside-track-mouse track-mouse |
3619 edebug-outside-standard-output standard-output | 3586 edebug-outside-standard-output standard-output |
3620 edebug-outside-standard-input standard-input | 3587 edebug-outside-standard-input standard-input |
3621 | 3588 |
3622 edebug-outside-executing-macro executing-kbd-macro | 3589 edebug-outside-executing-macro executing-macro |
3623 edebug-outside-defining-kbd-macro defining-kbd-macro | 3590 edebug-outside-defining-kbd-macro defining-kbd-macro |
3624 edebug-outside-pre-command-hook pre-command-hook | 3591 edebug-outside-pre-command-hook pre-command-hook |
3625 edebug-outside-post-command-hook post-command-hook | 3592 edebug-outside-post-command-hook post-command-hook |
3626 edebug-outside-post-command-idle-hook post-command-idle-hook | 3593 edebug-outside-post-command-idle-hook post-command-idle-hook |
3627 | 3594 |
3646 (edebug-eval edebug-expr) | 3613 (edebug-eval edebug-expr) |
3647 (error (edebug-format "%s: %s" ;; could | 3614 (error (edebug-format "%s: %s" ;; could |
3648 (get (car edebug-err) 'error-message) | 3615 (get (car edebug-err) 'error-message) |
3649 (car (cdr edebug-err)))))) | 3616 (car (cdr edebug-err)))))) |
3650 | 3617 |
3651 ;;; Printing | 3618 ;;;; Printing |
3652 | 3619 ;;; ========= |
3653 ;; Replace printing functions. | 3620 ;; Replace printing functions. |
3654 | 3621 |
3655 ;; obsolete names | 3622 ;; obsolete names |
3656 (defalias 'edebug-install-custom-print-funcs 'edebug-install-custom-print) | 3623 (defalias 'edebug-install-custom-print-funcs 'edebug-install-custom-print) |
3657 (defalias 'edebug-reset-print-funcs 'edebug-uninstall-custom-print) | 3624 (defalias 'edebug-reset-print-funcs 'edebug-uninstall-custom-print) |
3713 (print-readably nil)) ;; XEmacs uses this. | 3680 (print-readably nil)) ;; XEmacs uses this. |
3714 (edebug-prin1-to-string value))) | 3681 (edebug-prin1-to-string value))) |
3715 | 3682 |
3716 (defun edebug-compute-previous-result (edebug-previous-value) | 3683 (defun edebug-compute-previous-result (edebug-previous-value) |
3717 (setq edebug-previous-result | 3684 (setq edebug-previous-result |
3718 (if (numberp edebug-previous-value) | 3685 (if (and (numberp edebug-previous-value) |
3719 (format "Result: %s" edebug-previous-value) | 3686 (< edebug-previous-value 256) |
3687 (>= edebug-previous-value 0)) | |
3688 (format "Result: %s = %s" edebug-previous-value | |
3689 (single-key-description edebug-previous-value)) | |
3720 (if edebug-unwrap-results | 3690 (if edebug-unwrap-results |
3721 (setq edebug-previous-value | 3691 (setq edebug-previous-value |
3722 (edebug-unwrap* edebug-previous-value))) | 3692 (edebug-unwrap* edebug-previous-value))) |
3723 (concat "Result: " | 3693 (concat "Result: " |
3724 (edebug-safe-prin1-to-string edebug-previous-value))))) | 3694 (edebug-safe-prin1-to-string edebug-previous-value))))) |
3726 (defun edebug-previous-result () | 3696 (defun edebug-previous-result () |
3727 "Print the previous result." | 3697 "Print the previous result." |
3728 (interactive) | 3698 (interactive) |
3729 (message "%s" edebug-previous-result)) | 3699 (message "%s" edebug-previous-result)) |
3730 | 3700 |
3731 ;;; Read, Eval and Print | 3701 ;;;; Read, Eval and Print |
3702 ;;; ===================== | |
3732 | 3703 |
3733 (defun edebug-eval-expression (edebug-expr) | 3704 (defun edebug-eval-expression (edebug-expr) |
3734 "Evaluate an expression in the outside environment. | 3705 "Evaluate an expression in the outside environment. |
3735 If interactive, prompt for the expression. | 3706 If interactive, prompt for the expression. |
3736 Print result in minibuffer." | 3707 Print result in minibuffer." |
3759 ;; princ the string to get rid of quotes. | 3730 ;; princ the string to get rid of quotes. |
3760 (princ edebug-result-string) | 3731 (princ edebug-result-string) |
3761 (princ "\n") | 3732 (princ "\n") |
3762 )) | 3733 )) |
3763 | 3734 |
3764 ;;; Edebug Minor Mode | 3735 |
3736 ;;;; Edebug Minor Mode | |
3737 ;;; =============================== | |
3765 | 3738 |
3766 ;; Global GUD bindings for all emacs-lisp-mode buffers. | 3739 ;; Global GUD bindings for all emacs-lisp-mode buffers. |
3767 (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) | 3740 (define-key emacs-lisp-mode-map "\C-x\C-a\C-s" 'edebug-step-mode) |
3768 (define-key emacs-lisp-mode-map "\C-x\C-a\C-n" 'edebug-next-mode) | 3741 (define-key emacs-lisp-mode-map "\C-x\C-a\C-n" 'edebug-next-mode) |
3769 (define-key emacs-lisp-mode-map "\C-x\C-a\C-c" 'edebug-go-mode) | 3742 (define-key emacs-lisp-mode-map "\C-x\C-a\C-c" 'edebug-go-mode) |
3922 edebug-unwrap-results | 3895 edebug-unwrap-results |
3923 edebug-global-break-condition | 3896 edebug-global-break-condition |
3924 " | 3897 " |
3925 (use-local-map edebug-mode-map)) | 3898 (use-local-map edebug-mode-map)) |
3926 | 3899 |
3927 ;;; edebug eval list mode | 3900 |
3928 | 3901 ;;;; edebug eval list mode |
3902 ;;; =============================================== | |
3929 ;; A list of expressions and their evaluations is displayed in *edebug*. | 3903 ;; A list of expressions and their evaluations is displayed in *edebug*. |
3930 | 3904 |
3931 (defun edebug-eval-result-list () | 3905 (defun edebug-eval-result-list () |
3932 "Return a list of evaluations of edebug-eval-list" | 3906 "Return a list of evaluations of edebug-eval-list" |
3933 ;; Assumes in outside environment. | 3907 ;; Assumes in outside environment. |
4058 (lisp-interaction-mode) | 4032 (lisp-interaction-mode) |
4059 (setq major-mode 'edebug-eval-mode) | 4033 (setq major-mode 'edebug-eval-mode) |
4060 (setq mode-name "Edebug-Eval") | 4034 (setq mode-name "Edebug-Eval") |
4061 (use-local-map edebug-eval-mode-map)) | 4035 (use-local-map edebug-eval-mode-map)) |
4062 | 4036 |
4063 ;;; Interface with standard debugger. | 4037 |
4038 ;;;; Interface with standard debugger. | |
4039 ;;; ======================================== | |
4064 | 4040 |
4065 ;; (setq debugger 'edebug) ; to use the edebug debugger | 4041 ;; (setq debugger 'edebug) ; to use the edebug debugger |
4066 ;; (setq debugger 'debug) ; use the standard debugger | 4042 ;; (setq debugger 'debug) ; use the standard debugger |
4067 | 4043 |
4068 ;; Note that debug and its utilities must be byte-compiled to work, | 4044 ;; Note that debug and its utilities must be byte-compiled to work, |
4137 (delete-region last-ok-point (point)) | 4113 (delete-region last-ok-point (point)) |
4138 ))) | 4114 ))) |
4139 ))))) | 4115 ))))) |
4140 | 4116 |
4141 | 4117 |
4142 ;;; Trace display | 4118 ;;;; Trace display |
4119 ;; =============================== | |
4143 | 4120 |
4144 (defun edebug-trace-display (buf-name fmt &rest args) | 4121 (defun edebug-trace-display (buf-name fmt &rest args) |
4145 "In buffer BUF-NAME, display FMT and ARGS at the end and make it visible. | 4122 "In buffer BUF-NAME, display FMT and ARGS at the end and make it visible. |
4146 The buffer is created if it does not exist. | 4123 The buffer is created if it does not exist. |
4147 You must include newlines in FMT to break lines, but one newline is appended." | 4124 You must include newlines in FMT to break lines, but one newline is appended." |
4148 ;; e.g. | 4125 ;; e.g. |
4149 ;; (edebug-trace-display "*trace-point*" | 4126 ;; (edebug-trace-display "*trace-point*" |
4150 ;; "saving: point = %s window-start = %s" | 4127 ;; "saving: point = %s window-start = %s" |
4151 ;; (point) (window-start)) | 4128 ;; (point) (window-start)) |
4152 (let* ((oldbuf (current-buffer)) | 4129 (let* ((selected-window (selected-window)) |
4153 (selected-window (selected-window)) | |
4154 (buffer (get-buffer-create buf-name)) | 4130 (buffer (get-buffer-create buf-name)) |
4155 buf-window) | 4131 buf-window) |
4156 ;; (message "before pop-to-buffer") (sit-for 1) | 4132 ;; (message "before pop-to-buffer") (sit-for 1) |
4157 (edebug-pop-to-buffer buffer) | 4133 (edebug-pop-to-buffer buffer) |
4158 (setq truncate-lines t) | 4134 (setq truncate-lines t) |
4164 (set-window-start buf-window (point)) | 4140 (set-window-start buf-window (point)) |
4165 (goto-char (point-max)) | 4141 (goto-char (point-max)) |
4166 ;; (set-window-point buf-window (point)) | 4142 ;; (set-window-point buf-window (point)) |
4167 ;; (edebug-sit-for 0) | 4143 ;; (edebug-sit-for 0) |
4168 (bury-buffer buffer) | 4144 (bury-buffer buffer) |
4169 (select-window selected-window) | 4145 (select-window selected-window)) |
4170 (set-buffer oldbuf)) | |
4171 buf-name) | 4146 buf-name) |
4172 | 4147 |
4173 | 4148 |
4174 (defun edebug-trace (fmt &rest args) | 4149 (defun edebug-trace (fmt &rest args) |
4175 "Convenience call to edebug-trace-display using edebug-trace-buffer" | 4150 "Convenience call to edebug-trace-display using edebug-trace-buffer" |
4176 (apply 'edebug-trace-display edebug-trace-buffer fmt args)) | 4151 (apply 'edebug-trace-display edebug-trace-buffer fmt args)) |
4177 | 4152 |
4178 | 4153 |
4179 ;;; Frequency count and coverage | 4154 ;;;; Frequency count and coverage |
4155 ;;; ============================== | |
4180 | 4156 |
4181 (defun edebug-display-freq-count () | 4157 (defun edebug-display-freq-count () |
4182 "Display the frequency count data for each line of the current | 4158 "Display the frequency count data for each line of the current |
4183 definition. The frequency counts are inserted as comment lines after | 4159 definition. The frequency counts are inserted as comment lines after |
4184 each line, and you can undo all insertions with one `undo' command. | 4160 each line, and you can undo all insertions with one `undo' command. |
4257 (edebug-display-freq-count) | 4233 (edebug-display-freq-count) |
4258 (setq unread-command-char (read-char)) | 4234 (setq unread-command-char (read-char)) |
4259 (undo))) | 4235 (undo))) |
4260 | 4236 |
4261 | 4237 |
4262 ;;; Menus | 4238 ;;;; Menus |
4239 ;;;========= | |
4263 | 4240 |
4264 (defun edebug-toggle (variable) | 4241 (defun edebug-toggle (variable) |
4265 (set variable (not (eval variable))) | 4242 (set variable (not (eval variable))) |
4266 (message "%s: %s" variable (eval variable))) | 4243 (message "%s: %s" variable (eval variable))) |
4267 | 4244 |
4324 (edebug-toggle 'edebug-save-displayed-buffer-points) t] | 4301 (edebug-toggle 'edebug-save-displayed-buffer-points) t] |
4325 )) | 4302 )) |
4326 "XEmacs style menus for Edebug.") | 4303 "XEmacs style menus for Edebug.") |
4327 | 4304 |
4328 | 4305 |
4329 ;;; Emacs version specific code | 4306 ;;;; Emacs version specific code |
4330 | 4307 ;;;============================= |
4331 ;;; The default for all above is Emacs 18, because it is easier to compile | 4308 ;;; The default for all above is Emacs 18, because it is easier to compile |
4332 ;;; Emacs 18 code in Emacs 19 than vice versa. This default will | 4309 ;;; Emacs 18 code in Emacs 19 than vice versa. This default will |
4333 ;;; change once most people are using Emacs 19 or derivatives. | 4310 ;;; change once most people are using Emacs 19 or derivatives. |
4334 | 4311 |
4335 ;; Epoch specific code is in a separate file: edebug-epoch.el. | 4312 ;; Epoch specific code is in a separate file: edebug-epoch.el. |
4336 | 4313 |
4337 ;; The byte-compiler will complain about changes in number of arguments | 4314 ;; The byte-compiler will complain about changes in number of arguments |
4338 ;; to functions like mark and read-from-minibuffer. These warnings | 4315 ;; to functions like mark and read-from-minibuffer. These warnings |
4339 ;; may be ignored because the right call should always be made. | 4316 ;; may be ignored because the right call should always be made. |
4391 (edebug-outside-excursion | 4368 (edebug-outside-excursion |
4392 (setq values (cons (edebug-eval edebug-expr) values)) | 4369 (setq values (cons (edebug-eval edebug-expr) values)) |
4393 (edebug-safe-prin1-to-string (car values))))) | 4370 (edebug-safe-prin1-to-string (car values))))) |
4394 | 4371 |
4395 (easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus) | 4372 (easy-menu-define edebug-menu edebug-mode-map "Edebug menus" edebug-mode-menus) |
4396 (if (eq (console-type) 'x) ; XEmacs | 4373 (if window-system |
4397 (x-popup-menu nil (lookup-key edebug-mode-map [menu-bar Edebug]))) | 4374 (x-popup-menu nil (lookup-key edebug-mode-map [menu-bar Edebug]))) |
4398 ) | 4375 ) |
4399 | 4376 |
4400 | 4377 |
4401 (defun edebug-xemacs-specific () | 4378 (defun edebug-xemacs-specific () |
4435 (edebug-emacs-19-specific)))) | 4412 (edebug-emacs-19-specific)))) |
4436 | 4413 |
4437 (edebug-emacs-version-specific) | 4414 (edebug-emacs-version-specific) |
4438 | 4415 |
4439 | 4416 |
4440 ;;; Byte-compiler | 4417 ;;;; Byte-compiler |
4441 | 4418 ;;; ==================== |
4442 ;; Extension for bytecomp to resolve undefined function references. | 4419 ;; Extension for bytecomp to resolve undefined function references. |
4443 ;; Requires new byte compiler. | 4420 ;; Requires new byte compiler. |
4444 | 4421 |
4445 ;; Reenable byte compiler warnings about unread-command-char and -event. | 4422 ;; Reenable byte compiler warnings about unread-command-char and -event. |
4446 ;; Disabled before edebug-recursive-edit. | 4423 ;; Disabled before edebug-recursive-edit. |
4506 ;; XEmacs | 4483 ;; XEmacs |
4507 zmacs-deactivate-region | 4484 zmacs-deactivate-region |
4508 popup-menu | 4485 popup-menu |
4509 ;; CL | 4486 ;; CL |
4510 cl-macroexpand-all | 4487 cl-macroexpand-all |
4511 ;; And believe it or not, the byte compiler doesn't know about: | 4488 ;; And believe it or not, the byte compiler doesnt know about: |
4512 byte-compile-resolve-functions | 4489 byte-compile-resolve-functions |
4513 )) | 4490 )) |
4514 | 4491 |
4515 '(byte-compile-resolve-free-references | 4492 '(byte-compile-resolve-free-references |
4516 '(read-expression-history | 4493 '(read-expression-history |
4520 '(read-expression-history)) | 4497 '(read-expression-history)) |
4521 | 4498 |
4522 ))) | 4499 ))) |
4523 | 4500 |
4524 | 4501 |
4525 ;;; Autoloading of Edebug accessories | 4502 ;;;; Autoloading of Edebug accessories |
4503 ;;;=================================== | |
4526 | 4504 |
4527 (if (featurep 'cl) | 4505 (if (featurep 'cl) |
4528 (add-hook 'edebug-setup-hook | 4506 (add-hook 'edebug-setup-hook |
4529 (function (lambda () (require 'cl-specs)))) | 4507 (function (lambda () (require 'cl-specs)))) |
4530 ;; The following causes cl-specs to be loaded if you load cl.el. | 4508 ;; The following causes cl-specs to be loaded if you load cl.el. |
4538 ;; The following causes edebug-cl-read to be loaded when you load cl-read.el. | 4516 ;; The following causes edebug-cl-read to be loaded when you load cl-read.el. |
4539 (add-hook 'cl-read-load-hooks | 4517 (add-hook 'cl-read-load-hooks |
4540 (function (lambda () (require 'edebug-cl-read))))) | 4518 (function (lambda () (require 'edebug-cl-read))))) |
4541 | 4519 |
4542 | 4520 |
4543 ;;; Finalize Loading | 4521 ;;;; Finalize Loading |
4522 ;;;=================== | |
4544 | 4523 |
4545 ;;; Finally, hook edebug into the rest of Emacs. | 4524 ;;; Finally, hook edebug into the rest of Emacs. |
4546 ;;; There are probably some other things that could go here. | 4525 ;;; There are probably some other things that could go here. |
4547 | 4526 |
4548 ;; Install edebug read and eval functions. | 4527 ;; Install edebug read and eval functions. |
4549 (edebug-install-read-eval-functions) | 4528 (edebug-install-read-eval-functions) |
4550 | 4529 |
4551 (provide 'edebug) | 4530 (provide 'edebug) |
4552 | 4531 |
4553 ;;; edebug.el ends here | 4532 ;;; edebug.el ends here |
4533 | |
4534 |