unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Herbert Euler" <herberteuler@hotmail.com>
To: rudalics@gmx.at
Cc: emacs-devel@gnu.org
Subject: Re: find-file-noselect needs save-match-data
Date: Wed, 06 Jun 2007 08:25:53 +0800	[thread overview]
Message-ID: <BAY143-F26A88EDD02119A03082C52DA270@phx.gbl> (raw)

[-- Attachment #1: Type: text/plain, Size: 1562 bytes --]

> > I just got a possibly wrong idea today morning.  The error happens in
> > the case that some command, which changes the match data, is added
> > into a hook.  When the hook is executed, the match data is also
> > changed.  Now, if we could assume that _hooks shall not change the
> > match data_, we can save and restore the match data automatically when
> > we run hooks.  I am not sure about this assumption, though.
>
>`save-match-data' is not cheap.  I suppose it's not advisable to
>automatically wrap every hook into it.
>
> > Adding `save-match-data' to functions one by one works, but it is
> > difficult to check all of the functions, and it is not the overall
> > solution.
>
>I think that `find-file-noselect' and `file-truename' should not change
>match-data regardless of whether they run in a hook or not (though a
>number of hooks should probably not run `find-file-noselect' in the
>first place).

Ok.  So I wrote a script to find out all such defuns.  I found many
defuns are possible needing `save-match-data' with it.  The script is
attached, and to start finding, first load the file and then execute
`list-possible-wrong-match-defuns-in-dir'.  An exception in the
executing is for some files a question about whether to apply local
variables list.

Should we check all these defuns and add `save-match-data' to some of
them?

Regards,
Guanpeng Xu

_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar - get it now! 
http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/

[-- Attachment #2: ss.el --]
[-- Type: text/plain, Size: 3665 bytes --]

(defvar change-match-data-calling
  (regexp-opt '("(search-forward "
		"(search-backward "
		"(word-search-forward "
		"(word-search-backward "
		"(re-search-forward "
		"(re-search-backward "
		"(string-match "
		"(looking-at "
		"(looking-back "
		"(search-spaces-regexp "
		"(posix-search-forward "
		"(posix-search-backward "
		"(posix-looking-at "
		"(posix-string-match "
		"(set-match-data ")))

(defvar defun-form
  (regexp-opt '("(defun "
		"(define-minor-mode "
		"(define-derived-mode ")))

(defun find-possible-wrong-match-defuns-in-buffer (buffer)
  (let (possible-wrong-functions)
    (catch 'skip-this-file
      (with-current-buffer buffer
	(goto-char (point-min))
	;; Find a calling.
	(while (re-search-forward change-match-data-calling nil t)
	  (let ((valid t)
		func-name)
	    (catch 'not-a-defun
	      (condition-case nil
		  (progn
		    (let ((last-pos (point)))
		      (mark-defun)
		      (unless (looking-at (concat "\n" defun-form))
			(goto-char last-pos)
			(throw 'not-a-defun t)))
		    (setq func-name (save-excursion
				      (down-list)
				      (forward-sexp)
				      (skip-syntax-forward " ")
				      (buffer-substring-no-properties (point)
								      (save-excursion
									(forward-sexp)
									(point)))))
		    (save-restriction
		      (narrow-to-region (region-beginning) (region-end))
		      ;; Check each calling.
		      (while (and valid (re-search-forward change-match-data-calling nil 
t))
			(save-excursion
			  (backward-up-list)
			  (catch 'found-save-match-data
			    (condition-case nil
				(while t
				  (backward-up-list)
				  (if (looking-at "(save-match-data")
				      (throw 'found-save-match-data t)))
			      (error (setq valid nil))))))
		      (unless valid
			(setq possible-wrong-functions (cons func-name
							     possible-wrong-functions))
			(while (re-search-forward change-match-data-calling nil t)
			  nil))))
		(error (throw 'skip-this-file t))))))))
    possible-wrong-functions))

(defun find-possible-wrong-match-defuns-in-file (file)
  (when (file-exists-p file)
    (let* ((buffer (find-file-noselect file))
	   (possible-wrong-functions (find-possible-wrong-match-defuns-in-buffer 
buffer)))
      (kill-buffer buffer)
      (cons file possible-wrong-functions))))

(defun find-possible-wrong-match-defuns-in-dir (dir)
  (when (file-exists-p dir)
    (let (functions-list)
      (dolist (file (directory-files dir))
	(when (not (or (string= file ".")
		       (string= file "..")
		       (string-match "elc$" file)))
	  (let* ((fullname (concat dir (if (not (string-match "/$" dir))
					   "/"
					 "") file))
		 (isdir (car (file-attributes fullname)))
		 functions
		 sub-functions-list)
	    (if isdir
		(progn (setq sub-functions-list
			     (find-possible-wrong-match-defuns-in-dir fullname))
		       (when sub-functions-list
			 (setq functions-list (append sub-functions-list functions-list))))
	      (setq functions (find-possible-wrong-match-defuns-in-file fullname))
	      (if (> (length functions) 1)
		  (setq functions-list (cons functions functions-list)))))))
      functions-list)))

(defun list-possible-wrong-match-defuns-in-dir (dir)
  (interactive "DDirectory: ")
  (let ((functions-list (find-possible-wrong-match-defuns-in-dir dir))
	(buffer (get-buffer-create "*possible wrong match defuns*")))
    (with-current-buffer buffer
      (dolist (functions functions-list)
	(insert "In " (car functions) ":\n")
	(dolist (function (cdr functions))
	  (insert "\t" function "\n"))
	(insert "\n")))
    (delete-other-windows)
    (split-window-vertically)
    (other-window 1)
    (switch-to-buffer buffer)
    (goto-char (point-min))))

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

             reply	other threads:[~2007-06-06  0:25 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-06  0:25 Herbert Euler [this message]
  -- strict thread matches above, loose matches on Subject: below --
2007-06-04 15:17 find-file-noselect needs save-match-data Herbert Euler
2007-06-04 16:05 ` martin rudalics
2007-06-05  3:10   ` Herbert Euler
2007-06-05  5:52     ` martin rudalics
2007-06-05 22:32       ` Richard Stallman
2007-06-06  1:13   ` Stefan Monnier
2007-06-06  1:44     ` Herbert Euler
2007-06-06  6:58       ` martin rudalics
2007-06-06  7:25         ` David Kastrup
2007-06-06 22:09         ` Richard Stallman
2007-06-06 12:14       ` Stefan Monnier
2007-06-06 22:09         ` Richard Stallman
2007-06-06  6:57     ` martin rudalics
2007-06-06 12:17       ` Stefan Monnier
2007-06-06 12:33         ` Lennart Borgman (gmail)
2007-06-06 12:49         ` martin rudalics
2007-06-06 22:10         ` Richard Stallman
2007-06-06 22:29           ` Stefan Monnier
2007-06-08  7:11             ` Richard Stallman
2007-06-08  8:31               ` Kim F. Storm
2007-06-08  9:42                 ` martin rudalics
2007-06-08 10:31                   ` Kim F. Storm
2007-06-09  9:45                     ` Richard Stallman
2007-06-10  0:05                   ` Herbert Euler
2007-06-10  0:11                     ` Herbert Euler
2007-06-09  9:46                 ` Richard Stallman
2007-06-09 21:32                   ` Juri Linkov
2007-06-09 21:59                     ` David House
2007-06-09 22:43                       ` Juri Linkov
2007-06-09 22:53                       ` Jason Rumney
2007-06-09 23:59                       ` Miles Bader
2007-06-10  0:02                         ` Drew Adams
2007-06-10 13:19                     ` Richard Stallman
2007-06-12  3:05                       ` Bob Rogers
2007-06-12  4:06                         ` Miles Bader
2007-06-12 16:45                           ` Juri Linkov
2007-06-12 17:46                             ` Andreas Schwab
2007-06-12 21:55                               ` David Kastrup
2007-06-12 22:10                                 ` Miles Bader
2007-06-12 22:37                                   ` David Kastrup
2007-06-13 16:22                                     ` Richard Stallman
2007-06-13 17:31                                       ` Stefan Monnier
2007-06-13 18:33                                         ` David Kastrup
2007-06-13 19:55                                           ` Stefan Monnier
2007-06-14  6:37                                             ` Herbert Euler
2007-06-15  8:48                                               ` Richard Stallman
2007-06-15 14:22                                                 ` Stefan Monnier
2007-06-15 16:03                                                 ` Herbert Euler
2007-06-14  6:57                                             ` martin rudalics
2007-06-14 14:36                                               ` Stefan Monnier
2007-06-14 16:05                                                 ` Herbert Euler
2007-06-14 16:22                                                   ` Stefan Monnier
2007-06-15  1:59                                                     ` Herbert Euler
2007-06-15  8:49                                                     ` Richard Stallman
2007-06-15  8:49                                                   ` Richard Stallman
2007-06-14  6:57                                         ` martin rudalics
2007-06-15  8:48                                           ` Richard Stallman
2007-06-15 14:23                                             ` Stefan Monnier
2007-06-15 22:45                                               ` Richard Stallman
2007-06-17 19:54                                           ` Juri Linkov
2007-06-17 20:27                                             ` Lennart Borgman (gmail)
2007-06-14 16:19                                         ` Richard Stallman
2007-06-14 17:18                                           ` David Kastrup
2007-06-15 19:21                                             ` Richard Stallman
2007-06-15 19:52                                               ` Stefan Monnier
2007-06-13 23:39                                       ` Miles Bader
2007-06-14  0:52                                         ` Stefan Monnier
2007-06-14  6:58                                           ` martin rudalics
2007-06-14 16:20                                         ` Richard Stallman
2007-06-14 18:50                                           ` Stefan Monnier
2007-06-15  6:31                                             ` martin rudalics
2007-06-15 14:20                                               ` Stefan Monnier
2007-06-15 15:55                                                 ` Herbert Euler
2007-06-15 19:22                                               ` Richard Stallman
2007-06-16 10:01                                                 ` martin rudalics
2007-06-16 22:35                                                   ` Richard Stallman
2007-06-15 19:21                                             ` Richard Stallman
2007-06-15 19:55                                               ` Stefan Monnier
2007-06-15 20:03                                                 ` David Kastrup
2007-06-16 18:51                                                   ` Richard Stallman
2007-06-16 19:10                                                     ` David Kastrup
2007-06-17 21:49                                                       ` Richard Stallman
2007-06-18  5:16                                                         ` David Kastrup
2007-06-18 21:30                                                           ` Richard Stallman
2007-06-18 21:42                                                             ` David Kastrup
2007-06-19 22:26                                                               ` Richard Stallman
2007-06-19 22:42                                                                 ` David Kastrup
2007-06-25 13:19                                                                   ` Richard Stallman
2007-06-16  3:50                                                 ` Herbert Euler
2007-06-17 12:28                                                   ` Stefan Monnier
2007-06-16 18:51                                                 ` Richard Stallman
2007-06-16 21:39                                                   ` Miles Bader
2007-06-17  8:55                                                     ` Richard Stallman
2007-06-17  3:19                                                   ` Herbert Euler
2007-06-17  3:26                                                     ` Herbert Euler
2007-06-17 21:49                                                     ` Richard Stallman
2007-06-17 12:50                                                   ` Stefan Monnier
2007-06-18  7:25                                                     ` Richard Stallman
2007-06-20  8:07                                                       ` Herbert Euler
2007-06-20 14:12                                                         ` Juri Linkov
2007-06-20 14:44                                                           ` Herbert Euler
2007-06-21  1:07                                                           ` Richard Stallman
2007-06-21  1:29                                                             ` Herbert Euler
2007-06-21  6:31                                                               ` David Kastrup
2007-06-28 14:06                                                                 ` Herbert Euler
2007-06-29 15:07                                                                   ` Herbert Euler
2007-06-22  1:51                                                               ` Richard Stallman
2007-06-20 17:36                                                         ` Richard Stallman
2007-06-13 16:21                                 ` Richard Stallman
2007-06-05  5:18 ` Richard Stallman
2007-06-06  1:10 ` Stefan Monnier
2007-06-14 16:19 ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BAY143-F26A88EDD02119A03082C52DA270@phx.gbl \
    --to=herberteuler@hotmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=rudalics@gmx.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).