changeset 103101:58c92ec0c915

* files.el (hack-local-variables-prop-line) (hack-local-variables, dir-locals-read-from-file): Bind read-circle to nil before reading. * lread.c (Vread_circle): New variable. (read1): Disable recursive read if Vread_circle is nil.
author Chong Yidong <cyd@stupidchicken.com>
date Wed, 29 Apr 2009 03:02:54 +0000
parents 5174a8be873b
children 789636652cc9
files etc/NEWS lisp/ChangeLog lisp/files.el src/ChangeLog src/lread.c
diffstat 5 files changed, 32 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS	Wed Apr 29 01:42:51 2009 +0000
+++ b/etc/NEWS	Wed Apr 29 03:02:54 2009 +0000
@@ -1931,6 +1931,10 @@
 ** Miscellaneous new variables
 
 +++
+*** `read-circle', if nil, disables the reading of recursive Lisp
+structures using the #N= and #N# syntax.
+
++++
 *** `this-command-keys-shift-translated' is non-nil if the key
 sequence invoking the current command was found by shift-translation.
 
--- a/lisp/ChangeLog	Wed Apr 29 01:42:51 2009 +0000
+++ b/lisp/ChangeLog	Wed Apr 29 03:02:54 2009 +0000
@@ -1,3 +1,9 @@
+2009-04-29  Ulrich Mueller  <ulm@gentoo.org>
+
+	* files.el (hack-local-variables-prop-line)
+	(hack-local-variables, dir-locals-read-from-file): Bind
+	read-circle to nil before reading.
+
 2009-04-28  Geert Kloosterman  <g.j.kloosterman@gmail.com>  (tiny change)
 
 	* progmodes/which-func.el (which-function): Don't assume that
--- a/lisp/files.el	Wed Apr 29 01:42:51 2009 +0000
+++ b/lisp/files.el	Wed Apr 29 03:02:54 2009 +0000
@@ -2898,7 +2898,8 @@
 	       (let ((key (intern (match-string 1)))
 		     (val (save-restriction
 			    (narrow-to-region (point) end)
-			    (read (current-buffer)))))
+			    (let ((read-circle nil))
+			      (read (current-buffer))))))
 		 ;; It is traditional to ignore
 		 ;; case when checking for `mode' in set-auto-mode,
 		 ;; so we must do that here as well.
@@ -3044,12 +3045,14 @@
 		  (if (eolp) (error "Missing colon in local variables entry"))
 		  (skip-chars-backward " \t")
 		  (let* ((str (buffer-substring beg (point)))
-			 (var (read str))
+			 (var (let ((read-circle nil))
+				(read str)))
 			 val)
 		    ;; Read the variable value.
 		    (skip-chars-forward "^:")
 		    (forward-char 1)
-		    (setq val (read (current-buffer)))
+		    (let ((read-circle nil))
+		      (setq val (read (current-buffer))))
 		    (if mode-only
 			(if (eq var 'mode)
 			    (setq result t))
@@ -3348,7 +3351,8 @@
     (insert-file-contents file)
     (let* ((dir-name (file-name-directory file))
 	   (class-name (intern dir-name))
-	   (variables (read (current-buffer))))
+	   (variables (let ((read-circle nil))
+			(read (current-buffer)))))
       (dir-locals-set-class-variables class-name variables)
       (dir-locals-set-directory-class dir-name class-name
 				      (nth 5 (file-attributes file)))
--- a/src/ChangeLog	Wed Apr 29 01:42:51 2009 +0000
+++ b/src/ChangeLog	Wed Apr 29 03:02:54 2009 +0000
@@ -1,3 +1,8 @@
+2009-04-29  Ulrich Mueller  <ulm@gentoo.org>
+
+	* lread.c (Vread_circle): New variable.
+	(read1): Disable recursive read if Vread_circle is nil.
+
 2009-04-29  Kenichi Handa  <handa@m17n.org>
 
 	* fontset.h (set_default_ascii_font): Delete extern.
--- a/src/lread.c	Wed Apr 29 01:42:51 2009 +0000
+++ b/src/lread.c	Wed Apr 29 03:02:54 2009 +0000
@@ -125,6 +125,9 @@
 /* Function to use for reading, in `load' and friends.  */
 Lisp_Object Vload_read_function;
 
+/* Non-nil means read recursive structures using #n= and #n# syntax.  */
+Lisp_Object Vread_circle;
+
 /* The association list of objects read with the #n=object form.
    Each member of the list has the form (n . object), and is used to
    look up the object for the corresponding #n# construct.
@@ -2558,7 +2561,7 @@
 	      c = READCHAR;
 	    }
 	  /* #n=object returns object, but associates it with n for #n#.  */
-	  if (c == '=')
+	  if (c == '=' && !NILP (Vread_circle))
 	    {
 	      /* Make a placeholder for #n# to use temporarily */
 	      Lisp_Object placeholder;
@@ -2580,7 +2583,7 @@
 	      return tem;
 	    }
 	  /* #n# returns a previously read object.  */
-	  if (c == '#')
+	  if (c == '#' && !NILP (Vread_circle))
 	    {
 	      tem = Fassq (make_number (n), read_objects);
 	      if (CONSP (tem))
@@ -4215,6 +4218,10 @@
 were read in. */);
   Vread_symbol_positions_list = Qnil;
 
+  DEFVAR_LISP ("read-circle", &Vread_circle,
+	       doc: /* Non-nil means read recursive structures using #N= and #N# syntax.  */);
+  Vread_circle = Qt;
+
   DEFVAR_LISP ("load-path", &Vload_path,
 	       doc: /* *List of directories to search for files to load.
 Each element is a string (directory name) or nil (try default directory).