;;; This file is part of GNU epsilon, a functional language implementation

;;; Copyright (C) 2003 Luca Saiu

;;; GNU epsilon is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published
;;; by the Free Software Foundation; either version 2, or (at your
;;; option) any later version.

;;; GNU epsilon is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; General Public License for more details.

;;; You should have received a copy of the GNU General Public License
;;; along with epsilon; see the file COPYING.  If not, write to the
;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;;; Boston, MA 02111-1307, USA.


;;; Code for the s_cll instruction

(let* (;;; The environment without the s-link
       (nearly-environment (do ((built-environment (make-vector (1+ integer-parameter-1)))
				(i integer-parameter-1 (1- i)))
			       ((= i 0) built-environment)
			     (vector-set! built-environment i (pop-stack))))
       (closure (pop-stack))
       (new-environment (begin
			  (vector-set! nearly-environment 0 (vector-ref closure 1))
			  nearly-environment)))
  (enlarge-stack (+ stack-pointer instructions-number))
  (push-stack frame-pointer) ; saved frame-pointer
  (set! frame-pointer stack-pointer) ; the new frame begins here
  (push-stack environment) ; saved environment
  (push-stack (1+ instruction-pointer)) ; saved instruction-pointer
  (set! environment new-environment)

;(display environment)(newline)

  ;; The returned value:
  (vector-ref closure 0))
