Mercurial > hg > xemacs-beta
diff lisp/edebug/edebug-cl-read.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | b82b59fe008d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/edebug/edebug-cl-read.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,113 @@ +;; edebug-cl-read.el - Edebug reader macros for use with cl-read. + +;; Copyright (C) 1993 Daniel LaLiberte +;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu> +;; Keywords: lisp, tools, maint + +;; LCD Archive Entry: +;; edebug-cl-read.el|Daniel LaLiberte|liberte@cs.uiuc.edu +;; |Edebug reader macros for cl-read.el +;; |$Date: 1996/12/18 03:33:27 $|$Revision: 1.1.1.1 $|~/modes/edebug-cl-read.el| + +;; This file is not yet part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;;; Commentary: + +;; If you use cl-read.el and want to use edebug with any code +;; in a file written with CL read syntax, then you need to use this +;; package. + +;; To Do: +;; Handle shared structures, but this is not normally used in executable code. + +;; Read-time evaluation shouldn't be used in a form argument since +;; there is no way to instrument the result of the evaluation, and +;; no way to tell Edebug not to try. + +;; Need to mangle all local variable names that might be visible to +;; eval, e.g. stream, char. Alternatively, packages could hide them. + +(require 'cl) +;; For byte compiling cl-read is needed. +;; But edebug-cl-read should not even be loaded unless cl-read already is. +(require 'cl-read) + +(provide 'edebug-cl-read) +;; Do the above provide before the following require to avoid load loop. +(require 'edebug) + +(defvar reader::stack) + +;; The following modifications of reader functions +;; could be done via advice. But we need to switch between +;; edebug versions and originals frequently. Also advice.el +;; doesn't support advising anonymous functions. + +(defun edebug-reader::read-sexp-func (point func) + ;; dummy def + ) + +(defvar edebug-read-dotted-list) + +(defun edebug-read-sexp-func (point func) + "Edebug offset storing is happening." + (edebug-storing-offsets point + (let (edebug-read-dotted-list) + (edebug-reader::read-sexp-func point func)))) + +(defun edebug-end-list-handler (stream char) + ;; If the dotted form is a list, signal to offset routines. + (setq edebug-read-dotted-list (listp (car reader::stack))) + (edebug-reader::end-list-handler stream char)) + + +;;========================================================================= +;; Redefine the edebug reader to check whether CL syntax is active. +;; This might be a little cleaner using advice. + +(defvar edebug-reading-with-cl-read nil) + +(or (fboundp 'edebug-original-read-storing-offsets) + (defalias 'edebug-original-read-storing-offsets + (symbol-function 'edebug-read-storing-offsets))) + +(defun edebug-read-storing-offsets (stream) + ;; Read a sexp from STREAM. + ;; STREAM is limited to the current buffer. + ;; Create a parallel offset structure as described in doc for edebug-offsets. + ;; This version, from edebug-cl-read, uses cl-read. + (if (not cl-read-active) + ;; Use the reader for standard Emacs Lisp. + (edebug-original-read-storing-offsets stream) + + ;; Use cl-read with edebug hooks. + (if edebug-reading-with-cl-read nil + ;; Only do this if it's not already been done, else it loops. + (fset 'edebug-reader::read-sexp-func + (symbol-function 'reader::read-sexp-func)) + (fset 'reader::read-sexp-func 'edebug-read-sexp-func) + (fset 'edebug-reader::end-list-handler (get-macro-character ?\))) + (set-macro-character ?\) 'edebug-end-list-handler))) + (unwind-protect + (let ((edebug-reading-with-cl-read t)) + (reader::read stream)) + (if edebug-reading-with-cl-read nil + (set-macro-character + ?\) (symbol-function 'edebug-reader::end-list-handler)) + (fset 'reader::read-sexp-func + (symbol-function 'edebug-reader::read-sexp-func))))) +