unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
@ 2012-07-15 17:34 Dmitry Antipov
  2012-07-16  6:41 ` Paul Eggert
  2012-07-17  7:20 ` Stefan Monnier
  0 siblings, 2 replies; 6+ messages in thread
From: Dmitry Antipov @ 2012-07-15 17:34 UTC (permalink / raw)
  To: Emacs development discussions

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

This patch moves all GCPRO stuff out of compilation if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS.

Dmitry

[-- Attachment #2: gcpro.patch --]
[-- Type: text/plain, Size: 69298 bytes --]

=== modified file 'configure.ac'
--- configure.ac	2012-07-14 00:04:10 +0000
+++ configure.ac	2012-07-15 17:14:12 +0000
@@ -4265,6 +4265,8 @@
 
 #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
 
+#define ATTRIBUTE_UNUSED _GL_UNUSED
+
 /* Some versions of GNU/Linux define noinline in their headers.  */
 #ifdef noinline
 #undef noinline

=== modified file 'src/alloc.c'
--- src/alloc.c	2012-07-15 11:17:09 +0000
+++ src/alloc.c	2012-07-15 15:23:23 +0000
@@ -419,8 +419,9 @@
 #endif
 
 /* Recording what needs to be marked for gc.  */
-
+#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
 struct gcpro *gcprolist;
+#endif
 
 /* Addresses of staticpro'd variables.  Initialize it to a nonzero
    value; otherwise some compilers put it into BSS.  */
@@ -4735,7 +4736,7 @@
 	abort ();
 }
 
-#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
+#elif GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES && 0
 
 static void
 dump_zombies (void)
@@ -6675,8 +6676,8 @@
 void
 init_alloc (void)
 {
-  gcprolist = 0;
-  byte_stack_list = 0;
+  IF_GCPRO (gcprolist = NULL);
+  byte_stack_list = NULL;
 #if GC_MARK_STACK
 #if !defined GC_SAVE_REGISTERS_ON_STACK && !defined GC_SETJMP_WORKS
   setjmp_tested_p = longjmps_done = 0;

=== modified file 'src/bidi.c'
--- src/bidi.c	2012-07-05 18:35:48 +0000
+++ src/bidi.c	2012-07-15 14:43:28 +0000
@@ -2306,7 +2306,7 @@
 {
   int old_level, new_level, next_level;
   struct bidi_it sentinel;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (bidi_it->charpos < 0 || bidi_it->bytepos < 0)
     abort ();

=== modified file 'src/buffer.c'
--- src/buffer.c	2012-07-10 23:24:36 +0000
+++ src/buffer.c	2012-07-15 14:43:28 +0000
@@ -1462,7 +1462,7 @@
   register struct buffer *b;
   register Lisp_Object tem;
   register struct Lisp_Marker *m;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (buffer_or_name))
     buffer = Fcurrent_buffer ();
@@ -2181,7 +2181,7 @@
   int narrowed = (BEG != BEGV || Z != ZV);
   int modified_p = !NILP (Fbuffer_modified_p (Qnil));
   Lisp_Object old_undo = BVAR (current_buffer, undo_list);
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (current_buffer->base_buffer)
     error ("Cannot do `set-buffer-multibyte' on an indirect buffer");
@@ -4149,7 +4149,7 @@
   struct Lisp_Overlay *tail;
   /* 1 if this change is an insertion.  */
   int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end));
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   overlay = Qnil;
   tail = NULL;
@@ -4253,8 +4253,7 @@
 
     memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,
 	    size * sizeof (Lisp_Object));
