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

;;; Set exception type and exception value, so that they are available to the
;;; handler:
(set! exception-type exception-parameter-1)
(set! exception-value (top-stack))

;;; Clear the popped part of the stack:
(clear-stack (1+ (vector-ref (car exceptions-stack)
                             2)) ; the saved stack-pointer, incremented
             stack-pointer)

;;; Update FP, SP and environment:
(set! frame-pointer
      (vector-ref (car exceptions-stack)
		  1)) ; saved frame-pointer
(set! stack-pointer
      (vector-ref (car exceptions-stack)
		  2)) ; saved stack-pointer
(set! environment
      (vector-ref (car exceptions-stack)
		  3)) ; saved environment

;;; Jump to the handler:
(vector-ref (car exceptions-stack)
	    0) ; saved instruction-pointer to handler
