/* 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_pshl instruction: */

integer_t i;
word_t* new_environment;

/* Create a new environment s-linked to the current one: */
ASSIGN_MY_MALLOC(new_environment, ((integer_t)PARAMETER_1) + 1);
new_environment[0] = environment;

/* If PARAMETER_1 is not 0 then 
     * fill the new environment with the topmost
       PARAMETER_1 stack elements (including top)
     * update top and undertop_stack_pointer popping stack arguments
   else 
     do nothing: */
if((integer_t)PARAMETER_1 > (integer_t)0){
  word_t* stack_element =
    &(stack[undertop_stack_pointer - (integer_t)PARAMETER_1 + (integer_t)2]);

  for(i = 1; i < (integer_t)PARAMETER_1; i++)
    new_environment[i] = *(stack_element++);
  new_environment[(integer_t)PARAMETER_1] = top;

  undertop_stack_pointer -= (integer_t)PARAMETER_1;
  top = stack[undertop_stack_pointer + (integer_t)1];
}

/* Make the new environment the current one: */
environment = new_environment;
