--- rpl/src/gestion_pile_last.c 2011/07/25 07:44:54 1.26 +++ rpl/src/gestion_pile_last.c 2019/02/03 14:40:33 1.64 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.2 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -37,7 +37,7 @@ logical1 empilement_pile_last(struct_processus *s_etat_processus, - unsigned long nombre_arguments) + integer8 nombre_arguments) { struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_suivant; @@ -46,11 +46,11 @@ empilement_pile_last(struct_processus *s logical1 erreur; - unsigned long i; + integer8 i; erreur = d_absence_erreur; - l_element_courant = (*s_etat_processus).l_base_pile_last; + while(l_element_courant != NULL) { liberation(s_etat_processus, (*l_element_courant).donnee); @@ -100,6 +100,30 @@ empilement_pile_last(struct_processus *s */ (*s_etat_processus).erreur_execution = d_ex_manque_argument; + + /* + * En cas de nombre d'arguments insuffisant, cette routine + * déclenche une erreur. Si la pile LAST est active, la récupération + * de l'erreur force la copie de la pile LAST dans la pile + * opérationnelle courante. Dans notre cas, les arguments n'ont pas + * encore été consommés pas la routine appelante et il convient + * d'éliminer les arguments de la pile opérationnelle avant de retourner + * à la routine appelante. + */ + + l_element_courant = (*s_etat_processus).l_base_pile; + + for(; i > 0; i--) + { + if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), + &s_objet) == d_erreur) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return(erreur); + } + + liberation(s_etat_processus, s_objet); + } } return(erreur);