--- rpl/src/evaluation.c 2012/09/29 17:53:02 1.57 +++ rpl/src/evaluation.c 2012/10/04 15:21:25 1.60 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 + RPL/2 (R) version 4.1.11 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -585,6 +585,18 @@ evaluation(struct_processus *s_etat_proc } else if (((*s_objet).type == RPN) || ((*s_objet).type == ALG)) { + // Ajout d'un bouchon à la liste des variables statiques pour + // savoir quelles sont les variables statiques qui ont été créées + // par l'évaluation de l'expression et qui sont susceptibles + // de devoir être éliminées. + + if (ajout_bouchon_variable_statique(s_etat_processus) == d_erreur) + { + (*s_etat_processus).instruction_courante = instruction_courante; + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + l_element_courant = (struct_liste_chainee *) (*s_objet).objet; l_element_egalite = NULL; presence_egalite = d_faux; @@ -956,6 +968,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1057,9 +1070,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1143,9 +1159,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -1332,6 +1347,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1420,9 +1436,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1506,9 +1525,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -1706,6 +1724,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1802,9 +1821,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1888,9 +1910,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -3937,6 +3958,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4038,9 +4060,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4124,9 +4149,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -4354,6 +4378,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4442,9 +4467,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4528,9 +4556,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -4724,6 +4751,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4812,9 +4840,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4898,9 +4929,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -5178,6 +5208,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -5279,9 +5310,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -5365,9 +5399,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -5595,6 +5628,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -5683,9 +5717,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -5769,9 +5806,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -5965,6 +6001,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -6053,9 +6090,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -6139,9 +6179,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -7143,8 +7182,17 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).niveau_courant = niveau_initial; - if (retrait_variable_par_niveau(s_etat_processus) == d_erreur) + if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; return(d_erreur); } } @@ -7153,28 +7201,18 @@ evaluation(struct_processus *s_etat_proc * Retrait des variables statiques créées dans l'expression */ - for(n = 0; n < (*s_etat_processus).nombre_variables_statiques; n++) + if (retrait_variables_statiques(s_etat_processus) == d_erreur) { - if ((*s_etat_processus).s_liste_variables_statiques[n] - .niveau > (*s_etat_processus).niveau_courant) + if (presence_egalite == d_vrai) { - if (retrait_variable_statique(s_etat_processus, - (*s_etat_processus).s_liste_variables_statiques[n].nom, - (*s_etat_processus).s_liste_variables_statiques[n] - .variable_statique) == d_erreur) - { - if (presence_egalite == d_vrai) - { - liberation(s_etat_processus, s_objet_evalue); - } - - (*s_etat_processus).instruction_courante = - instruction_courante; - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - return(d_erreur); - } + liberation(s_etat_processus, s_objet_evalue); } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; + return(d_erreur); } /*