* eval.c (run_hook_with_args): Handle the case where the global
authorChong Yidong <cyd@stupidchicken.com>
Fri, 1 Jan 2010 17:14:05 +0000 (12:14 -0500)
committerChong Yidong <cyd@stupidchicken.com>
Fri, 1 Jan 2010 17:14:05 +0000 (12:14 -0500)
value has the obsolete single-function form (Bug#5026).

src/ChangeLog
src/eval.c

index 92f4fe4..d644767 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-01  Chong Yidong  <cyd@stupidchicken.com>
+
+       * eval.c (run_hook_with_args): Handle the case where the global
+       value has the obsolete single-function form (Bug#5026).
+
 2009-12-27  Chong Yidong  <cyd@stupidchicken.com>
 
        * minibuf.c (Fall_completions): Minor optimization.
index 1c97500..0198fb7 100644 (file)
@@ -2620,7 +2620,6 @@ run_hook_with_args (nargs, args, cond)
      enum run_hooks_condition cond;
 {
   Lisp_Object sym, val, ret;
-  Lisp_Object globals;
   struct gcpro gcpro1, gcpro2, gcpro3;
 
   /* If we are dying or still initializing,
@@ -2641,7 +2640,7 @@ run_hook_with_args (nargs, args, cond)
     }
   else
     {
-      globals = Qnil;
+      Lisp_Object globals = Qnil;
       GCPRO3 (sym, val, globals);
 
       for (;
@@ -2654,18 +2653,28 @@ run_hook_with_args (nargs, args, cond)
            {
              /* t indicates this hook has a local binding;
                 it means to run the global binding too.  */
+             globals = Fdefault_value (sym);
+             if (NILP (globals)) continue;
 
-             for (globals = Fdefault_value (sym);
-                  CONSP (globals) && ((cond == to_completion)
-                                      || (cond == until_success ? NILP (ret)
-                                          : !NILP (ret)));
-                  globals = XCDR (globals))
+             if (!CONSP (globals) || EQ (XCAR (globals), Qlambda))
+               {
+                 args[0] = globals;
+                 ret = Ffuncall (nargs, args);
+               }
+             else
                {
-                 args[0] = XCAR (globals);
-                 /* In a global value, t should not occur.  If it does, we
-                    must ignore it to avoid an endless loop.  */
-                 if (!EQ (args[0], Qt))
-                   ret = Ffuncall (nargs, args);
+                 for (;
+                      CONSP (globals) && ((cond == to_completion)
+                                          || (cond == until_success ? NILP (ret)
+                                              : !NILP (ret)));
+                      globals = XCDR (globals))
+                   {
+                     args[0] = XCAR (globals);
+                     /* In a global value, t should not occur.  If it does, we
+                        must ignore it to avoid an endless loop.  */
+                     if (!EQ (args[0], Qt))
+                       ret = Ffuncall (nargs, args);
+                   }
                }
            }
          else