--- rpl/src/evaluation.c 2010/04/20 12:49:18 1.12 +++ rpl/src/evaluation.c 2010/05/19 09:22:33 1.16 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.14 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -829,8 +829,9 @@ evaluation(struct_processus *s_etat_proc free(message); - while((*(*s_etat_processus).l_base_pile_systeme) - .clause != 'R') + drapeau_then = d_faux; + + while(drapeau_then == d_faux) { l_registre_atome = l_element_courant; l_element_courant = @@ -992,66 +993,28 @@ evaluation(struct_processus *s_etat_proc } } } + else if (TEST(instruction_then)) + { + if ((*(*s_etat_processus) + .l_base_pile_systeme) + .clause == 'R') + { + (*(*s_etat_processus) + .l_base_pile_systeme) + .clause = 'X'; + instruction_then( + s_etat_processus); + drapeau_then = d_vrai; + } + } } } } + (*s_etat_processus).expression_courante = + l_element_courant; (*s_etat_processus).instruction_courante = instruction_courante; - drapeau_then = d_faux; - - do - { - l_registre_atome = l_element_courant; - - if (l_element_courant == NULL) - { - /* - * La fin de l'expression est atteinte, - * le sequenceur reprend la main. - */ - - if (presence_egalite == d_vrai) - { - liberation(s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .mode_execution_programme = - registre_mode_execution_programme; - (*s_etat_processus).instruction_courante = - instruction_courante; - return(d_absence_erreur); - } - - if ((*(*l_element_courant).donnee).type == FCT) - { - (*s_etat_processus) - .instruction_courante = - (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).nom_fonction; - fonction = (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).fonction; - (*s_etat_processus).instruction_courante = - instruction_courante; - - drapeau_then = TEST(instruction_then) - ? d_vrai : d_faux; - } - - l_element_courant = (*l_element_courant) - .suivant; - } while(drapeau_then == d_faux); - - (*s_etat_processus).expression_courante = - l_registre_atome; - - (*(*s_etat_processus).l_base_pile_systeme) - .clause = 'X'; - instruction_then(s_etat_processus); (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; @@ -1305,6 +1268,14 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + if ((*(*s_etat_processus) + .l_base_pile_systeme) + .retour_definition + == 'Y') + { + break; + } } else { @@ -4816,6 +4787,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition; @@ -4846,6 +4818,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition;