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

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