-    gcpro1.var = copy;
-    gcpro1.nvars = size;
+    IF_GCPRO (gcpro1.var = copy; gcpro1.nvars = size);
 
     for (i = 0; i < size;)
       {
@@ -4271,7 +4270,7 @@
 call_overlay_mod_hooks (Lisp_Object list, Lisp_Object overlay, int after,
 			Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
 {
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   GCPRO4 (list, arg1, arg2, arg3);
 

=== modified file 'src/callint.c'
--- src/callint.c	2012-07-10 16:53:26 +0000
+++ src/callint.c	2012-07-15 14:43:28 +0000
@@ -275,7 +275,7 @@
   ptrdiff_t i, nargs;
   int foo;
   int arg_from_tty = 0;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   ptrdiff_t key_count;
   int record_then_fail = 0;
 
@@ -481,8 +481,7 @@
     }
 
   GCPRO5 (prefix_arg, function, *args, *visargs, up_event);
-  gcpro3.nvars = nargs;
-  gcpro4.nvars = nargs;
+  IF_GCPRO (gcpro3.nvars = nargs; gcpro4.nvars = nargs);
 
   if (!NILP (enable))
     specbind (Qenable_recursive_minibuffers, Qt);

=== modified file 'src/callproc.c'
--- src/callproc.c	2012-07-09 21:28:39 +0000
+++ src/callproc.c	2012-07-15 14:43:28 +0000
@@ -350,7 +350,7 @@
      protected by the caller, so all we really have to worry about is
      buffer.  */
   {
-    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+    DEFGCPRO5;
 
     current_dir = BVAR (current_buffer, directory);
 
@@ -409,7 +409,7 @@
 
   /* Search for program; barf if not found.  */
   {
-    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+    DEFGCPRO4;
 
     GCPRO4 (infile, buffer, current_dir, error_file);
     openp (Vexec_path, args[0], Vexec_suffixes, &path, make_number (X_OK));
@@ -432,7 +432,7 @@
   if (nargs > 4)
     {
       ptrdiff_t i;
-      struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+      DEFGCPRO5;
 
       GCPRO5 (infile, buffer, current_dir, path, error_file);
       argument_coding.dst_multibyte = 0;
@@ -970,7 +970,7 @@
 usage: (call-process-region START END PROGRAM &optional DELETE BUFFER DISPLAY &rest ARGS)  */)
   (ptrdiff_t nargs, Lisp_Object *args)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object filename_string;
   register Lisp_Object start, end;
   ptrdiff_t count = SPECPDL_INDEX ();

=== modified file 'src/charset.c'
--- src/charset.c	2012-07-05 18:35:48 +0000
+++ src/charset.c	2012-07-15 14:43:28 +0000
@@ -665,7 +665,7 @@
   int to_idx = CODE_POINT_TO_INDEX (temp_charset_work->current, to);
   Lisp_Object range;
   int c, stop;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   range = Fcons (Qnil, Qnil);
   GCPRO1 (range);

=== modified file 'src/chartab.c'
--- src/chartab.c	2011-12-11 00:56:50 +0000
+++ src/chartab.c	2012-07-15 14:43:28 +0000
@@ -882,7 +882,7 @@
 		Lisp_Object function, Lisp_Object table, Lisp_Object arg)
 {
   Lisp_Object range, val, parent;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   uniprop_decoder_t decoder = UNIPROP_GET_DECODER (table);
 
   range = Fcons (make_number (0), make_number (MAX_CHAR));
@@ -1052,7 +1052,7 @@
 {
   Lisp_Object range;
   int c, i;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   range = Fcons (Qnil, Qnil);
   GCPRO1 (range);
@@ -1328,7 +1328,7 @@
   table = XCDR (val);
   if (STRINGP (table))
     {
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       GCPRO1 (val);
       result = Fload (concat2 (build_string ("international/"), table),
 		      Qt, Qt, Qt, Qt);

=== modified file 'src/coding.c'
--- src/coding.c	2012-07-11 07:19:44 +0000
+++ src/coding.c	2012-07-15 14:43:28 +0000
@@ -7579,7 +7579,7 @@
 code_conversion_restore (Lisp_Object arg)
 {
   Lisp_Object current, workbuf;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (arg);
   current = XCAR (arg);
@@ -7787,7 +7787,7 @@
 
   if (! NILP (CODING_ATTR_POST_READ (attrs)))
     {
-      struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+      DEFGCPRO5;
       ptrdiff_t prev_Z = Z, prev_Z_BYTE = Z_BYTE;
       Lisp_Object val;
 
@@ -7932,7 +7932,7 @@
 
       {
 	Lisp_Object args[3];
-	struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+	DEFGCPRO5;
 
 	GCPRO5 (coding->src_object, coding->dst_object, src_object, dst_object,
 		old_deactivate_mark);

=== modified file 'src/data.c'
--- src/data.c	2012-07-10 08:43:46 +0000
+++ src/data.c	2012-07-15 14:43:28 +0000
@@ -759,7 +759,7 @@
 	return Fassq (Qinteractive, Fcdr (XCDR (fun)));
       else if (EQ (funcar, Qautoload))
 	{
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 	  GCPRO1 (cmd);
 	  do_autoload (fun, cmd);
 	  UNGCPRO;
@@ -1431,7 +1431,7 @@
 {
   register Lisp_Object args_left;
   register Lisp_Object val, symbol;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (args))
     return Qnil;

=== modified file 'src/dbusbind.c'
--- src/dbusbind.c	2012-07-10 08:43:46 +0000
+++ src/dbusbind.c	2012-07-15 14:43:28 +0000
@@ -920,7 +920,7 @@
     case DBUS_TYPE_DICT_ENTRY:
       {
 	Lisp_Object result;
-	struct gcpro gcpro1;
+	DEFGCPRO1;
 	DBusMessageIter subiter;
 	int subtype;
 	result = Qnil;
@@ -1246,7 +1246,7 @@
   Lisp_Object interface = Qnil;
   Lisp_Object member = Qnil;
   Lisp_Object result;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
   DBusConnection *connection;
   DBusMessage *dmessage;
   DBusMessageIter iter;
@@ -1502,7 +1502,7 @@
 xd_read_message_1 (DBusConnection *connection, Lisp_Object bus)
 {
   Lisp_Object args, key, value;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   struct input_event event;
   DBusMessage *dmessage;
   DBusMessageIter iter;

=== modified file 'src/dired.c'
--- src/dired.c	2012-07-03 18:24:42 +0000
+++ src/dired.c	2012-07-15 14:43:28 +0000
@@ -122,7 +122,7 @@
   struct re_pattern_buffer *bufp = NULL;
   int needsep = 0;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   DIRENTRY *dp;
 #ifdef WINDOWSNT
   Lisp_Object w32_save = Qnil;
@@ -229,7 +229,7 @@
 	  ptrdiff_t len;
 	  int wanted = 0;
 	  Lisp_Object name, finalname;
-	  struct gcpro gcpro1, gcpro2;
+	  DEFGCPRO2;
 
 	  len = NAMLEN (dp);
 	  name = finalname = make_unibyte_string (dp->d_name, len);
@@ -289,7 +289,7 @@
 		  /* Construct an expanded filename for the directory entry.
 		     Use the decoded names for input to Ffile_attributes.  */
 		  Lisp_Object decoded_fullname, fileattrs;
-		  struct gcpro gcpro1, gcpro2;
+		  DEFGCPRO2;
 
 		  decoded_fullname = fileattrs = Qnil;
 		  GCPRO2 (decoded_fullname, fileattrs);
@@ -464,7 +464,7 @@
      anything.  */
   int includeall = 1;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
 
   elt = Qnil;
 
@@ -673,7 +673,7 @@
       if (!NILP (predicate))
 	{
 	  Lisp_Object val;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 
 	  GCPRO1 (name);
 	  val = call1 (predicate, name);
@@ -935,7 +935,7 @@
   char modes[sizeof "-rwxr-xr-x "];
 
   Lisp_Object handler;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   char *uname = NULL, *gname = NULL;
 
   filename = Fexpand_file_name (filename, Qnil);

=== modified file 'src/doc.c'
--- src/doc.c	2012-07-10 21:48:34 +0000
+++ src/doc.c	2012-07-15 14:43:28 +0000
@@ -306,7 +306,7 @@
 {
 #if 0
   Lisp_Object reply, prompt[3];
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   GCPRO1 (file);
   prompt[0] = build_string ("File ");
   prompt[1] = NILP (file) ? Vdoc_file_name : file;
@@ -436,7 +436,7 @@
       if (NILP (tem) && try_reload)
 	{
 	  /* The file is newer, we need to reset the pointers.  */
-	  struct gcpro gcpro1, gcpro2;
+	  DEFGCPRO2;
 	  GCPRO2 (function, raw);
 	  try_reload = reread_doc_file (Fcar_safe (doc));
 	  UNGCPRO;
@@ -481,7 +481,7 @@
       if (NILP (tem) && try_reload)
 	{
 	  /* The file is newer, we need to reset the pointers.  */
-	  struct gcpro gcpro1, gcpro2, gcpro3;
+	  DEFGCPRO3;
 	  GCPRO3 (symbol, prop, raw);
 	  try_reload = reread_doc_file (Fcar_safe (doc));
 	  UNGCPRO;
@@ -731,7 +731,7 @@
   unsigned char *start;
   ptrdiff_t length, length_byte;
   Lisp_Object name;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   int multibyte;
   ptrdiff_t nchars;
 

=== modified file 'src/editfns.c'
--- src/editfns.c	2012-07-10 23:24:36 +0000
+++ src/editfns.c	2012-07-15 14:43:28 +0000
@@ -839,7 +839,7 @@
 save_excursion_restore (Lisp_Object info)
 {
   Lisp_Object tem, tem1, omark, nmark;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   int visible_p;
 
   tem = Fmarker_buffer (XCAR (info));
@@ -2939,7 +2939,7 @@
 	    {
 	      Lisp_Object tem, string;
 
-	      struct gcpro gcpro1;
+	      DEFGCPRO1;
 
 	      tem = BVAR (current_buffer, undo_list);
 	      GCPRO1 (tem);
@@ -3473,7 +3473,7 @@
 	  || FRAME_MSDOS_P (XFRAME (selected_frame)))
       {
 	Lisp_Object pane, menu;
-	struct gcpro gcpro1;
+	DEFGCPRO1;
 	pane = Fcons (Fcons (build_string ("OK"), Qt), Qnil);
 	GCPRO1 (pane);
 	menu = Fcons (val, pane);
@@ -3535,7 +3535,7 @@
   (ptrdiff_t nargs, Lisp_Object *args)
 {
   Lisp_Object properties, string;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   ptrdiff_t i;
 
   /* Number of args must be odd.  */
@@ -4254,7 +4254,7 @@
   if (STRING_INTERVALS (args[0]) || arg_intervals)
     {
       Lisp_Object len, new_len, props;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       /* Add text properties from the format string.  */
       len = make_number (SCHARS (args[0]));

=== modified file 'src/emacs.c'
--- src/emacs.c	2012-07-12 23:56:39 +0000
+++ src/emacs.c	2012-07-15 14:43:28 +0000
@@ -1971,7 +1971,7 @@
 all of which are called before Emacs is actually killed.  */)
   (Lisp_Object arg)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object hook;
   int exit_code;
 

=== modified file 'src/eval.c'
--- src/eval.c	2012-07-10 16:53:26 +0000
+++ src/eval.c	2012-07-15 14:57:55 +0000
@@ -253,7 +253,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object val = Qnil;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
 
@@ -277,7 +277,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object val = Qt;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
 
@@ -302,7 +302,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object cond;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
   cond = eval_sub (Fcar (args));
@@ -326,7 +326,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object clause, val;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   val = Qnil;
   GCPRO1 (args);
@@ -353,7 +353,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object val = Qnil;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
 
@@ -376,7 +376,7 @@
 {
   Lisp_Object val;
   register Lisp_Object args_left;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   args_left = args;
   val = Qnil;
@@ -397,7 +397,7 @@
 usage: (prog2 FORM1 FORM2 BODY...)  */)
   (Lisp_Object args)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
   eval_sub (XCAR (args));
@@ -418,7 +418,7 @@
 {
   register Lisp_Object args_left;
   register Lisp_Object val, sym, lex_binding;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (args))
     return Qnil;
@@ -811,7 +811,7 @@
 {
   Lisp_Object varlist, var, val, elt, lexenv;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   GCPRO3 (args, elt, varlist);
 
@@ -875,7 +875,7 @@
   register Lisp_Object elt, varlist;
   ptrdiff_t count = SPECPDL_INDEX ();
   ptrdiff_t argnum;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   USE_SAFE_ALLOCA;
 
   varlist = Fcar (args);
@@ -887,7 +887,7 @@
   /* Compute the values and store them in `temps'.  */
 
   GCPRO2 (args, *temps);
-  gcpro2.nvars = 0;
+  IF_GCPRO (gcpro2.nvars = 0);
 
   for (argnum = 0; CONSP (varlist); varlist = XCDR (varlist))
     {
@@ -899,7 +899,7 @@
 	signal_error ("`let' bindings can have only one value-form", elt);
       else
 	temps [argnum++] = eval_sub (Fcar (Fcdr (elt)));
-      gcpro2.nvars = argnum;
+      IF_GCPRO (gcpro2.nvars = argnum);
     }
   UNGCPRO;
 
@@ -941,7 +941,7 @@
   (Lisp_Object args)
 {
   Lisp_Object test, body;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   GCPRO2 (test, body);
 
@@ -1010,7 +1010,7 @@
 	      if (EQ (tem, Qt) || EQ (tem, Qmacro))
 		/* Yes, load it and try again.  */
 		{
-		  struct gcpro gcpro1;
+		  DEFGCPRO1;
 		  GCPRO1 (form);
 		  do_autoload (def, sym);
 		  UNGCPRO;
@@ -1052,7 +1052,7 @@
   (Lisp_Object args)
 {
   register Lisp_Object tag;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (args);
   tag = eval_sub (Fcar (args));
@@ -1080,7 +1080,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   catchlist = &c;
 
@@ -1146,7 +1146,7 @@
 #endif
 
   byte_stack_list = catch->byte_stack;
-  gcprolist = catch->gcpro;
+  IF_GCPRO (gcprolist = catch->gcpro);
 #ifdef DEBUG_GCPRO
   gcpro_level = gcprolist ? gcprolist->level + 1 : 0;
 #endif
@@ -1260,7 +1260,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   if (_setjmp (c.jmp))
     {
@@ -1315,7 +1315,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   if (_setjmp (c.jmp))
     {
@@ -1353,7 +1353,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   if (_setjmp (c.jmp))
     {
@@ -1395,7 +1395,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   if (_setjmp (c.jmp))
     {
@@ -1437,7 +1437,7 @@
   c.pdlcount = SPECPDL_INDEX ();
   c.poll_suppress_count = poll_suppress_count;
   c.interrupt_input_blocked = interrupt_input_blocked;
-  c.gcpro = gcprolist;
+  IF_GCPRO (c.gcpro = gcprolist);
   c.byte_stack = byte_stack_list;
   if (_setjmp (c.jmp))
     {
@@ -1969,7 +1969,7 @@
 {
   ptrdiff_t count = SPECPDL_INDEX ();
   Lisp_Object fun;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   /* This is to make sure that loadup.el gives a clear picture
      of what files are preloaded and when.  */
@@ -2028,7 +2028,7 @@
   Lisp_Object fun, val, original_fun, original_args;
   Lisp_Object funcar;
   struct backtrace backtrace;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   if (handling_signal)
     abort ();
@@ -2122,14 +2122,13 @@
 	  SAFE_ALLOCA_LISP (vals, XINT (numargs));
 
 	  GCPRO3 (args_left, fun, fun);
-	  gcpro3.var = vals;
-	  gcpro3.nvars = 0;
+	  IF_GCPRO (gcpro3.var = vals; gcpro3.nvars = 0);
 
 	  while (!NILP (args_left))
 	    {
 	      vals[argnum++] = eval_sub (Fcar (args_left));
 	      args_left = Fcdr (args_left);
-	      gcpro3.nvars = argnum;
+	      IF_GCPRO (gcpro3.nvars = argnum);
 	    }
 
 	  backtrace.args = vals;
@@ -2142,14 +2141,14 @@
       else
 	{
 	  GCPRO3 (args_left, fun, fun);
-	  gcpro3.var = argvals;
-	  gcpro3.nvars = 0;
+	  IF_GCPRO (gcpro3.var = argvals; gcpro3.nvars = 0);
 
 	  maxargs = XSUBR (fun)->max_args;
 	  for (i = 0; i < maxargs; args_left = Fcdr (args_left))
 	    {
 	      argvals[i] = eval_sub (Fcar (args_left));
-	      gcpro3.nvars = ++i;
+	      i++;
+	      IF_GCPRO (gcpro3.nvars = i);
 	    }
 
 	  UNGCPRO;
@@ -2248,12 +2247,12 @@
 usage: (apply FUNCTION &rest ARGUMENTS)  */)
   (ptrdiff_t nargs, Lisp_Object *args)
 {
-  ptrdiff_t i;
+  ptrdiff_t i, funcall_nargs;
   EMACS_INT numargs;
   register Lisp_Object spread_arg;
   register Lisp_Object *funcall_args;
   Lisp_Object fun, retval;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   USE_SAFE_ALLOCA;
 
   fun = args [0];
@@ -2297,7 +2296,8 @@
 	  for (i = numargs; i < XSUBR (fun)->max_args;)
 	    funcall_args[++i] = Qnil;
 	  GCPRO1 (*funcall_args);
-	  gcpro1.nvars = 1 + XSUBR (fun)->max_args;
+	  funcall_nargs = 1 + XSUBR (fun)->max_args; 
+	  IF_GCPRO (gcpro1.nvars = funcall_nargs);
 	}
     }
  funcall:
@@ -2307,7 +2307,8 @@
     {
       SAFE_ALLOCA_LISP (funcall_args, 1 + numargs);
       GCPRO1 (*funcall_args);
-      gcpro1.nvars = 1 + numargs;
+      funcall_nargs = 1 + numargs;
+      IF_GCPRO (gcpro1.nvars = funcall_nargs);
     }
 
   memcpy (funcall_args, args, nargs * sizeof (Lisp_Object));
@@ -2321,7 +2322,7 @@
     }
 
   /* By convention, the caller needs to gcpro Ffuncall's args.  */
-  retval = Ffuncall (gcpro1.nvars, funcall_args);
+  retval = Ffuncall (funcall_nargs, funcall_args);
   UNGCPRO;
   SAFE_FREE ();
 
@@ -2467,7 +2468,7 @@
 		    Lisp_Object (*funcall) (ptrdiff_t nargs, Lisp_Object *args))
 {
   Lisp_Object sym, val, ret = Qnil;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   /* If we are dying or still initializing,
      don't do anything--it would probably crash if we tried.  */
@@ -2548,17 +2549,17 @@
 Lisp_Object
 apply1 (Lisp_Object fn, Lisp_Object arg)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (fn);
   if (NILP (arg))
     RETURN_UNGCPRO (Ffuncall (1, &fn));
-  gcpro1.nvars = 2;
+  IF_GCPRO (gcpro1.nvars = 2);
   {
     Lisp_Object args[2];
     args[0] = fn;
     args[1] = arg;
-    gcpro1.var = args;
+    IF_GCPRO (gcpro1.var = args);
     RETURN_UNGCPRO (Fapply (2, args));
   }
 }
@@ -2567,7 +2568,7 @@
 Lisp_Object
 call0 (Lisp_Object fn)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (fn);
   RETURN_UNGCPRO (Ffuncall (1, &fn));
@@ -2578,13 +2579,13 @@
 Lisp_Object
 call1 (Lisp_Object fn, Lisp_Object arg1)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[2];
 
   args[0] = fn;
   args[1] = arg1;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 2;
+  IF_GCPRO (gcpro1.nvars = 2);
   RETURN_UNGCPRO (Ffuncall (2, args));
 }
 
@@ -2593,13 +2594,13 @@
 Lisp_Object
 call2 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[3];
   args[0] = fn;
   args[1] = arg1;
   args[2] = arg2;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 3;
+  IF_GCPRO (gcpro1.nvars = 3);
   RETURN_UNGCPRO (Ffuncall (3, args));
 }
 
@@ -2608,14 +2609,14 @@
 Lisp_Object
 call3 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[4];
   args[0] = fn;
   args[1] = arg1;
   args[2] = arg2;
   args[3] = arg3;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 4;
+  IF_GCPRO (gcpro1.nvars = 4);
   RETURN_UNGCPRO (Ffuncall (4, args));
 }
 
@@ -2625,7 +2626,7 @@
 call4 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3,
        Lisp_Object arg4)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[5];
   args[0] = fn;
   args[1] = arg1;
@@ -2633,7 +2634,7 @@
   args[3] = arg3;
   args[4] = arg4;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 5;
+  IF_GCPRO (gcpro1.nvars = 5);
   RETURN_UNGCPRO (Ffuncall (5, args));
 }
 
@@ -2643,7 +2644,7 @@
 call5 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3,
        Lisp_Object arg4, Lisp_Object arg5)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[6];
   args[0] = fn;
   args[1] = arg1;
@@ -2652,7 +2653,7 @@
   args[4] = arg4;
   args[5] = arg5;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 6;
+  IF_GCPRO (gcpro1.nvars = 6);
   RETURN_UNGCPRO (Ffuncall (6, args));
 }
 
@@ -2662,7 +2663,7 @@
 call6 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3,
        Lisp_Object arg4, Lisp_Object arg5, Lisp_Object arg6)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[7];
   args[0] = fn;
   args[1] = arg1;
@@ -2672,7 +2673,7 @@
   args[5] = arg5;
   args[6] = arg6;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 7;
+  IF_GCPRO (gcpro1.nvars = 7);
   RETURN_UNGCPRO (Ffuncall (7, args));
 }
 
@@ -2682,7 +2683,7 @@
 call7 (Lisp_Object fn, Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3,
        Lisp_Object arg4, Lisp_Object arg5, Lisp_Object arg6, Lisp_Object arg7)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[8];
   args[0] = fn;
   args[1] = arg1;
@@ -2693,7 +2694,7 @@
   args[6] = arg6;
   args[7] = arg7;
   GCPRO1 (args[0]);
-  gcpro1.nvars = 8;
+  IF_GCPRO (gcpro1.nvars = 8);
   RETURN_UNGCPRO (Ffuncall (8, args));
 }
 
@@ -2903,7 +2904,7 @@
   ptrdiff_t i;
   EMACS_INT numargs;
   register Lisp_Object *arg_vector;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   register Lisp_Object tem;
   USE_SAFE_ALLOCA;
 
@@ -2912,14 +2913,14 @@
   args_left = args;
 
   GCPRO3 (*arg_vector, args_left, fun);
-  gcpro1.nvars = 0;
+  IF_GCPRO (gcpro1.nvars = 0);
 
   for (i = 0; i < numargs; )
     {
       tem = Fcar (args_left), args_left = Fcdr (args_left);
       tem = eval_sub (tem);
       arg_vector[i++] = tem;
-      gcpro1.nvars = i;
+      IF_GCPRO (gcpro1.nvars = i);
     }
 
   UNGCPRO;
@@ -3227,7 +3228,7 @@
 unbind_to (ptrdiff_t count, Lisp_Object value)
 {
   Lisp_Object quitf = Vquit_flag;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   GCPRO2 (value, quitf);
   Vquit_flag = Qnil;
@@ -3327,7 +3328,7 @@
   register struct backtrace *backlist = backtrace_list;
   Lisp_Object tail;
   Lisp_Object tem;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object old_print_level = Vprint_level;
 
   if (NILP (Vprint_level))

=== modified file 'src/fileio.c'
--- src/fileio.c	2012-07-10 23:24:36 +0000
+++ src/fileio.c	2012-07-15 14:43:28 +0000
@@ -854,7 +854,7 @@
 #endif /* not DOS_NT */
 	)
       {
-	struct gcpro gcpro1;
+	DEFGCPRO1;
 
 	GCPRO1 (name);
 	default_directory = Fexpand_file_name (default_directory, Qnil);
@@ -1803,7 +1803,7 @@
 {
   register Lisp_Object tem, encoded_filename;
   struct stat statbuf;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   encoded_filename = ENCODE_FILE (absname);
 
@@ -1873,7 +1873,7 @@
   char buf[16 * 1024];
   struct stat st, out_st;
   Lisp_Object handler;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   ptrdiff_t count = SPECPDL_INDEX ();
   int input_file_statable_p;
   Lisp_Object encoded_file, encoded_newname;
@@ -2159,7 +2159,7 @@
 {
   Lisp_Object handler;
   Lisp_Object encoded_file;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (filename);
   if (!NILP (Ffile_directory_p (filename))
@@ -2214,7 +2214,7 @@
   (Lisp_Object file, Lisp_Object newname, Lisp_Object ok_if_already_exists)
 {
   Lisp_Object handler;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   Lisp_Object encoded_file, encoded_newname, symlink_target;
 
   symlink_target = encoded_file = encoded_newname = Qnil;
@@ -2305,7 +2305,7 @@
 {
   Lisp_Object handler;
   Lisp_Object encoded_file, encoded_newname;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   GCPRO4 (file, newname, encoded_file, encoded_newname);
   encoded_file = encoded_newname = Qnil;
@@ -2360,7 +2360,7 @@
 {
   Lisp_Object handler;
   Lisp_Object encoded_filename, encoded_linkname;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   GCPRO4 (filename, linkname, encoded_filename, encoded_linkname);
   encoded_filename = encoded_linkname = Qnil;
@@ -2739,7 +2739,7 @@
 {
   Lisp_Object handler;
   int tem;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
@@ -3083,7 +3083,7 @@
   Lisp_Object absname1, absname2;
   struct stat st1, st2;
   Lisp_Object handler;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   CHECK_STRING (file1);
   CHECK_STRING (file2);
@@ -3260,7 +3260,7 @@
   off_t beg_offset, end_offset;
   register int unprocessed;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   Lisp_Object handler, val, insval, orig_filename, old_undo;
   Lisp_Object p;
   ptrdiff_t total = 0;
@@ -3768,7 +3768,7 @@
       ptrdiff_t this_count = SPECPDL_INDEX ();
       int multibyte = ! NILP (BVAR (current_buffer, enable_multibyte_characters));
       Lisp_Object conversion_buffer;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       conversion_buffer = code_conversion_save (1, multibyte);
 
@@ -4556,7 +4556,7 @@
   Lisp_Object encoded_filename;
   int visiting = (EQ (visit, Qt) || STRINGP (visit));
   int quietly = !NILP (visit);
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   struct buffer *given_buffer;
   struct coding_system coding;
 
@@ -4863,7 +4863,7 @@
 {
   Lisp_Object annotations;
   Lisp_Object p, res;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object original_buffer;
   int i, used_global = 0;
 
@@ -5193,7 +5193,7 @@
 {
   Lisp_Object args[3], msg;
   int i, nbytes;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   char *msgbuf;
   USE_SAFE_ALLOCA;
 
@@ -5313,7 +5313,7 @@
   ptrdiff_t count = SPECPDL_INDEX ();
   int orig_minibuffer_auto_raise = minibuffer_auto_raise;
   int old_message_p = 0;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   if (max_specpdl_size < specpdl_size + 40)
     max_specpdl_size = specpdl_size + 40;
@@ -5556,7 +5556,7 @@
 Lisp_Object
 Fread_file_name (Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object args[7];
 
   GCPRO1 (default_filename);

=== modified file 'src/filelock.c'
--- src/filelock.c	2012-07-10 06:23:45 +0000
+++ src/filelock.c	2012-07-15 14:43:28 +0000
@@ -548,7 +548,7 @@
   ptrdiff_t locker_size;
   lock_info_type lock_info;
   printmax_t pid;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   USE_SAFE_ALLOCA;
 
   /* Don't do locking if the user has opted out.  */

=== modified file 'src/fns.c'
--- src/fns.c	2012-07-15 11:17:09 +0000
+++ src/fns.c	2012-07-15 14:43:28 +0000
@@ -1747,7 +1747,7 @@
 {
   Lisp_Object front, back;
   register Lisp_Object len, tem;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   EMACS_INT length;
 
   front = list;
@@ -1775,7 +1775,7 @@
   register Lisp_Object tail;
   Lisp_Object tem;
   register Lisp_Object l1, l2;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   l1 = org_l1;
   l2 = org_l2;
@@ -2271,7 +2271,7 @@
   register Lisp_Object tail;
   Lisp_Object dummy;
   register EMACS_INT i;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   if (vals)
     {
@@ -2280,8 +2280,7 @@
 	vals[i] = Qnil;
 
       GCPRO3 (dummy, fn, seq);
-      gcpro1.var = vals;
-      gcpro1.nvars = leni;
+      IF_GCPRO (gcpro1.var = vals; gcpro1.nvars = leni);
     }
   else
     GCPRO2 (fn, seq);
@@ -2353,7 +2352,7 @@
   EMACS_INT nargs;
   ptrdiff_t i;
   register Lisp_Object *args;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object ret;
   USE_SAFE_ALLOCA;
 
@@ -2452,7 +2451,7 @@
 {
   register Lisp_Object ans;
   Lisp_Object args[2];
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   CHECK_STRING (prompt);
 
@@ -2614,7 +2613,7 @@
   (Lisp_Object feature, Lisp_Object filename, Lisp_Object noerror)
 {
   register Lisp_Object tem;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   int from_file = load_in_progress;
 
   CHECK_SYMBOL (feature);
@@ -2761,7 +2760,7 @@
 {
   /* This function can GC. */
   Lisp_Object newargs[3];
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object result;
 
   newargs[0] = Fwidget_get (args[0], args[1]);
@@ -2812,7 +2811,7 @@
       Lisp_Object v = Fmake_vector (make_number (7), Qnil);
       const int days[7] = {DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7};
       int i;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       GCPRO1 (v);
       synchronize_system_time_locale ();
       for (i = 0; i < 7; i++)
@@ -2836,7 +2835,7 @@
       const int months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7,
 			      MON_8, MON_9, MON_10, MON_11, MON_12};
       int i;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       GCPRO1 (v);
       synchronize_system_time_locale ();
       for (i = 0; i < 12; i++)

=== modified file 'src/frame.c'
--- src/frame.c	2012-07-11 04:31:53 +0000
+++ src/frame.c	2012-07-15 14:43:28 +0000
@@ -370,7 +370,7 @@
 make_frame_without_minibuffer (register Lisp_Object mini_window, KBOARD *kb, Lisp_Object display)
 {
   register struct frame *f;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (!NILP (mini_window))
     CHECK_LIVE_WINDOW (mini_window);
@@ -1486,7 +1486,7 @@
   Lisp_Object x, y, retval;
   int col, row;
   Time long_dummy;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   f = SELECTED_FRAME ();
   x = y = Qnil;
@@ -2147,7 +2147,7 @@
   Lisp_Object alist;
   FRAME_PTR f;
   int height, width;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (frame))
     frame = selected_frame;
@@ -2751,7 +2751,7 @@
   int left_no_change = 0, top_no_change = 0;
   int icon_left_no_change = 0, icon_top_no_change = 0;
   int size_changed = 0;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   i = 0;
   for (tail = alist; CONSP (tail); tail = XCDR (tail))
@@ -2776,8 +2776,7 @@
   alist = tail = Qnil;
 
   GCPRO2 (*parms, *values);
-  gcpro1.nvars = i;
-  gcpro2.nvars = i;
+  IF_GCPRO (gcpro1.nvars = i; gcpro2.nvars = i);
 
   /* There is no need to gcpro LEFT, TOP, ICON_LEFT, or ICON_TOP,
      because their values appear in VALUES and strings are not valid.  */

=== modified file 'src/gtkutil.c'
--- src/gtkutil.c	2012-07-10 21:48:34 +0000
+++ src/gtkutil.c	2012-07-15 14:43:28 +0000
@@ -1830,7 +1830,7 @@
   if (default_filename)
     {
       Lisp_Object file;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       char *utf8_filename;
       GCPRO1 (file);
 
@@ -4224,7 +4224,7 @@
 {
   int i;
   Lisp_Object file, rtl_name;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   GCPRO2 (file, rtl_name);
 
   rtl_name = Ffile_name_nondirectory (rtl);

=== modified file 'src/indent.c'
--- src/indent.c	2012-06-28 12:29:37 +0000
+++ src/indent.c	2012-07-15 15:21:14 +0000
@@ -1978,7 +1978,7 @@
   struct window *w;
   Lisp_Object old_buffer;
   EMACS_INT old_charpos IF_LINT (= 0), old_bytepos IF_LINT (= 0);
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO1;
   Lisp_Object lcols = Qnil;
   double cols IF_LINT (= 0);
   void *itdata = NULL;
@@ -1999,7 +1999,7 @@
   w = XWINDOW (window);
 
   old_buffer = Qnil;
-  GCPRO3 (old_buffer, old_charpos, old_bytepos);
+  GCPRO1 (old_buffer);
   if (XBUFFER (w->buffer) != current_buffer)
     {
       /* Set the window's buffer temporarily to the current buffer.  */

=== modified file 'src/insdel.c'
--- src/insdel.c	2012-07-03 18:24:42 +0000
+++ src/insdel.c	2012-07-15 14:43:28 +0000
@@ -910,7 +910,7 @@
 		      ptrdiff_t nchars, ptrdiff_t nbytes,
 		      int inherit, int before_markers)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   ptrdiff_t outgoing_nbytes = nbytes;
   INTERVAL intervals;
 
@@ -1291,7 +1291,7 @@
   ptrdiff_t insbytes = SBYTES (new);
   ptrdiff_t from_byte, to_byte;
   ptrdiff_t nbytes_del, nchars_del;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   INTERVAL intervals;
   ptrdiff_t outgoing_insbytes = insbytes;
   Lisp_Object deletion;
@@ -1578,7 +1578,7 @@
 {
   ptrdiff_t from_byte, to_byte;
   Lisp_Object deletion;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   /* Make args be valid */
   if (from < BEGV)
@@ -1839,7 +1839,7 @@
       if (preserve_ptr)
 	{
 	  Lisp_Object preserve_marker;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 	  preserve_marker = Fcopy_marker (make_number (*preserve_ptr), Qnil);
 	  GCPRO1 (preserve_marker);
 	  verify_interval_modification (current_buffer, start, end);
@@ -1958,7 +1958,7 @@
   Lisp_Object start, end;
   Lisp_Object start_marker, end_marker;
   Lisp_Object preserve_marker;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   ptrdiff_t count = SPECPDL_INDEX ();
 
   if (inhibit_modification_hooks)

=== modified file 'src/keyboard.c'
--- src/keyboard.c	2012-07-12 03:45:46 +0000
+++ src/keyboard.c	2012-07-15 14:44:46 +0000
@@ -2282,7 +2282,7 @@
   volatile Lisp_Object previous_echo_area_message;
   volatile Lisp_Object also_record;
   volatile int reread;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   int volatile polling_stopped_here = 0;
   struct kboard *orig_kboard = current_kboard;
 
@@ -3004,7 +3004,7 @@
       Lisp_Object keys;
       ptrdiff_t key_count;
       int key_count_reset;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       ptrdiff_t count = SPECPDL_INDEX ();
 
       /* Save the echo status.  */
@@ -4329,7 +4329,7 @@
   EMACS_TIME now;
   EMACS_TIME idleness_now;
   Lisp_Object timers, idle_timers, chosen_timer;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   nexttime = invalid_emacs_time ();
 
@@ -7564,7 +7564,7 @@
 static void
 menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dummy2)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   int i;
   Lisp_Object tem;
 
@@ -8064,7 +8064,7 @@
 process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void *args)
 {
   int i;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   /* Protect KEY and DEF from GC because parse_tool_bar_item may call
      eval.  */
@@ -9074,7 +9074,7 @@
   int junk;
 #endif
 
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (fake_prefixed_keys);
   raw_keybuf_count = 0;
@@ -9869,7 +9869,7 @@
 	 Scan from indec.end until we find a bound suffix.  */
       while (indec.end < t)
 	{
-	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	  DEFGCPRO4;
 	  int done, diff;
 
 	  GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
@@ -9903,7 +9903,7 @@
 	/* Continue scan from fkey.end until we find a bound suffix.  */
 	while (fkey.end < indec.start)
 	  {
-	    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	    DEFGCPRO4;
 	    int done, diff;
 
 	    GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
@@ -9932,7 +9932,7 @@
 	 Scan from keytran.end until we find a bound suffix.  */
       while (keytran.end < fkey.start)
 	{
-	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	  DEFGCPRO4;
 	  int done, diff;
 
 	  GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
@@ -10127,7 +10127,7 @@
 {
   Lisp_Object keybuf[30];
   register int i;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   ptrdiff_t count = SPECPDL_INDEX ();
 
   if (!NILP (prompt))
@@ -10141,7 +10141,7 @@
 
   memset (keybuf, 0, sizeof keybuf);
   GCPRO1 (keybuf[0]);
-  gcpro1.nvars = (sizeof keybuf/sizeof (keybuf[0]));
+  IF_GCPRO (gcpro1.nvars = sizeof keybuf / sizeof keybuf[0]);
 
   if (NILP (continue_echo))
     {
@@ -10184,7 +10184,7 @@
 {
   Lisp_Object keybuf[30];
   register int i;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   ptrdiff_t count = SPECPDL_INDEX ();
 
   if (!NILP (prompt))
@@ -10198,7 +10198,7 @@
 
   memset (keybuf, 0, sizeof keybuf);
   GCPRO1 (keybuf[0]);
-  gcpro1.nvars = (sizeof keybuf / sizeof (keybuf[0]));
+  IF_GCPRO (gcpro1.nvars = sizeof keybuf / sizeof keybuf[0]);
 
   if (NILP (continue_echo))
     {
@@ -10274,7 +10274,7 @@
 
       if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload)))
 	{
-	  struct gcpro gcpro1, gcpro2;
+	  DEFGCPRO2;
 
 	  GCPRO2 (cmd, prefixarg);
 	  do_autoload (final, cmd);
@@ -10616,7 +10616,7 @@
   ptrdiff_t count = SPECPDL_INDEX ();
   int old_height, old_width;
   int width, height;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object hook;
 
   if (tty_list && tty_list->next)
@@ -10873,7 +10873,7 @@
       if (immediate_quit && NILP (Vinhibit_quit))
 	{
 	  struct gl_state_s saved;
-	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	  DEFGCPRO4;
 
 	  immediate_quit = 0;
           sigfree ();

=== modified file 'src/keymap.c'
--- src/keymap.c	2012-07-15 07:57:54 +0000
+++ src/keymap.c	2012-07-15 14:43:28 +0000
@@ -256,7 +256,7 @@
 	    {
 	      if (autoload)
 		{
-		  struct gcpro gcpro1, gcpro2;
+		  DEFGCPRO2;
 
 		  GCPRO2 (tem, object);
 		  do_autoload (tem, object);
@@ -324,7 +324,7 @@
   (Lisp_Object keymap, Lisp_Object parent)
 {
   Lisp_Object list, prev;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   /* Flush any reverse-map cache.  */
   where_is_cache = Qnil; where_is_cache_keymaps = Qt;
@@ -398,7 +398,7 @@
     {
       /* See if there is a meta-map.  If there's none, there is
          no binding for IDX, unless a default binding exists in MAP.  */
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       Lisp_Object event_meta_binding, event_meta_map;
       GCPRO1 (map);
       /* A strange value in which Meta is set would cause
@@ -430,7 +430,7 @@
     Lisp_Object t_binding = Qunbound;
     Lisp_Object retval = Qunbound;
     Lisp_Object retval_tail = Qnil;
-    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+    DEFGCPRO4;
 
     GCPRO4 (tail, idx, t_binding, retval);
 
@@ -586,7 +586,7 @@
 		     Lisp_Object args,
 		     void *data)
 {
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   Lisp_Object tail
     = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
 
@@ -634,7 +634,7 @@
 void
 map_keymap (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args, void *data, int autoload)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   GCPRO1 (args);
   map = get_keymap (map, 1, autoload);
   while (CONSP (map))
@@ -659,7 +659,7 @@
 void
 map_keymap_canonical (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args, void *data)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   GCPRO1 (args);
   /* map_keymap_canonical may be used from redisplay (e.g. when building menus)
      so be careful to ignore errors and to inhibit redisplay.  */
@@ -676,7 +676,7 @@
 If KEYMAP has a parent, this function returns it without processing it.  */)
   (Lisp_Object function, Lisp_Object keymap)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   GCPRO1 (function);
   keymap = get_keymap (keymap, 1, 1);
   keymap = map_keymap_internal (keymap, map_keymap_call, function, NULL);
@@ -1120,7 +1120,7 @@
   int metized = 0;
   int meta_bit;
   ptrdiff_t length;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   GCPRO3 (keymap, key, def);
   keymap = get_keymap (keymap, 1, 1);
@@ -1276,7 +1276,7 @@
   register Lisp_Object c;
   ptrdiff_t length;
   int t_ok = !NILP (accept_default);
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   GCPRO2 (keymap, key);
   keymap = get_keymap (keymap, 1, 1);
@@ -1791,7 +1791,7 @@
   int nmaps;
   Lisp_Object binding;
   int i, j;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   nmaps = current_minor_maps (&modes, &maps);
   /* Note that all these maps are GCPRO'd
@@ -2603,7 +2603,7 @@
   Lisp_Object found = Qnil;
   /* 1 means ignore all menu bindings entirely.  */
   int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
   /* List of sequences found via remapping.  Keep them in a separate
      variable, so as to push them later, since we prefer
      non-remapped binding.  */
@@ -2819,7 +2819,7 @@
   Lisp_Object outbuf, shadow;
   int nomenu = NILP (menus);
   register Lisp_Object start1;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   const char *alternate_heading
     = "\
@@ -2999,7 +2999,7 @@
 		   int always_title, int mention_shadow)
 {
   Lisp_Object maps, orig_maps, seen, sub_shadows;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   int something = 0;
   const char *key_heading
     = "\
@@ -3213,7 +3213,7 @@
   Lisp_Object suppress;
   Lisp_Object kludge;
   int first = 1;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   /* These accumulate the values from sparse keymap bindings,
      so we can sort them and handle them in order.  */
@@ -3454,7 +3454,7 @@
   Lisp_Object suppress;
   Lisp_Object kludge;
   int first = 1;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   /* Range of elements to be handled.  */
   int from, to, stop;
   Lisp_Object character;

=== modified file 'src/lisp.h'
--- src/lisp.h	2012-07-15 11:17:09 +0000
+++ src/lisp.h	2012-07-15 17:15:02 +0000
@@ -1948,6 +1948,24 @@
     defvar_kboard (&ko_fwd, lname, offsetof (KBOARD, vname ## _)); \
   } while (0)
 
+/* Values of GC_MARK_STACK during compilation:
+
+   0	Use GCPRO as before
+   1	Do the real thing, make GCPROs and UNGCPRO no-ops.
+   2    Mark the stack, and check that everything GCPRO'd is
+	marked.
+   3	Mark using GCPRO's, mark stack last, and count how many
+	dead objects are kept alive.  */
+
+
+#define GC_USE_GCPROS_AS_BEFORE		0
+#define GC_MAKE_GCPROS_NOOPS		1
+#define GC_MARK_STACK_CHECK_GCPROS	2
+#define GC_USE_GCPROS_CHECK_ZOMBIES	3
+
+#ifndef GC_MARK_STACK
+#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
+#endif
 
 \f
 /* Structure for recording Lisp call stack for backtrace purposes.  */
@@ -2032,7 +2050,9 @@
   Lisp_Object tag;
   Lisp_Object val;
   struct catchtag *next;
+#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
   struct gcpro *gcpro;
+#endif
   jmp_buf jmp;
   struct backtrace *backlist;
   struct handler *handlerlist;
@@ -2099,6 +2119,8 @@
 
 extern EMACS_INT memory_full_cons_threshold;
 
+#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
+
 /* Structure for recording stack slots that need marking.  */
 
 /* This is a chain of structures, each of which points at a Lisp_Object
@@ -2129,24 +2151,7 @@
 #endif
 };
 
-/* Values of GC_MARK_STACK during compilation:
-
-   0	Use GCPRO as before
-   1	Do the real thing, make GCPROs and UNGCPRO no-ops.
-   2    Mark the stack, and check that everything GCPRO'd is
-	marked.
-   3	Mark using GCPRO's, mark stack last, and count how many
-	dead objects are kept alive.  */
-
-
-#define GC_USE_GCPROS_AS_BEFORE		0
-#define GC_MAKE_GCPROS_NOOPS		1
-#define GC_MARK_STACK_CHECK_GCPROS	2
-#define GC_USE_GCPROS_CHECK_ZOMBIES	3
-
-#ifndef GC_MARK_STACK
-#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
-#endif
+#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
 
 /* Whether we do the stack marking manually.  */
 #define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS		\
@@ -2155,24 +2160,33 @@
 
 #if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
 
-/* Do something silly with gcproN vars just so gcc shuts up.  */
-/* You get warnings from MIPSPro...  */
+#define DEFGCPRO1 void *__dummy ATTRIBUTE_UNUSED = &__dummy
+#define DEFGCPRO2 void *__dummy ATTRIBUTE_UNUSED = &__dummy
+#define DEFGCPRO3 void *__dummy ATTRIBUTE_UNUSED = &__dummy
+#define DEFGCPRO4 void *__dummy ATTRIBUTE_UNUSED = &__dummy
+#define DEFGCPRO5 void *__dummy ATTRIBUTE_UNUSED = &__dummy
+#define DEFGCPRO6 void *__dummy ATTRIBUTE_UNUSED = &__dummy
 
-#define GCPRO1(varname) ((void) gcpro1)
-#define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
-#define GCPRO3(varname1, varname2, varname3) \
-  ((void) gcpro3, (void) gcpro2, (void) gcpro1)
-#define GCPRO4(varname1, varname2, varname3, varname4) \
-  ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
-#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
-  ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
-#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
-  ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
-   (void) gcpro1)
+#define GCPRO1(a) ((void) 0)
+#define GCPRO2(a,b) ((void) 0)
+#define GCPRO3(a,b,c) ((void) 0)
+#define GCPRO4(a,b,c,d) ((void) 0)
+#define GCPRO5(a,b,c,d,e) ((void) 0)
+#define GCPRO6(a,b,c,d,e,f) ((void) 0)
 #define UNGCPRO ((void) 0)
+#define RETURN_UNGCPRO(exp) do { return (exp); } while (0)
+
+#define IF_GCPRO(code) do { } while (0)
 
 #else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
 
+#define DEFGCPRO1 struct gcpro gcpro1
+#define DEFGCPRO2 struct gcpro gcpro1, gcpro2
+#define DEFGCPRO3 struct gcpro gcpro1, gcpro2, gcpro3
+#define DEFGCPRO4 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4
+#define DEFGCPRO5 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5
+#define DEFGCPRO6 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6
+
 #ifndef DEBUG_GCPRO
 
 #define GCPRO1(varname) \
@@ -2216,7 +2230,7 @@
 
 #define UNGCPRO (gcprolist = gcpro1.next)
 
-#else
+#else /* DEBUG_GCPRO */
 
 extern int gcpro_level;
 
@@ -2276,19 +2290,21 @@
   : ((gcprolist = gcpro1.next), 0))
 
 #endif /* DEBUG_GCPRO */
-#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
 
+#define IF_GCPRO(code) do { code; } while (0)
 
 /* Evaluate expr, UNGCPRO, and then return the value of expr.  */
 #define RETURN_UNGCPRO(expr)			\
-do						\
+  do						\
     {						\
       Lisp_Object ret_ungc_val;			\
       ret_ungc_val = (expr);			\
       UNGCPRO;					\
       return ret_ungc_val;			\
     }						\
-while (0)
+  while (0)
+
+#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
 
 /* Call staticpro (&var) to protect static variable `var'.  */
 

=== modified file 'src/lread.c'
--- src/lread.c	2012-07-12 03:45:46 +0000
+++ src/lread.c	2012-07-15 14:43:28 +0000
@@ -1015,7 +1015,7 @@
   register FILE *stream;
   register int fd = -1;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   Lisp_Object found, efound, hist_file_name;
   /* 1 means we printed the ".el is newer" message.  */
   int newer = 0;
@@ -1442,7 +1442,7 @@
   ptrdiff_t want_length;
   Lisp_Object filename;
   struct stat st;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
   Lisp_Object string, tail, encoded_fn;
   ptrdiff_t max_suffix_len = 0;
 
@@ -1674,7 +1674,7 @@
   register int c;
   register Lisp_Object val;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   struct buffer *b = 0;
   int continue_reading_p;
   Lisp_Object lex_bound;
@@ -2540,7 +2540,7 @@
       if (c == '(')
 	{
 	  Lisp_Object tmp;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 	  int ch;
 
 	  /* Read the string itself.  */
@@ -3459,7 +3459,7 @@
 {
   Lisp_Object val, tail;
   register Lisp_Object elt, tem;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   /* 0 is the normal case.
      1 means this list is a doc reference; replace it with the number 0.
      2 means this list is a doc reference; replace it with the doc string.  */

=== modified file 'src/macros.c'
--- src/macros.c	2012-07-05 18:35:48 +0000
+++ src/macros.c	2012-07-15 14:43:28 +0000
@@ -303,7 +303,7 @@
   Lisp_Object tem;
   ptrdiff_t pdlcount = SPECPDL_INDEX ();
   EMACS_INT repeat = 1;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   EMACS_INT success_count = 0;
 
   executing_kbd_macro_iterations = 0;

=== modified file 'src/menu.c'
--- src/menu.c	2012-07-05 18:35:48 +0000
+++ src/menu.c	2012-07-15 14:43:28 +0000
@@ -290,7 +290,7 @@
 		     Lisp_Object prefix, int maxdepth)
 {
   struct skp skp;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   skp.pending_maps = Qnil;
   skp.maxdepth = maxdepth;
@@ -338,7 +338,7 @@
 single_menu_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy, void *skp_v)
 {
   Lisp_Object map, item_string, enabled;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   int res;
   struct skp *skp = skp_v;
 
@@ -1083,7 +1083,7 @@
   int keymaps = 0;
   int for_click = 0;
   ptrdiff_t specpdl_count = SPECPDL_INDEX ();
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (position))
     /* This is an obsolete call, which wants us to precompute the

=== modified file 'src/minibuf.c'
--- src/minibuf.c	2012-07-11 07:19:44 +0000
+++ src/minibuf.c	2012-07-15 14:43:28 +0000
@@ -191,7 +191,7 @@
 static Lisp_Object
 string_to_object (Lisp_Object val, Lisp_Object defalt)
 {
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object expr_and_pos;
   ptrdiff_t pos;
 
@@ -396,7 +396,7 @@
   Lisp_Object val;
   ptrdiff_t count = SPECPDL_INDEX ();
   Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DEFGCPRO5;
   Lisp_Object enable_multibyte;
   EMACS_INT pos = 0;
   /* String to add to the history.  */
@@ -953,7 +953,7 @@
   (Lisp_Object prompt, Lisp_Object initial_contents, Lisp_Object keymap, Lisp_Object read, Lisp_Object hist, Lisp_Object default_value, Lisp_Object inherit_input_method)
 {
   Lisp_Object histvar, histpos, val;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   CHECK_STRING (prompt);
   if (NILP (keymap))
@@ -1258,7 +1258,7 @@
   int matchcount = 0;
   ptrdiff_t bindcount = -1;
   Lisp_Object bucket, zero, end, tem;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   CHECK_STRING (string);
   if (type == function_table)
@@ -1522,7 +1522,7 @@
   ptrdiff_t idx = 0, obsize = 0;
   ptrdiff_t bindcount = -1;
   Lisp_Object bucket, tem, zero;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
 
   CHECK_STRING (string);
   if (type == 0)

=== modified file 'src/print.c'
--- src/print.c	2012-07-05 18:35:48 +0000
+++ src/print.c	2012-07-15 16:16:31 +0000
@@ -416,7 +416,7 @@
       ptrdiff_t i;
       ptrdiff_t size = SCHARS (string);
       ptrdiff_t size_byte = SBYTES (string);
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       GCPRO1 (string);
       if (size == size_byte)
 	for (i = 0; i < size; i++)
@@ -588,7 +588,6 @@
   (Lisp_Object object, Lisp_Object noescape)
 {
   Lisp_Object printcharfun;
-  /* struct gcpro gcpro1, gcpro2; */
   Lisp_Object save_deactivate_mark;
   ptrdiff_t count = SPECPDL_INDEX ();
   struct buffer *previous;
@@ -602,7 +601,6 @@
        but we don't want to deactivate the mark just for that.
        No need for specbind, since errors deactivate the mark.  */
     save_deactivate_mark = Vdeactivate_mark;
-    /* GCPRO2 (object, save_deactivate_mark); */
     abort_on_gc++;
 
     printcharfun = Vprin1_to_string_buffer;
@@ -625,7 +623,6 @@
   set_buffer_internal (previous);
 
   Vdeactivate_mark = save_deactivate_mark;
-  /* UNGCPRO; */
 
   abort_on_gc--;
   return unbind_to (count, object);
@@ -691,7 +688,7 @@
   (Lisp_Object object, Lisp_Object printcharfun)
 {
   PRINTDECLARE;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (NILP (printcharfun))
     printcharfun = Vstandard_output;
@@ -818,7 +815,7 @@
 {
   struct buffer *old = current_buffer;
   Lisp_Object value;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   /* If OBJ is (error STRING), just return STRING.
      That is not only faster, it also avoids the need to allocate
@@ -852,7 +849,7 @@
 		     Lisp_Object caller)
 {
   Lisp_Object errname, errmsg, file_error, tail;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   if (context != 0)
     write_string_1 (context, -1, stream);
@@ -1397,7 +1394,7 @@
       else
 	{
 	  register ptrdiff_t i_byte;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 	  unsigned char *str;
 	  ptrdiff_t size_byte;
 	  /* 1 means we must ensure that the next character we output
@@ -1710,7 +1707,7 @@
 	  ptrdiff_t i;
 	  int len;
 	  unsigned char c;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 	  ptrdiff_t size_in_chars
 	    = ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
 	       / BOOL_VECTOR_BITS_PER_CHAR);

=== modified file 'src/process.c'
--- src/process.c	2012-07-13 00:07:29 +0000
+++ src/process.c	2012-07-15 14:43:28 +0000
@@ -1291,7 +1291,7 @@
      function.  The argument list is protected by the caller, so all
      we really have to worry about is buffer.  */
   {
-    struct gcpro gcpro1, gcpro2;
+    DEFGCPRO2;
 
     current_dir = BVAR (current_buffer, directory);
 
@@ -1359,7 +1359,7 @@
     /* Qt denotes we have not yet called Ffind_operation_coding_system.  */
     Lisp_Object coding_systems = Qt;
     Lisp_Object val, *args2;
-    struct gcpro gcpro1, gcpro2;
+    DEFGCPRO2;
 
     val = Vcoding_system_for_read;
     if (NILP (val))
@@ -1420,7 +1420,7 @@
 	  && !(SCHARS (program) > 1
 	       && IS_DEVICE_SEP (SREF (program, 1))))
 	{
-	  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+	  DEFGCPRO4;
 
 	  tem = Qnil;
 	  GCPRO4 (name, program, buffer, current_dir);
@@ -1445,7 +1445,7 @@
 
       {
 	Lisp_Object arg_encoding = Qnil;
-	struct gcpro gcpro1;
+	DEFGCPRO1;
 	GCPRO1 (tem);
 
 	/* Encode the file name and put it in NEW_ARGV.
@@ -2444,7 +2444,7 @@
   struct Lisp_Process *p;
   Lisp_Object contact = Qnil;
   Lisp_Object proc = Qnil;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   contact = Flist (nargs, args);
   GCPRO1 (contact);
@@ -2561,7 +2561,7 @@
   int fd = -1;
   Lisp_Object proc, contact, port;
   struct Lisp_Process *p;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object name, buffer;
   Lisp_Object tem, val;
   ptrdiff_t specpdl_count = -1;
@@ -2863,7 +2863,7 @@
   int ret = 0;
   int xerrno = 0;
   int s = -1, outch, inch;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   ptrdiff_t count = SPECPDL_INDEX ();
   ptrdiff_t count1;
   Lisp_Object QCaddress;  /* one of QClocal or QCremote */
@@ -3459,7 +3459,7 @@
 
   {
     /* Setup coding systems for communicating with the network stream.  */
-    struct gcpro gcpro1;
+    DEFGCPRO1;
     /* Qt denotes we have not yet called Ffind_operation_coding_system.  */
     Lisp_Object coding_systems = Qt;
     Lisp_Object fargs[5], val;
@@ -6574,7 +6574,7 @@
 {
   register Lisp_Object proc, buffer;
   Lisp_Object tail, msg;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   tail = Qnil;
   msg = Qnil;

=== modified file 'src/sound.c'
--- src/sound.c	2012-07-11 02:16:25 +0000
+++ src/sound.c	2012-07-15 14:43:28 +0000
@@ -1342,7 +1342,7 @@
 
 #ifndef WINDOWSNT
   Lisp_Object file;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object args[2];
 #else /* WINDOWSNT */
   int len = 0;

=== modified file 'src/sysdep.c'
--- src/sysdep.c	2012-07-11 07:05:21 +0000
+++ src/sysdep.c	2012-07-15 14:43:28 +0000
@@ -2319,7 +2319,7 @@
 list_system_processes (void)
 {
   Lisp_Object procdir, match, proclist, next;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   register Lisp_Object tail;
 
   GCPRO2 (procdir, match);
@@ -2359,7 +2359,7 @@
   struct kinfo_proc *procs;
   size_t i;
 
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object proclist = Qnil;
 
   if (sysctl (mib, 3, NULL, &len, NULL, 0) != 0)
@@ -2581,7 +2581,7 @@
   double pcpu, pmem;
   Lisp_Object attrs = Qnil;
   Lisp_Object cmd_str, decoded_cmd, tem;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   CHECK_NUMBER_OR_FLOAT (pid);
   CONS_TO_INTEGER (pid, pid_t, proc_id);
@@ -2819,7 +2819,7 @@
   gid_t gid;
   Lisp_Object attrs = Qnil;
   Lisp_Object decoded_cmd, tem;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   CHECK_NUMBER_OR_FLOAT (pid);
   CONS_TO_INTEGER (pid, pid_t, proc_id);
@@ -2948,7 +2948,7 @@
   struct kinfo_proc proc;
   size_t proclen = sizeof proc;
 
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object attrs = Qnil;
   Lisp_Object decoded_comm;
 

=== modified file 'src/textprop.c'
--- src/textprop.c	2012-07-10 16:53:26 +0000
+++ src/textprop.c	2012-07-15 14:43:28 +0000
@@ -356,7 +356,7 @@
   Lisp_Object tail1, tail2, sym1, val1;
   register int changed = 0;
   register int found;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
 
   tail1 = plist;
   sym1 = Qnil;
@@ -1135,7 +1135,7 @@
   register INTERVAL i, unchanged;
   register ptrdiff_t s, len;
   register int modified = 0;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   properties = validate_plist (properties);
   if (NILP (properties))
@@ -1775,7 +1775,7 @@
   Lisp_Object plist;
   ptrdiff_t s, e, e2, p, len;
   int modified = 0;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   i = validate_interval_range (src, &start, &end, soft);
   if (NULL_INTERVAL_P (i))
@@ -1922,7 +1922,7 @@
 int
 add_text_properties_from_list (Lisp_Object object, Lisp_Object list, Lisp_Object delta)
 {
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   int modified_p = 0;
 
   GCPRO2 (list, object);
@@ -1990,7 +1990,7 @@
 static void
 call_mod_hooks (Lisp_Object list, Lisp_Object start, Lisp_Object end)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   GCPRO1 (list);
   while (!NILP (list))
     {
@@ -2017,7 +2017,7 @@
   Lisp_Object hooks;
   register Lisp_Object prev_mod_hooks;
   Lisp_Object mod_hooks;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   hooks = Qnil;
   prev_mod_hooks = Qnil;

=== modified file 'src/undo.c'
--- src/undo.c	2012-07-10 23:24:36 +0000
+++ src/undo.c	2012-07-15 14:43:28 +0000
@@ -450,7 +450,7 @@
 Return what remains of the list.  */)
   (Lisp_Object n, Lisp_Object list)
 {
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Lisp_Object next;
   ptrdiff_t count = SPECPDL_INDEX ();
   register EMACS_INT arg;

=== modified file 'src/w32.c'
--- src/w32.c	2012-07-10 23:24:36 +0000
+++ src/w32.c	2012-07-15 14:43:28 +0000
@@ -3995,7 +3995,7 @@
 Lisp_Object
 list_system_processes (void)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object proclist = Qnil;
   HANDLE h_snapshot;
 
@@ -4149,7 +4149,7 @@
 Lisp_Object
 system_process_attributes (Lisp_Object pid)
 {
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   Lisp_Object attrs = Qnil;
   Lisp_Object cmd_str, decoded_cmd, tem;
   HANDLE h_snapshot, h_proc;

=== modified file 'src/w32fns.c'
--- src/w32fns.c	2012-07-11 04:31:53 +0000
+++ src/w32fns.c	2012-07-15 14:43:28 +0000
@@ -4072,7 +4072,7 @@
   long window_prompting = 0;
   int width, height;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   Lisp_Object display;
   struct w32_display_info *dpyinfo = NULL;
   Lisp_Object parent;
@@ -4763,7 +4763,7 @@
      HOME directory, then in Emacs etc dir for a file called rgb.txt. */
   {
     Lisp_Object color_file;
-    struct gcpro gcpro1;
+    DEFGCPRO1;
 
     color_file = build_string ("~/rgb.txt");
 
@@ -5175,7 +5175,7 @@
   long window_prompting = 0;
   int width, height;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   struct kboard *kb;
   int face_change_count_before = face_change_count;
   Lisp_Object buffer;
@@ -5519,7 +5519,7 @@
   struct buffer *old_buffer;
   struct text_pos pos;
   int i, width, height, seen_reversed_p;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   int old_windows_or_buffers_changed = windows_or_buffers_changed;
   ptrdiff_t count = SPECPDL_INDEX ();
 
@@ -5802,7 +5802,7 @@
 {
   ptrdiff_t count;
   Lisp_Object deleted, frame, timer;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   /* Return quickly if nothing to do.  */
   if (NILP (tip_timer) && NILP (tip_frame))
@@ -5923,7 +5923,7 @@
   struct frame *f = SELECTED_FRAME ();
   Lisp_Object file = Qnil;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
   char filename[MAX_PATH + 1];
   char init_dir[MAX_PATH + 1];
   int default_filter_index = 1; /* 1: All Files, 2: Directories only  */
@@ -6231,7 +6231,7 @@
   int vk_code;
   int lisp_modifiers;
   int w32_modifiers;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   CHECK_VECTOR (key);
 

=== modified file 'src/w32proc.c'
--- src/w32proc.c	2012-06-30 15:55:27 +0000
+++ src/w32proc.c	2012-07-15 14:43:28 +0000
@@ -780,7 +780,7 @@
   program = build_string (cmdname);
   if (NILP (Ffile_executable_p (program)))
     {
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       full = Qnil;
       GCPRO1 (program);

=== modified file 'src/w32uniscribe.c'
--- src/w32uniscribe.c	2012-07-05 06:32:41 +0000
+++ src/w32uniscribe.c	2012-07-15 14:43:28 +0000
@@ -645,7 +645,7 @@
   HDC context;
   HFONT check_font, old_font;
   int i, retval = 0;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   /* Check the spec is in the right format.  */
   if (!CONSP (otf_spec) || XINT (Flength (otf_spec)) < 3)

=== modified file 'src/window.c'
--- src/window.c	2012-07-10 16:53:26 +0000
+++ src/window.c	2012-07-15 14:43:28 +0000
@@ -2387,7 +2387,7 @@
   Lisp_Object window, windows, best_window, frame_arg;
   int frame_best_window_flag = 0;
   struct frame *f;
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   /* If we're only looping through windows on a particular frame,
      frame points to that frame.  If we're looping through windows

=== modified file 'src/xdisp.c'
--- src/xdisp.c	2012-07-13 10:11:37 +0000
+++ src/xdisp.c	2012-07-15 14:43:28 +0000
@@ -2421,10 +2421,10 @@
   else
     {
       ptrdiff_t count = SPECPDL_INDEX ();
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       GCPRO1 (args[0]);
-      gcpro1.nvars = nargs;
+      IF_GCPRO (gcpro1.nvars = nargs);
       specbind (Qinhibit_redisplay, Qt);
       /* Use Qt to ensure debugger does not run,
 	 so there is no possibility of wanting to redisplay.  */
@@ -3588,7 +3588,7 @@
       else
 	{
 	  Lisp_Object fns, fn;
-	  struct gcpro gcpro1, gcpro2;
+	  DEFGCPRO2;
 
 	  fns = Qnil;
 	  GCPRO2 (val, fns);
@@ -4558,7 +4558,7 @@
   if (!NILP (form) && !EQ (form, Qt))
     {
       ptrdiff_t count = SPECPDL_INDEX ();
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       /* Bind `object' to the object having the `display' property, a
 	 buffer or string.  Bind `position' to the position in the
@@ -9242,7 +9242,7 @@
   Lisp_Object msg, fmt;
   char *buffer;
   ptrdiff_t len;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   USE_SAFE_ALLOCA;
 
   /* Do nothing if called asynchronously.  Inserting text into
@@ -9305,7 +9305,7 @@
       ptrdiff_t point_at_end = 0;
       ptrdiff_t zv_at_end = 0;
       Lisp_Object old_deactivate_mark, tem;
-      struct gcpro gcpro1;
+      DEFGCPRO1;
 
       old_deactivate_mark = Vdeactivate_mark;
       oldbuf = current_buffer;
@@ -9577,7 +9577,7 @@
 void
 message3 (Lisp_Object m, ptrdiff_t nbytes, int multibyte)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (m);
   clear_message (1,1);
@@ -9729,12 +9729,12 @@
       if (FRAME_MESSAGE_BUF (f))
 	{
 	  Lisp_Object args[2], msg;
-	  struct gcpro gcpro1, gcpro2;
+	  DEFGCPRO2;
 
 	  args[0] = build_string (m);
 	  args[1] = msg = string;
 	  GCPRO2 (args[0], msg);
-	  gcpro1.nvars = 2;
+	  IF_GCPRO (gcpro1.nvars = 2);
 
 	  msg = Fformat (2, args);
 
@@ -11085,7 +11085,7 @@
 prepare_menu_bars (void)
 {
   int all_windows;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   struct frame *f;
   Lisp_Object tooltip_frame;
 
@@ -11439,7 +11439,7 @@
 	  ptrdiff_t count = SPECPDL_INDEX ();
 	  Lisp_Object frame, new_tool_bar;
           int new_n_tool_bar;
-	  struct gcpro gcpro1;
+	  DEFGCPRO1;
 
 	  /* Set current_buffer to the buffer of the selected
 	     window of the frame, so that we get the right local
@@ -11502,7 +11502,7 @@
 build_desired_tool_bar_string (struct frame *f)
 {
   int i, size, size_needed;
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   Lisp_Object image, plist, props;
 
   image = plist = props = Qnil;

=== modified file 'src/xfaces.c'
--- src/xfaces.c	2012-07-10 08:43:46 +0000
+++ src/xfaces.c	2012-07-15 14:43:28 +0000
@@ -2356,7 +2356,7 @@
 			      face_name, NAMED_MERGE_POINT_NORMAL,
 			      &named_merge_points))
     {
-      struct gcpro gcpro1;
+      DEFGCPRO1;
       Lisp_Object from[LFACE_VECTOR_SIZE];
       int ok = get_lface_attributes (f, face_name, from, 0, named_merge_points);
 

=== modified file 'src/xfns.c'
--- src/xfns.c	2012-07-11 04:31:53 +0000
+++ src/xfns.c	2012-07-15 14:43:28 +0000
@@ -1511,7 +1511,7 @@
 	Lisp_Object coding_system;
 	Lisp_Object encoded_name;
 	Lisp_Object encoded_icon_name;
-	struct gcpro gcpro1;
+	DEFGCPRO1;
 
 	/* As ENCODE_UTF_8 may cause GC and relocation of string data,
 	   we use it before x_encode_text that may return string data.  */
@@ -3059,7 +3059,7 @@
   long window_prompting = 0;
   int width, height;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   Lisp_Object display;
   struct x_display_info *dpyinfo = NULL;
   Lisp_Object parent;
@@ -3150,7 +3150,7 @@
      to get the color reference counts right, so initialize them!  */
   {
     Lisp_Object black;
-    struct gcpro gcpro1;
+    DEFGCPRO1;
 
     /* Function x_decode_color can signal an error.  Make
        sure to initialize color slots so that we won't try
@@ -4314,7 +4314,7 @@
   int actual_format;
   unsigned long actual_size, bytes_remaining;
   Window target_window = FRAME_X_WINDOW (f);
-  struct gcpro gcpro1;
+  DEFGCPRO1;
 
   GCPRO1 (prop_value);
   CHECK_STRING (prop);
@@ -4567,7 +4567,7 @@
   Lisp_Object name;
   int width, height;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3;
+  DEFGCPRO3;
   int face_change_count_before = face_change_count;
   Lisp_Object buffer;
   struct buffer *old_buffer;
@@ -4630,7 +4630,7 @@
      to get the color reference counts right, so initialize them!  */
   {
     Lisp_Object black;
-    struct gcpro gcpro1;
+    DEFGCPRO1;
 
     /* Function x_decode_color can signal an error.  Make
        sure to initialize color slots so that we won't try
@@ -4960,7 +4960,7 @@
   struct buffer *old_buffer;
   struct text_pos pos;
   int i, width, height, seen_reversed_p;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+  DEFGCPRO4;
   int old_windows_or_buffers_changed = windows_or_buffers_changed;
   ptrdiff_t count = SPECPDL_INDEX ();
 
@@ -5221,7 +5221,7 @@
 {
   ptrdiff_t count;
   Lisp_Object deleted, frame, timer;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
 
   /* Return quickly if nothing to do.  */
   if (NILP (tip_timer) && NILP (tip_frame))
@@ -5362,7 +5362,7 @@
   int ac = 0;
   XmString dir_xmstring, pattern_xmstring;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
 
   check_x ();
 
@@ -5531,7 +5531,7 @@
   Lisp_Object file = Qnil;
   Lisp_Object decoded_file;
   ptrdiff_t count = SPECPDL_INDEX ();
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
+  DEFGCPRO6;
   char *cdef_file;
 
   check_x ();
@@ -5592,7 +5592,7 @@
   Lisp_Object font;
   Lisp_Object font_param;
   char *default_name = NULL;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   ptrdiff_t count = SPECPDL_INDEX ();
 
   check_x ();

=== modified file 'src/xselect.c'
--- src/xselect.c	2012-07-05 18:35:48 +0000
+++ src/xselect.c	2012-07-15 14:43:28 +0000
@@ -774,7 +774,7 @@
 static void
 x_handle_selection_request (struct input_event *event)
 {
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   Time local_selection_time;
 
   Display *display = SELECTION_EVENT_DISPLAY (event);
@@ -892,7 +892,7 @@
 		     Lisp_Object target_symbol, Atom property,
 		     int for_multiple, struct x_display_info *dpyinfo)
 {
-  struct gcpro gcpro1;
+  DEFGCPRO1;
   Lisp_Object lisp_selection;
   struct selection_data *cs;
   GCPRO1 (lisp_selection);
@@ -2028,7 +2028,7 @@
    Lisp_Object time_stamp, Lisp_Object terminal)
 {
   Lisp_Object val = Qnil;
-  struct gcpro gcpro1, gcpro2;
+  DEFGCPRO2;
   struct frame *f = frame_for_x_selection (terminal);
   GCPRO2 (target_type, val); /* we store newly consed data into these */
 

=== modified file 'src/xterm.c'
--- src/xterm.c	2012-07-10 23:24:36 +0000
+++ src/xterm.c	2012-07-15 14:43:28 +0000
@@ -10126,7 +10126,7 @@
 
 	    /* Protect terminal from GC before removing it from the
 	       list of terminals.  */
-	    struct gcpro gcpro1;
+	    DEFGCPRO1;
 	    Lisp_Object gcpro_term;
 	    XSETTERMINAL (gcpro_term, terminal);
 	    GCPRO1 (gcpro_term);


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
  2012-07-15 17:34 [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS Dmitry Antipov
@ 2012-07-16  6:41 ` Paul Eggert
  2012-07-16 12:42   ` Michael Welsh Duggan
  2012-07-17  7:20 ` Stefan Monnier
  1 sibling, 1 reply; 6+ messages in thread
From: Paul Eggert @ 2012-07-16  6:41 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: Emacs development discussions

Could you please explain the point of the patch?
Is it to simplify debugging, or improve performance, or what?
I don't see the advantage over the current approach.

> +#define DEFGCPRO1 void *__dummy ATTRIBUTE_UNUSED = &__dummy

This would be cleaner if DEFGCPRO1 etc were either empty,
or expanded to something that ended in ";".  Then the caller
can just do "DEFGCPRO1" (without the semicolon) and there's
no need for dummy declarations.

> +#define IF_GCPRO(code) do { } while (0)
...
> +#define IF_GCPRO(code) do { code; } while (0)

IF_GCPRO should act more like a function, i.e., its argument
should be an expression and it should expand to an expression.
This is more consistent with how typical macro-like functions work.
The above should be:

  #define IF_GCPRO(expr) ((void) 0)
  ...
  #define IF_GCPRO(expr) (expr, (void) 0)

and calls like this:

  IF_GCPRO (gcpro3.nvars = nargs; gcpro4.nvars = nargs);

should be replaced by:

  IF_GCPRO ((gcpro3.nvars = nargs, gcpro4.nvars = nargs));



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
  2012-07-16  6:41 ` Paul Eggert
@ 2012-07-16 12:42   ` Michael Welsh Duggan
  2012-07-16 13:39     ` Jan Djärv
  2012-07-16 14:14     ` Paul Eggert
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Welsh Duggan @ 2012-07-16 12:42 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Dmitry Antipov, Emacs development discussions

Paul Eggert <eggert@cs.ucla.edu> writes:

>> +#define DEFGCPRO1 void *__dummy ATTRIBUTE_UNUSED = &__dummy
>
> This would be cleaner if DEFGCPRO1 etc were either empty,
> or expanded to something that ended in ";".  Then the caller
> can just do "DEFGCPRO1" (without the semicolon) and there's
> no need for dummy declarations.

This I do not understand.  Macros without the semicolons make cc-mode
have to work much, much harder to determine the current level of
indentation.  I also find it offputting to see something that looks like
a statement that does not terminate with a semicolon.

-- 
Michael Welsh Duggan
(md5i@md5i.com)



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
  2012-07-16 12:42   ` Michael Welsh Duggan
@ 2012-07-16 13:39     ` Jan Djärv
  2012-07-16 14:14     ` Paul Eggert
  1 sibling, 0 replies; 6+ messages in thread
From: Jan Djärv @ 2012-07-16 13:39 UTC (permalink / raw)
  To: Michael Welsh Duggan
  Cc: Paul Eggert, Dmitry Antipov, Emacs development discussions


16 jul 2012 kl. 14:42 skrev Michael Welsh Duggan:

> Paul Eggert <eggert@cs.ucla.edu> writes:
> 
>>> +#define DEFGCPRO1 void *__dummy ATTRIBUTE_UNUSED = &__dummy
>> 
>> This would be cleaner if DEFGCPRO1 etc were either empty,
>> or expanded to something that ended in ";".  Then the caller
>> can just do "DEFGCPRO1" (without the semicolon) and there's
>> no need for dummy declarations.
> 
> This I do not understand.  Macros without the semicolons make cc-mode
> have to work much, much harder to determine the current level of
> indentation.  I also find it offputting to see something that looks like
> a statement that does not terminate with a semicolon.
> 

+1.  Actually cc-mode just fails to get indentation level right after such a macro.  If on the other hand we would allow declarations after statements, a lone semicolon would not matter.

	Jan D.





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
  2012-07-16 12:42   ` Michael Welsh Duggan
  2012-07-16 13:39     ` Jan Djärv
@ 2012-07-16 14:14     ` Paul Eggert
  1 sibling, 0 replies; 6+ messages in thread
From: Paul Eggert @ 2012-07-16 14:14 UTC (permalink / raw)
  To: Michael Welsh Duggan; +Cc: Dmitry Antipov, Emacs development discussions

On 07/16/2012 05:42 AM, Michael Welsh Duggan wrote:
> Macros without the semicolons make cc-mode
> have to work much

True.  But surely there is a better way to solve this problem.
As things stand, the patch proposes a macro that
declares a dummy variable that's unused, primarily in order
to avoid declaring some other variable that's unused.  Why
is this a win?  After all, we have an unused variable either way.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS
  2012-07-15 17:34 [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS Dmitry Antipov
  2012-07-16  6:41 ` Paul Eggert
@ 2012-07-17  7:20 ` Stefan Monnier
  1 sibling, 0 replies; 6+ messages in thread
From: Stefan Monnier @ 2012-07-17  7:20 UTC (permalink / raw)
  To: Dmitry Antipov; +Cc: Emacs development discussions

> This patch moves all GCPRO stuff out of compilation if GC_MARK_STACK
> == GC_MAKE_GCPROS_NOOPS.

I don't think it's terribly important to do that.
Unused variables are largely harmless.  Getting rid of unused structure
fields is OK, so feel free to commit this part of the patch.

I'm not completely averse to replacing those "struct gcpro gcpro1,
gcpro2, ..." with some kind of macro (tho I'd make it take an argument,
much like EXFUN), but then I'd like to find some way to make them expand
to something more empty than "*__dummy ATTRIBUTE_UNUSED = &__dummy".
This said, I don't like the suggestion to include the semi-colon in the
DEFGCPRO macros, so I'm not sure how else to do it, without bumping into
the "declarations after statements".


        Stefan



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-07-17  7:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-15 17:34 [RFC] Omit all GCPRO stuff if GC_MAKE_GCPROS_NOOPS Dmitry Antipov
2012-07-16  6:41 ` Paul Eggert
2012-07-16 12:42   ` Michael Welsh Duggan
2012-07-16 13:39     ` Jan Djärv
2012-07-16 14:14     ` Paul Eggert
2012-07-17  7:20 ` Stefan Monnier

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).