[comp.sources.bugs] Patch for Elk 1.2

net@opal.cs.tu-berlin.de (Oliver Laumann) (11/14/90)

The following patch fixes two bugs in the implementation of the
fluid-let special form in Elk 1.2.  You can apply the patch by
invoking "patch -p patchfile" in the top level directory of the
Elk distribution.

--
    Oliver Laumann, Technical University of Berlin, Germany.
    pyramid!tub!net   net@TUB.BITNET   net@tub.cs.tu-berlin.de



*** /tmp/,RCSt1010213	Mon Nov 12 11:28:07 1990
--- src/cont.c	Mon Nov 12 11:26:56 1990
***************
*** 168,174
  }
  
  Do_Wind (w) Object w; {
!     Object b, sym, val;
  
      if (TYPE(w) == T_Pair) {
  	b = Lookup_Symbol (Car (w), 0);

--- 168,174 -----
  }
  
  Do_Wind (w) Object w; {
!     Object oldenv, b, tmp;
  
      if (TYPE(w) == T_Vector) {          /* fluid-let */
  	oldenv = The_Environment;
***************
*** 170,177
  Do_Wind (w) Object w; {
      Object b, sym, val;
  
!     if (TYPE(w) == T_Pair) {
! 	b = Lookup_Symbol (Car (w), 0);
  	if (Nullp (b))
  	    Panic ("fluid-let2");
  	sym = Car (b);

--- 170,179 -----
  Do_Wind (w) Object w; {
      Object oldenv, b, tmp;
  
!     if (TYPE(w) == T_Vector) {          /* fluid-let */
! 	oldenv = The_Environment;
! 	Switch_Environment (VECTOR(w)->data[1]);
! 	b = Lookup_Symbol (VECTOR(w)->data[0]);
  	if (Nullp (b))
  	    Panic ("fluid-let");
  	tmp = VECTOR(w)->data[2];
***************
*** 173,184
      if (TYPE(w) == T_Pair) {
  	b = Lookup_Symbol (Car (w), 0);
  	if (Nullp (b))
! 	    Panic ("fluid-let2");
! 	sym = Car (b);
! 	val = Cdr (w);
! 	Cdr (b) = val;
! 	SYMBOL(sym)->value = val;
!     } else {
  	(void)Funcall (w, Null, 0);
      }
  }

--- 175,188 -----
  	Switch_Environment (VECTOR(w)->data[1]);
  	b = Lookup_Symbol (VECTOR(w)->data[0]);
  	if (Nullp (b))
! 	    Panic ("fluid-let");
! 	tmp = VECTOR(w)->data[2];
! 	VECTOR(w)->data[2] = Cdr (b);
! 	Cdr (b) = tmp;
! 	SYMBOL(Car (b))->value = tmp;
! 	VECTOR(w)->data[1] = oldenv;
! 	Switch_Environment (oldenv);
!     } else {                            /* dynamic-wind */
  	(void)Funcall (w, Null, 0);
      }
  }
*** /tmp/,RCSt1010234	Mon Nov 12 11:28:27 1990
--- src/special.c	Mon Nov 12 11:27:11 1990
***************
*** 454,461
  	b = Lookup_Symbol (sym, 1);
  	Alloca (w, WIND*, sizeof (WIND));
  	{
! 	    Object in, out;
! 	    GC_Node2;
  
  	    in = out = Null;
  	    GC_Link2 (in, out);

--- 454,460 -----
  	b = Lookup_Symbol (sym, 1);
  	Alloca (w, WIND*, sizeof (WIND));
  	{
! 	    Object vec;
  
  	    vec = Make_Vector (3, Null);
  	    VECTOR(vec)->data[0] = sym;
***************
*** 457,468
  	    Object in, out;
  	    GC_Node2;
  
! 	    in = out = Null;
! 	    GC_Link2 (in, out);
! 	    in = Cons (sym, val);
! 	    out = Cons (sym, Cdr (b));
! 	    Add_Wind (w, in, out);
! 	    GC_Unlink;
  	}
  	Cdr (b) = val;
  	SYMBOL(sym)->value = val;

--- 456,466 -----
  	{
  	    Object vec;
  
! 	    vec = Make_Vector (3, Null);
! 	    VECTOR(vec)->data[0] = sym;
! 	    VECTOR(vec)->data[1] = The_Environment;
! 	    VECTOR(vec)->data[2] = Cdr (b);
! 	    Add_Wind (w, vec, vec);
  	}
  	Cdr (b) = val;
  	SYMBOL(sym)->value = val;
***************
*** 468,482
  	SYMBOL(sym)->value = val;
      }
      ret = Begin (Cdr (argl));
!     for (w = Last_Wind; w != last; w = w->prev) {
! 	b = Cdr (w->inout);
! 	sym = Car (b); val = Cdr (b);
! 	b = Lookup_Symbol (sym, 0);
! 	if (Nullp (b))
! 	    Panic ("fluid-let1");
! 	Cdr (b) = val;
! 	SYMBOL(sym)->value = val;
!     }
      if (Last_Wind = last)
  	last->next = 0;
      First_Wind = first;

--- 466,473 -----
  	SYMBOL(sym)->value = val;
      }
      ret = Begin (Cdr (argl));
!     for (w = Last_Wind; w != last; w = w->prev)
! 	Do_Wind (Car (w->inout));
      if (Last_Wind = last)
  	last->next = 0;
      First_Wind = first;