--- rpl/src/gestion_pile_last.c 2014/04/25 07:37:29 1.47 +++ rpl/src/gestion_pile_last.c 2014/05/14 08:02:56 1.48 @@ -49,8 +49,8 @@ empilement_pile_last(struct_processus *s 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);