[net.sources] XLISP 1.2+ Initialization Bug

jfw@mit-eddie.UUCP (John Woods) (09/22/84)

There is a bug in XLISP's initialization code, which caused the value of a
subr to become smashed (it turns out that I did not find this until I added
a couple of new functions).  What happens is:  xlsubr creates a new subr object
and then calls xlputprop.  xlputprop creates some new list elements, but if
it just happens to need a gc(), xlsubr forgot to save away it's subr on the
lisp stack (and xlputprop assumes that it's inputs were protected by eval()).
The fix:  Replace, in xlsubr.c, these functions with this new code:


		    /***************************************
		    *  xlsubr - define a builtin function  *
		    ***************************************/

xlsubr(sname,subr)
  char *sname; struct node *(*subr)();
{
    struct node *sym, newsubr;
    struct node *oldstk = xlsave(&newsubr,NULL);

    sym = xlenter(sname);              /* Enter the symbol */

    (newsubr.n_ptr = newnode(SUBR))->n_subr = subr;
    xlputprop(sym,newsubr.n_ptr,Subrprop);
    xlstack = oldstk;
}

		    /*********************************************
		    *  xlfsubr - define a builtin funny function *
		    **********************************************/

xlfsubr(sname,fsubr)
  char *sname; struct node *(*fsubr)();
{
    struct node *sym, newsubr;
    struct node *oldstk = xlsave(&newsubr,NULL);

    sym = xlenter(sname);              /* Enter the symbol */

    (newsubr.n_ptr = newnode(FSUBR))->n_subr = fsubr;
    xlputprop(sym,newsubr.n_ptr,Fsubrprop);
    xlstack = oldstk;
}

-- 
John Woods, Charles River Data Systems
decvax!frog!john, mit-eddie!jfw, JFW@MIT-XX

" `The Ego posits itself'...Rubbish!"	-M.P.