emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 412139f: Do not alter match data in Fcapitalize etc


From: Paul Eggert
Subject: [Emacs-diffs] master 412139f: Do not alter match data in Fcapitalize etc.
Date: Tue, 9 Jul 2019 16:11:50 -0400 (EDT)

branch: master
commit 412139f1be7415791a0d964f95f319c86eded426
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Do not alter match data in Fcapitalize etc.
    
    Without this patch, (capitalize "x") can alter the match data,
    which is not what users expect.  Problem found by running
    morse-tests-unnato-region in a stripped-down Emacs.
    Perhaps ‘load’ should also save and restore the match data?
    That would be a simpler fix, though arguably incompatible.
    * src/lread.c (save_match_data_load): New function.
    * src/chartab.c (uniprop_table):
    * src/doc.c (reread_doc_file):
    * src/eval.c (Fautoload_do_load):
    * src/fns.c (Frequire): Use it.
---
 src/chartab.c |  2 +-
 src/doc.c     |  2 +-
 src/eval.c    |  5 +----
 src/fns.c     |  5 +++--
 src/lisp.h    |  2 ++
 src/lread.c   | 11 +++++++++++
 6 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/chartab.c b/src/chartab.c
index bf8e34b..04205ac 100644
--- a/src/chartab.c
+++ b/src/chartab.c
@@ -1288,7 +1288,7 @@ uniprop_table (Lisp_Object prop)
   if (STRINGP (table))
     {
       AUTO_STRING (intl, "international/");
-      result = Fload (concat2 (intl, table), Qt, Qt, Qt, Qt);
+      result = save_match_data_load (concat2 (intl, table), Qt, Qt, Qt, Qt);
       if (NILP (result))
        return Qnil;
       table = XCDR (val);
diff --git a/src/doc.c b/src/doc.c
index 8875360..8b663f0 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -302,7 +302,7 @@ reread_doc_file (Lisp_Object file)
   if (NILP (file))
     Fsnarf_documentation (Vdoc_file_name);
   else
-    Fload (file, Qt, Qt, Qt, Qnil);
+    save_match_data_load (file, Qt, Qt, Qt, Qnil);
 
   return 1;
 }
diff --git a/src/eval.c b/src/eval.c
index 8f56994..02a6c35 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2049,9 +2049,6 @@ it defines a macro.  */)
 
   CHECK_SYMBOL (funname);
 
-  /* Preserve the match data.  */
-  record_unwind_save_match_data ();
-
   /* If autoloading gets an error (which includes the error of failing
      to define the function being called), we use Vautoload_queue
      to undo function definitions and `provide' calls made by
@@ -2067,7 +2064,7 @@ it defines a macro.  */)
      so don't signal an error if autoloading fails.  */
   Lisp_Object ignore_errors
     = (EQ (kind, Qt) || EQ (kind, Qmacro)) ? Qnil : macro_only;
-  Fload (Fcar (Fcdr (fundef)), ignore_errors, Qt, Qnil, Qt);
+  save_match_data_load (Fcar (Fcdr (fundef)), ignore_errors, Qt, Qnil, Qt);
 
   /* Once loading finishes, don't undo it.  */
   Vautoload_queue = Qt;
diff --git a/src/fns.c b/src/fns.c
index 77c0b15..11f5ddd 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -2984,8 +2984,9 @@ suppressed.  */)
       Vautoload_queue = Qt;
 
       /* Load the file.  */
-      tem = Fload (NILP (filename) ? Fsymbol_name (feature) : filename,
-                  noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
+      tem = save_match_data_load
+       (NILP (filename) ? Fsymbol_name (feature) : filename,
+        noerror, Qt, Qnil, (NILP (filename) ? Qt : Qnil));
 
       /* If load failed entirely, return nil.  */
       if (NILP (tem))
diff --git a/src/lisp.h b/src/lisp.h
index 8acf63f..fa57cad 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4019,6 +4019,8 @@ LOADHIST_ATTACH (Lisp_Object x)
   if (initialized)
     Vcurrent_load_list = Fcons (x, Vcurrent_load_list);
 }
+extern Lisp_Object save_match_data_load (Lisp_Object, Lisp_Object, Lisp_Object,
+                                        Lisp_Object, Lisp_Object);
 extern int openp (Lisp_Object, Lisp_Object, Lisp_Object,
                   Lisp_Object *, Lisp_Object, bool);
 enum { S2N_IGNORE_TRAILING = 1 };
diff --git a/src/lread.c b/src/lread.c
index e06eafc..3152fcf 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1508,6 +1508,17 @@ Return t if the file exists and loads successfully.  */)
 
   return Qt;
 }
+
+Lisp_Object
+save_match_data_load (Lisp_Object file, Lisp_Object noerror,
+                     Lisp_Object nomessage, Lisp_Object nosuffix,
+                     Lisp_Object must_suffix)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  record_unwind_save_match_data ();
+  Lisp_Object result = Fload (file, noerror, nomessage, nosuffix, must_suffix);
+  return unbind_to (count, result);
+}
 
 static bool
 complete_filename_p (Lisp_Object pathname)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]