changeset 48150:2b5f7e1254d1

(Fcall_interactively): New local filter_specs. (Fcall_interactively): Check for progn as well as let. Add a gcpro. (Qprogn): New variable. (syms_of_callint): Staticpro and init Qprogn.
author Richard M. Stallman <rms@gnu.org>
date Tue, 05 Nov 2002 05:15:47 +0000
parents 8f11dde95c66
children fd02c9c4a941
files src/callint.c
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/callint.c	Mon Nov 04 19:16:29 2002 +0000
+++ b/src/callint.c	Tue Nov 05 05:15:47 2002 +0000
@@ -51,7 +51,7 @@
 
 Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
 
-Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion;
+Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn;
 static Lisp_Object preserved_fns;
 
 /* Marker used within call-interactively to refer to point.  */
@@ -196,6 +196,7 @@
   Lisp_Object fun;
   Lisp_Object funcar;
   Lisp_Object specs;
+  Lisp_Object filter_specs;
   Lisp_Object teml;
   Lisp_Object enable;
   int speccount = SPECPDL_INDEX ();
@@ -243,6 +244,10 @@
 
   specs = Qnil;
   string = 0;
+  /* The idea of FILTER_SPECS is to provide away to
+     specify how to represent the arguments in command history.
+     The feature is not fully implemented.  */
+  filter_specs = Qnil;
 
   /* Decode the kind of function.  Either handle it and return,
      or go to `lose' if not interactive, or go to `retry'
@@ -278,6 +283,7 @@
       specs = Fassq (Qinteractive, Fcdr (XCDR (fun)));
       if (NILP (specs))
 	goto lose;
+      filter_specs = Fnth (make_number (1), specs);
       specs = Fcar (Fcdr (specs));
     }
   else
@@ -298,7 +304,9 @@
       i = num_input_events;
       input = specs;
       /* Compute the arg values using the user's expression.  */
+      GCPRO2 (input, filter_specs);
       specs = Feval (specs);
+      UNGCPRO;
       if (i != num_input_events || !NILP (record_flag))
 	{
 	  /* We should record this command on the command history.  */
@@ -315,7 +323,8 @@
 	      car = XCAR (input);
 	      /* Skip through certain special forms.  */
 	      while (EQ (car, Qlet) || EQ (car, Qletx)
-		     || EQ (car, Qsave_excursion))
+		     || EQ (car, Qsave_excursion)
+		     || EQ (car, Qprogn))
 		{
 		  while (CONSP (XCDR (input)))
 		    input = XCDR (input);
@@ -836,6 +845,8 @@
   staticpro (&Qletx);
   Qsave_excursion = intern ("save-excursion");
   staticpro (&Qsave_excursion);
+  Qprogn = intern ("progn");
+  staticpro (&Qprogn);
 
   Qminus = intern ("-");
   staticpro (&Qminus);