;;; 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_ret instruction

(let ((top (pop-stack))
      (saved-frame-pointer (vector-ref stack frame-pointer))
      (saved-environment (vector-ref stack (1+ frame-pointer)))
      (saved-instruction-pointer (vector-ref stack (+ frame-pointer 2))))  
  (clear-stack (1+ frame-pointer) stack-pointer) ; overwrite old frame
  (set! environment saved-environment)
  (set! stack-pointer frame-pointer)
  (set! frame-pointer saved-frame-pointer)
  (vector-set! stack stack-pointer top) ;; top must still be on top
  
  ;; The value to return
  saved-instruction-pointer)
