[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: stack consing



    Date: Mon, 27 Jun 88 13:58 PDT
    From: Siskind.pa@Xerox.COM

    Though it is not 100% apparent from the documentation, I seem to infer that
    WITH-STACK-LIST allocates storage on the control stack, while MAKE-STACK-ARRAY,
    WITH-STACK-ARRAY, and WITH-DATA-STACK allocate storage on the data stack.
    Is that correct? 

Yes, although we reserve the right to change this in future machine offerings.

		     In my naievite I further infer that function calling and returning
    only uses the control stack and not the data stack so that the allocation
    and freeing of storage on the data stack can be independent and thus cross
    function calling boundaries. Is this correct?  

No.  Actually it's correct a lot of the time, but is incorrect in circumstances
that are too much trouble to explain.

In general, you should use only the documented interfaces and not listen to me,
unless you don't care whether your program continues to run in future releases
and don't care whether your program ports to future machine offerings.

						   If so is the following code
    correct?

I didn't try running the code.  This technique will work a lot of the time,
however cross-function-call stack allocation isn't guaranteed.

    (defun foo (x)
     (WITH-DATA-STACK
      (a-function-which-examines-but-does-not-retain-a-pointer-to-its-argument
       (reverse-on-data-stack x))))

    (defun reverse-on-data-stack (x)
     (if (null x)
	 x
	 (append1-on-data-stack (reverse-on-data-stack (fake-cdr x)) (fake-car x))))

    (defun append1-on-data-stack (x e)
     (if (null x)
	 (fake-cons e nil)
	 (fake-cons (fake-car x) (append1-on-data-stack (fake-cdr x) e))))

    (defun fake-cons (x y)
     (let ((z MAKE-STACK-ARRAY 2))
      (setf (aref z 0) x)
      (setf (aref z 1) y)
      z))

    (defun fake-car (x)
     (aref x 0))

    (defun fake-cdr (x)
     (aref x 1))

    The idea is that one function creates a data stack frame and then calls other functions
    which allocate storage. Will this work?

Often.  Not always.