--- rpl/src/evaluation.c 2012/09/15 12:57:09 1.56 +++ rpl/src/evaluation.c 2012/12/13 16:59:41 1.63 @@ -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. @@ -51,6 +51,7 @@ evaluation(struct_processus *s_etat_proc logical1 drapeau_then; logical1 erreur_evaluation; + logical1 presence_compteur; logical1 presence_egalite; logical1 presence_fonction; logical1 presence_variable; @@ -180,14 +181,6 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - presence_variable_partagee = d_faux; if (recherche_variable_partagee(s_etat_processus, @@ -200,12 +193,9 @@ evaluation(struct_processus *s_etat_proc presence_variable = d_vrai; presence_variable_partagee = d_vrai; - if ((*((*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet)).type - == ADR) + if ((*(*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet) + .type == ADR) { presence_fonction = d_vrai; } @@ -213,17 +203,15 @@ evaluation(struct_processus *s_etat_proc if ((s_copie_variable_partagee = copie_objet(s_etat_processus, (*(*s_etat_processus) - .s_liste_variables_partagees) - .table[(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet, 'P')) == NULL) + .pointeur_variable_partagee_courante).objet, + 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -234,8 +222,8 @@ evaluation(struct_processus *s_etat_proc } if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -247,14 +235,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; presence_variable_partagee = d_faux; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } } } else @@ -308,15 +288,13 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = (*s_etat_processus) - .niveau_courant; + .niveau_courant = (*s_etat_processus).niveau_courant; if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*(*(*s_etat_processus).pointeur_variable_courante) - .objet).objet))); + (*((unsigned long *) ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet))); } else { @@ -324,14 +302,6 @@ evaluation(struct_processus *s_etat_proc (*((unsigned long *) (*s_copie_variable_partagee) .objet)); liberation(s_etat_processus, s_copie_variable_partagee); - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } } if ((*s_etat_processus).profilage == d_vrai) @@ -408,17 +378,6 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).erreur_systeme != d_es) { - if (presence_variable_partagee == d_vrai) - { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - } - return(d_erreur); } } @@ -801,10 +760,30 @@ evaluation(struct_processus *s_etat_proc ((*s_etat_processus).erreur_systeme == d_es) && ((*s_etat_processus).exception == d_ep)) { + registre_evaluation_expression_compilee = + (*s_etat_processus) + .evaluation_expression_compilee; + + if (((*(*s_etat_processus).pointeur_variable_courante) + .origine == 'E') && ((*(*s_etat_processus) + .pointeur_variable_courante).niveau == 0)) + { + (*s_etat_processus).evaluation_expression_compilee + = 'Y'; + } + else + { + (*s_etat_processus).evaluation_expression_compilee + = 'N'; + } + analyse(s_etat_processus, (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction); + (*s_etat_processus).evaluation_expression_compilee = + registre_evaluation_expression_compilee; + if (type_evaluation == 'I') { (*s_etat_processus).derniere_erreur_evaluation = @@ -912,6 +891,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -953,6 +933,34 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1016,6 +1024,128 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1065,6 +1195,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -1150,6 +1283,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -1178,6 +1312,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1228,6 +1390,128 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1376,6 +1660,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -1404,6 +1689,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -1462,6 +1775,128 @@ evaluation(struct_processus *s_etat_proc break; } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour @@ -1484,8 +1919,8 @@ evaluation(struct_processus *s_etat_proc } (*s_etat_processus) - .erreur_systeme = - d_es_processus; + .instruction_courante = + instruction_courante; return(d_erreur); } @@ -1510,8 +1945,8 @@ evaluation(struct_processus *s_etat_proc } (*s_etat_processus) - .erreur_systeme = - d_es_processus; + .instruction_courante = + instruction_courante; return(d_erreur); } @@ -1874,13 +2309,6 @@ evaluation(struct_processus *s_etat_proc if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - } - if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, @@ -1894,21 +2322,12 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).pointeur_variable_courante) .objet = (*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet; + .pointeur_variable_partagee_courante) + .objet; } else { presence_variable_partagee = d_faux; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - } } } else @@ -1938,8 +2357,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1972,8 +2391,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2006,8 +2425,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2046,8 +2465,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2089,8 +2508,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2126,8 +2545,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2169,8 +2588,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2232,7 +2651,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2268,7 +2687,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2305,7 +2724,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2351,7 +2770,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2387,8 +2806,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2430,8 +2849,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2473,8 +2892,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2536,7 +2955,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2571,7 +2990,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2624,7 +3043,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2660,7 +3079,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2703,7 +3122,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2738,7 +3157,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2779,7 +3198,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2817,7 +3236,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2874,7 +3293,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2911,7 +3330,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2953,7 +3372,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3005,8 +3424,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3037,7 +3456,7 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3074,7 +3493,7 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3109,8 +3528,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3140,7 +3559,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) .mutex)) != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3172,7 +3592,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3195,7 +3616,8 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3446,6 +3868,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3487,6 +3910,34 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -3550,6 +4001,128 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -3602,6 +4175,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -3725,6 +4301,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3753,6 +4330,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -3803,6 +4408,128 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -3855,6 +4582,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -3944,6 +4674,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -3972,6 +4703,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4022,6 +4781,128 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4074,6 +4955,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4234,6 +5118,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4275,6 +5160,34 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4338,6 +5251,128 @@ evaluation(struct_processus *s_etat_proc .erreur_execution = registre_erreur_execution; } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4390,6 +5425,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4513,6 +5551,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4541,6 +5580,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4591,6 +5658,128 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4643,6 +5832,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4732,6 +5924,7 @@ evaluation(struct_processus *s_etat_proc TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || @@ -4760,6 +5953,34 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme( + s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme( @@ -4810,6 +6031,128 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'S') && + (presence_compteur == + d_faux)) + { + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable( + s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme) + .nom_variable) == + d_faux) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus) + .erreur_systeme = d_es; + (*s_etat_processus) + .erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == + d_vrai) + { + liberation( + s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + 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; + return(d_erreur); + } + } + + depilement_pile_systeme( + s_etat_processus); + } else { // Traitement spécifique pour la @@ -4862,6 +6205,9 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + (*s_etat_processus) + .sections_critiques--; } depilement_pile_systeme( @@ -4987,15 +6333,6 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - presence_variable_partagee = d_faux; if (recherche_variable_partagee( @@ -5008,12 +6345,9 @@ evaluation(struct_processus *s_etat_proc presence_variable = d_vrai; presence_variable_partagee = d_vrai; - if ((*((*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet)).type - == ADR) + if ((*(*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).objet).type == ADR) { presence_fonction = d_vrai; } @@ -5024,18 +6358,15 @@ evaluation(struct_processus *s_etat_proc .objet)).symbole == d_faux)) { if ((s_copie_variable_partagee = - copie_objet(s_etat_processus, - (*(*s_etat_processus) - .s_liste_variables_partagees) - .table[(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet, 'P')) - == NULL) + copie_objet(s_etat_processus, + (*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).objet, 'P')) == NULL) { if (pthread_mutex_unlock( - &((*(*s_etat_processus) - .s_liste_variables_partagees - ).mutex)) != 0) + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus) .erreur_systeme = @@ -5051,8 +6382,8 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -5064,16 +6395,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; presence_variable_partagee = d_faux; - - if (pthread_mutex_unlock( - &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } } } else @@ -5533,16 +6854,6 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock( - &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - if (recherche_variable_partagee( s_etat_processus, (*(*s_etat_processus) @@ -5555,18 +6866,15 @@ evaluation(struct_processus *s_etat_proc s_objet_elementaire); if ((s_objet_elementaire = - copie_objet(s_etat_processus, - (*(*s_etat_processus) - .s_liste_variables_partagees) - .table[(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet, - 'P')) == NULL) + copie_objet(s_etat_processus, + (*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).objet, 'P')) == NULL) { if (pthread_mutex_unlock( - &((*(*s_etat_processus) - .s_liste_variables_partagees - ).mutex)) != 0) + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus) .erreur_systeme = @@ -5587,16 +6895,16 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } - } - if (pthread_mutex_unlock( + if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return(d_erreur); + } } } else @@ -5736,21 +7044,6 @@ evaluation(struct_processus *s_etat_proc // Traitement de l'instruction EXIT en mode interactif - if (l_element_courant != NULL) - { - l_element_courant = (*l_element_courant).suivant; - } - else - { - (*s_etat_processus).mode_execution_programme = 'Y'; - - if ((*s_etat_processus).niveau_courant == 1) - { - (*s_etat_processus).debug_programme = d_faux; - (*s_etat_processus).execution_pas_suivant = d_vrai; - } - } - if ((*s_etat_processus).traitement_cycle_exit != 'N') { registre_expression_courante = @@ -5777,6 +7070,22 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).expression_courante = registre_expression_courante; } + + if (l_element_courant != NULL) + { + l_element_courant = (*l_element_courant).suivant; + } + else + { + (*s_etat_processus).mode_execution_programme = 'Y'; + + if ((*s_etat_processus).niveau_courant == 1) + { + (*s_etat_processus).debug_programme = d_faux; + (*s_etat_processus).execution_pas_suivant = d_vrai; + } + } + } if (niveau_initial < (*s_etat_processus).niveau_courant) @@ -5788,8 +7097,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); } } @@ -5798,34 +7116,40 @@ 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_locales(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); } /* * Retrait des variables partagées créées dans l'expression */ + if (retrait_variables_partagees_locales(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); + } + +#warning A FIXER +#if 0 if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { @@ -5872,6 +7196,7 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } +#endif if ((*s_etat_processus).var_volatile_requete_arret != 0) {