]> code.delx.au - gnu-emacs/commitdiff
Better support for future plugins
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 13 Feb 2015 02:20:12 +0000 (18:20 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 13 Feb 2015 02:21:32 +0000 (18:21 -0800)
See the thread containing:
http://lists.gnu.org/archive/html/emacs-devel/2015-02/msg00720.html
* lib-src/make-docfile.c (write_globals): Generate code that #defines
Qxxx macros other than Qnil only if DEFINE_NONNIL_Q_SYMBOL_MACROS.
Qnil is safe to define even in plugins, since it must be zero for
other reasons.
* src/lisp.h (DEFINE_LISP_SYMBOL): New macro, replacing and simplifying
DEFINE_LISP_SYMBOL_BEGIN / DEFINE_LISP_SYMBOL_END.  All uses changed.
(DEFINE_NONNIL_Q_SYMBOL_MACROS): New macro, defaulting to true.

lib-src/ChangeLog
lib-src/make-docfile.c
src/ChangeLog
src/lisp.h

index 8d2c95e671c40c349b845099f752e3d7b3d412cd..534d253cabb5e8d4dafd835a35647283bec9f7ef 100644 (file)
@@ -1,3 +1,13 @@
+2015-02-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Better support for future plugins
+       See the thread containing:
+       http://lists.gnu.org/archive/html/emacs-devel/2015-02/msg00720.html
+       * make-docfile.c (write_globals): Generate code that #defines
+       Qxxx macros other than Qnil only if DEFINE_NONNIL_Q_SYMBOL_MACROS.
+       Qnil is safe to define even in plugins, since it must be zero for
+       other reasons.
+
 2015-01-24  Paul Eggert  <eggert@cs.ucla.edu>
 
        Fix a couple of AM_V_GEN bugs
index 79d421a0a8ec09542b1634aeab3d3d3cfefe0c67..a7943e3118cad4fc952a43d62f2d49e1f083a7f0 100644 (file)
@@ -707,12 +707,9 @@ write_globals (void)
                  globals[i].name, globals[i].name);
        }
       else if (globals[i].type == SYMBOL)
-       printf (("DEFINE_LISP_SYMBOL_BEGIN (%s)\n"
-                "#define i%s %d\n"
-                "#define %s builtin_lisp_symbol (i%s)\n"
-                "DEFINE_LISP_SYMBOL_END (%s)\n\n"),
-               globals[i].name, globals[i].name, symnum++,
-               globals[i].name, globals[i].name, globals[i].name);
+       printf (("#define i%s %d\n"
+                "DEFINE_LISP_SYMBOL (%s)\n"),
+               globals[i].name, symnum++, globals[i].name);
       else
        {
          if (globals[i].flags & DEFUN_noreturn)
@@ -740,15 +737,19 @@ write_globals (void)
   puts ("#ifdef DEFINE_SYMBOLS");
   puts ("static char const *const defsym_name[] = {");
   for (int i = 0; i < num_globals; i++)
-    {
-      if (globals[i].type == SYMBOL)
-       printf ("\t\"%s\",\n", globals[i].v.svalue);
-      while (i + 1 < num_globals
-            && strcmp (globals[i].name, globals[i + 1].name) == 0)
-       i++;
-    }
+    if (globals[i].type == SYMBOL)
+      printf ("\t\"%s\",\n", globals[i].v.svalue);
   puts ("};");
   puts ("#endif");
+
+  puts ("#define Qnil builtin_lisp_symbol (0)");
+  puts ("#if DEFINE_NONNIL_Q_SYMBOL_MACROS");
+  num_symbols = 0;
+  for (int i = 0; i < num_globals; i++)
+    if (globals[i].type == SYMBOL && num_symbols++ != 0)
+      printf ("# define %s builtin_lisp_symbol (%d)\n",
+             globals[i].name, num_symbols - 1);
+  puts ("#endif");
 }
 
 \f
index f8e65d5d91d4a805c488945ce83e46da150d2012..6d246fb52c6103d9f70c7c0a661f1f882cd20cc4 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Better support for future plugins
+       * lisp.h (DEFINE_LISP_SYMBOL): New macro, replacing and simplifying
+       DEFINE_LISP_SYMBOL_BEGIN / DEFINE_LISP_SYMBOL_END.  All uses changed.
+       (DEFINE_NONNIL_Q_SYMBOL_MACROS): New macro, defaulting to true.
+
 2015-02-11  Martin Rudalics  <rudalics@gmx.at>
 
        * w32term.c (w32_read_socket): In SIZE_MAXIMIZED and
index 6c7b51fea061072529aec9c5a0332f5269ca33ca..7795c90e5ccafc011a377579b0ddda9f09fc9b72 100644 (file)
@@ -740,11 +740,18 @@ struct Lisp_Symbol
 /* Declare extern constants for Lisp symbols.  These can be helpful
    when using a debugger like GDB, on older platforms where the debug
    format does not represent C macros.  */
-#define DEFINE_LISP_SYMBOL_BEGIN(name) \
-  DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name)
-#define DEFINE_LISP_SYMBOL_END(name) \
+#define DEFINE_LISP_SYMBOL(name) \
+  DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \
   DEFINE_GDB_SYMBOL_END (LISP_INITIALLY (XLI_BUILTIN_LISPSYM (i##name)))
 
+/* By default, define macros for Qt, etc., as this leads to a bit
+   better performance in the core Emacs interpreter.  A plugin can
+   define DEFINE_NONNIL_Q_SYMBOL_MACROS to be false, to be portable to
+   other Emacs instances that assign different values to Qt, etc.  */
+#ifndef DEFINE_NONNIL_Q_SYMBOL_MACROS
+# define DEFINE_NONNIL_Q_SYMBOL_MACROS true
+#endif
+
 #include "globals.h"
 
 /* Convert a Lisp_Object to the corresponding EMACS_INT and vice versa.