70
|
1 ;; edebug-cl-read.el - Edebug reader macros for use with cl-read.
|
0
|
2
|
|
3 ;; Copyright (C) 1993 Daniel LaLiberte
|
|
4 ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu>
|
|
5 ;; Keywords: lisp, tools, maint
|
|
6
|
70
|
7 ;; LCD Archive Entry:
|
|
8 ;; edebug-cl-read.el|Daniel LaLiberte|liberte@cs.uiuc.edu
|
|
9 ;; |Edebug reader macros for cl-read.el
|
|
10 ;; |$Date: 1996/12/18 22:43:07 $|$Revision: 1.1.1.1 $|~/modes/edebug-cl-read.el|
|
4
|
11
|
70
|
12 ;; This file is not yet part of GNU Emacs.
|
|
13
|
|
14 ;; GNU Emacs is free software; you can redistribute it and/or modify
|
|
15 ;; it under the terms of the GNU General Public License as published by
|
4
|
16 ;; the Free Software Foundation; either version 2, or (at your option)
|
|
17 ;; any later version.
|
|
18
|
70
|
19 ;; GNU Emacs is distributed in the hope that it will be useful,
|
|
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
22 ;; GNU General Public License for more details.
|
4
|
23
|
|
24 ;; You should have received a copy of the GNU General Public License
|
70
|
25 ;; along with GNU Emacs; see the file COPYING. If not, write to
|
|
26 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
4
|
27
|
70
|
28 ;;;; Commentary:
|
0
|
29
|
|
30 ;; If you use cl-read.el and want to use edebug with any code
|
|
31 ;; in a file written with CL read syntax, then you need to use this
|
|
32 ;; package.
|
|
33
|
|
34 ;; To Do:
|
|
35 ;; Handle shared structures, but this is not normally used in executable code.
|
|
36
|
|
37 ;; Read-time evaluation shouldn't be used in a form argument since
|
|
38 ;; there is no way to instrument the result of the evaluation, and
|
|
39 ;; no way to tell Edebug not to try.
|
|
40
|
|
41 ;; Need to mangle all local variable names that might be visible to
|
|
42 ;; eval, e.g. stream, char. Alternatively, packages could hide them.
|
|
43
|
|
44 (require 'cl)
|
|
45 ;; For byte compiling cl-read is needed.
|
|
46 ;; But edebug-cl-read should not even be loaded unless cl-read already is.
|
|
47 (require 'cl-read)
|
|
48
|
|
49 (provide 'edebug-cl-read)
|
|
50 ;; Do the above provide before the following require to avoid load loop.
|
|
51 (require 'edebug)
|
|
52
|
|
53 (defvar reader::stack)
|
|
54
|
|
55 ;; The following modifications of reader functions
|
|
56 ;; could be done via advice. But we need to switch between
|
|
57 ;; edebug versions and originals frequently. Also advice.el
|
|
58 ;; doesn't support advising anonymous functions.
|
|
59
|
|
60 (defun edebug-reader::read-sexp-func (point func)
|
|
61 ;; dummy def
|
|
62 )
|
|
63
|
|
64 (defvar edebug-read-dotted-list)
|
|
65
|
|
66 (defun edebug-read-sexp-func (point func)
|
|
67 "Edebug offset storing is happening."
|
|
68 (edebug-storing-offsets point
|
|
69 (let (edebug-read-dotted-list)
|
|
70 (edebug-reader::read-sexp-func point func))))
|
|
71
|
|
72 (defun edebug-end-list-handler (stream char)
|
|
73 ;; If the dotted form is a list, signal to offset routines.
|
|
74 (setq edebug-read-dotted-list (listp (car reader::stack)))
|
|
75 (edebug-reader::end-list-handler stream char))
|
|
76
|
|
77
|
|
78 ;;=========================================================================
|
|
79 ;; Redefine the edebug reader to check whether CL syntax is active.
|
|
80 ;; This might be a little cleaner using advice.
|
|
81
|
|
82 (defvar edebug-reading-with-cl-read nil)
|
|
83
|
|
84 (or (fboundp 'edebug-original-read-storing-offsets)
|
|
85 (defalias 'edebug-original-read-storing-offsets
|
|
86 (symbol-function 'edebug-read-storing-offsets)))
|
|
87
|
|
88 (defun edebug-read-storing-offsets (stream)
|
|
89 ;; Read a sexp from STREAM.
|
|
90 ;; STREAM is limited to the current buffer.
|
|
91 ;; Create a parallel offset structure as described in doc for edebug-offsets.
|
|
92 ;; This version, from edebug-cl-read, uses cl-read.
|
|
93 (if (not cl-read-active)
|
|
94 ;; Use the reader for standard Emacs Lisp.
|
|
95 (edebug-original-read-storing-offsets stream)
|
|
96
|
|
97 ;; Use cl-read with edebug hooks.
|
|
98 (if edebug-reading-with-cl-read nil
|
|
99 ;; Only do this if it's not already been done, else it loops.
|
|
100 (fset 'edebug-reader::read-sexp-func
|
|
101 (symbol-function 'reader::read-sexp-func))
|
|
102 (fset 'reader::read-sexp-func 'edebug-read-sexp-func)
|
|
103 (fset 'edebug-reader::end-list-handler (get-macro-character ?\)))
|
|
104 (set-macro-character ?\) 'edebug-end-list-handler)))
|
|
105 (unwind-protect
|
|
106 (let ((edebug-reading-with-cl-read t))
|
|
107 (reader::read stream))
|
|
108 (if edebug-reading-with-cl-read nil
|
|
109 (set-macro-character
|
|
110 ?\) (symbol-function 'edebug-reader::end-list-handler))
|
|
111 (fset 'reader::read-sexp-func
|
|
112 (symbol-function 'edebug-reader::read-sexp-func)))))
|
|
113
|