--- rpl/src/evaluation.c 2011/04/20 08:26:04 1.35 +++ rpl/src/evaluation.c 2016/03/01 22:12:27 1.98 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.0 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -48,9 +48,17 @@ evaluation(struct_processus *s_etat_proc { integer8 i; integer8 j; + integer8 k; + integer8 l; + integer8 niveau_initial; + integer8 nombre_termes; + integer8 registre_hauteur_pile_operationnelle; + integer8 registre_position_courante; + logical1 drapeau_then; logical1 erreur_evaluation; + logical1 presence_compteur; logical1 presence_egalite; logical1 presence_fonction; logical1 presence_variable; @@ -83,23 +91,13 @@ evaluation(struct_processus *s_etat_proc unsigned char registre_evaluation_forcee; unsigned char registre_instruction_valide; unsigned char registre_mode_execution_programme; - unsigned char registre_retour_definition; unsigned char registre_test; unsigned char registre_test_2; unsigned char registre_type_evaluation; - unsigned int registre_erreur_execution; - unsigned int registre_erreur_systeme; - unsigned int registre_exception; - - unsigned long k; - unsigned long l; - unsigned long n; - unsigned long niveau_initial; - unsigned long nombre_termes; - unsigned long registre_hauteur_pile_operationnelle; - unsigned long registre_niveau_courant; - unsigned long registre_position_courante; + int registre_erreur_execution; + int registre_erreur_systeme; + int registre_exception; void (*fonction)(); @@ -180,14 +178,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, @@ -195,17 +185,14 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { 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 +200,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 +219,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 +232,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,30 +285,20 @@ 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))); + (*((integer8 *) ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet))); } else { (*s_etat_processus).position_courante = - (*((unsigned long *) (*s_copie_variable_partagee) + (*((integer8 *) (*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) @@ -356,6 +323,8 @@ evaluation(struct_processus *s_etat_proc if (sequenceur(s_etat_processus) == d_erreur) { + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).mode_execution_programme = @@ -408,17 +377,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); } } @@ -452,8 +410,6 @@ evaluation(struct_processus *s_etat_proc .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); - if (presence_variable_partagee == d_faux) { if (evaluation(s_etat_processus, (*(*s_etat_processus) @@ -465,6 +421,8 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; @@ -487,6 +445,8 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; @@ -506,7 +466,6 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { @@ -754,12 +713,6 @@ evaluation(struct_processus *s_etat_proc * Exécution de la séquence d'instructions */ - registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; - (*(*s_etat_processus).l_base_pile_systeme).pointeur_adresse_retour = - s_objet; - l_element_courant = (struct_liste_chainee *) (*s_objet).objet; autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; @@ -801,10 +754,20 @@ 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; + + (*s_etat_processus).evaluation_expression_compilee + = 'Y'; + 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 = @@ -822,8 +785,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -912,9 +875,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -932,6 +897,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -944,6 +917,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( @@ -987,6 +988,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -999,8 +1008,182 @@ 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 fin d'une section + // critique + + if ((*s_etat_processus) + .l_base_pile_systeme + == NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + liberation( + s_etat_processus, + s_objet_evalue); + + (*s_etat_processus) + .instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -1084,9 +1267,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -1097,11 +1282,47 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 { @@ -1139,14 +1360,200 @@ evaluation(struct_processus *s_etat_proc 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); } } + 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 fin d'une section + // critique + + if ((*s_etat_processus) + .l_base_pile_systeme + == NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); } @@ -1237,9 +1644,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -1250,11 +1659,47 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 { @@ -1292,6 +1737,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -1306,8 +1759,185 @@ 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 + // la fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme + == NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -1349,8 +1979,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus) .var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -1663,19 +2293,12 @@ 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, (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, - 'E') == d_vrai) + 'E') != NULL) { // Une variable partagée existe. @@ -1683,21 +2306,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 @@ -1727,8 +2341,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; @@ -1761,8 +2375,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; @@ -1795,8 +2409,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; @@ -1835,8 +2449,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; @@ -1878,8 +2492,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; @@ -1915,8 +2529,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; @@ -1958,8 +2572,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; @@ -2021,7 +2635,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 = @@ -2057,7 +2671,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 = @@ -2094,7 +2708,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 = @@ -2140,7 +2754,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 = @@ -2176,8 +2790,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; @@ -2219,8 +2833,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; @@ -2262,8 +2876,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; @@ -2325,7 +2939,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 = @@ -2360,7 +2974,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 = @@ -2413,7 +3027,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 = @@ -2449,7 +3063,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 = @@ -2468,6 +3082,86 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + // Si l'objet élémentaire est un nom et que ce nom n'est + // pas un nom symbolique, il convient de l'évaluer. + + if ((*s_objet_elementaire).type == NOM) + { + if (((*((struct_nom *) (*s_objet_elementaire) + .objet)).symbole == d_faux) || + (type_evaluation == 'N')) + { + if (evaluation(s_etat_processus, + s_objet_elementaire, 'E') == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + liberation(s_etat_processus, + s_objet_elementaire); + + + if (depilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + &s_objet_elementaire) == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } } /* @@ -2492,7 +3186,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 = @@ -2527,7 +3221,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 = @@ -2568,7 +3262,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 = @@ -2606,7 +3300,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 = @@ -2625,6 +3319,86 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + // Si l'objet élémentaire est un nom et que ce nom n'est + // pas un nom symbolique, il convient de l'évaluer. + + if ((*s_objet_elementaire).type == NOM) + { + if (((*((struct_nom *) (*s_objet_elementaire) + .objet)).symbole == d_faux) || + (type_evaluation == 'N')) + { + if (evaluation(s_etat_processus, + s_objet_elementaire, 'E') == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + liberation(s_etat_processus, + s_objet_elementaire); + + + if (depilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + &s_objet_elementaire) == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } } else if (((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == ALG) || @@ -2663,7 +3437,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 = @@ -2700,7 +3474,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 = @@ -2742,7 +3516,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 = @@ -2755,6 +3529,8 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); @@ -2774,8 +3550,7 @@ evaluation(struct_processus *s_etat_proc .niveau_courant; (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*(*(*s_etat_processus) + (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet))); if ((*s_etat_processus).profilage == d_vrai) @@ -2794,8 +3569,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; @@ -2826,7 +3601,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 = @@ -2839,6 +3614,8 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = @@ -2863,7 +3640,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 = @@ -2898,8 +3675,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; @@ -2929,7 +3706,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; @@ -2961,7 +3739,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; @@ -2984,7 +3763,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; @@ -3036,7 +3816,7 @@ evaluation(struct_processus *s_etat_proc .evaluation_expression_compilee; (*s_etat_processus).evaluation_expression_compilee - = 'N'; + = 'Y'; if (evaluation(s_etat_processus, (*l_element_courant) .donnee, type_evaluation) == d_erreur) @@ -3146,8 +3926,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -3235,9 +4015,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -3255,6 +4037,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -3267,6 +4057,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( @@ -3310,6 +4128,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -3322,8 +4148,185 @@ 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -3445,9 +4448,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -3458,11 +4463,47 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 { @@ -3500,14 +4541,199 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -3595,9 +4821,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -3608,12 +4836,48 @@ evaluation(struct_processus *s_etat_proc 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); } } + 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( @@ -3650,14 +4914,199 @@ evaluation(struct_processus *s_etat_proc 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); } } + 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -3699,8 +5148,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus) .var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -3727,8 +5176,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -3816,9 +5265,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -3836,6 +5287,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -3848,6 +5307,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( @@ -3891,6 +5378,14 @@ evaluation(struct_processus *s_etat_proc 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; @@ -3903,8 +5398,185 @@ 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -4026,9 +5698,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -4039,12 +5713,48 @@ evaluation(struct_processus *s_etat_proc 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); } } + 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( @@ -4081,14 +5791,199 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -4176,9 +6071,11 @@ 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) || + TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) @@ -4189,11 +6086,47 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 { @@ -4231,14 +6164,199 @@ evaluation(struct_processus *s_etat_proc 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); + } + } + 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 + // fin d'une section critique + + if ((*s_etat_processus) + .l_base_pile_systeme == + NULL) + { + (*s_etat_processus) + .erreur_systeme = + d_es_end_incoherent; + + 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) + .l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) + != 0) + { + (*s_etat_processus) + .erreur_systeme = + d_es_processus; + + 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) + .sections_critiques--; + } + depilement_pile_systeme( s_etat_processus); @@ -4271,7 +6389,6 @@ evaluation(struct_processus *s_etat_proc registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; - if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); @@ -4280,8 +6397,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus) .var_volatile_processus_pere == 0) { - kill((*s_etat_processus) - .pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus) + .pid_processus_pere, rpl_sigalrm); } else { @@ -4362,15 +6479,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( @@ -4378,17 +6486,14 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { 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; } @@ -4399,18 +6504,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 = @@ -4426,8 +6528,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; @@ -4439,16 +6541,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 @@ -4546,7 +6638,7 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) + (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante) .objet).objet))); @@ -4554,7 +6646,7 @@ evaluation(struct_processus *s_etat_proc else { (*s_etat_processus).position_courante = - (*((unsigned long *) + (*((integer8 *) (*s_copie_variable_partagee).objet)); liberation(s_etat_processus, s_copie_variable_partagee); @@ -4591,6 +6683,8 @@ evaluation(struct_processus *s_etat_proc s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = @@ -4599,7 +6693,7 @@ evaluation(struct_processus *s_etat_proc } (*s_etat_processus).evaluation_forcee = - registre_evaluation_forcee; + registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = 'N'; @@ -4734,18 +6828,18 @@ evaluation(struct_processus *s_etat_proc } } - registre_niveau_courant = (*(*s_etat_processus) - .l_base_pile_systeme).niveau_courant; - registre_retour_definition = - (*(*s_etat_processus) - .l_base_pile_systeme).retour_definition; + empilement_pile_systeme(s_etat_processus); (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); + (*(*s_etat_processus).l_base_pile_systeme) + .pointeur_objet_retour = + l_element_courant; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; if (evaluation(s_etat_processus, (*(*s_etat_processus) @@ -4754,13 +6848,6 @@ evaluation(struct_processus *s_etat_proc { depilement_pile_systeme(s_etat_processus); - (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = - registre_niveau_courant; - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = - registre_retour_definition; - if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); @@ -4785,12 +6872,358 @@ evaluation(struct_processus *s_etat_proc depilement_pile_systeme(s_etat_processus); + if ((((*s_etat_processus).erreur_execution != + d_ex) || ((*s_etat_processus) + .erreur_systeme != d_es)) && + ((*s_etat_processus).arret_si_exception + == d_faux)) + { + // Reprise sur erreur. + +//============================================================================== +// Réindentation +//============================================================================== + + drapeau_then = d_faux; + + while(drapeau_then == d_faux) + { + l_registre_atome = l_element_courant; + l_element_courant = (*l_element_courant).suivant; + + 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; + 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; + + if (recherche_variable(s_etat_processus, + (*s_etat_processus).instruction_courante) == d_faux) + { + (*s_etat_processus).erreur_systeme = d_es; + fonction = (*((struct_fonction *) + (*(*l_element_courant).donnee) + .objet)).fonction; + + /* + * Traitement de la pile système par les + * différentes instructions. + */ + + if (TEST(instruction_if) || + TEST(instruction_iferr) || + TEST(instruction_do) || + TEST(instruction_while) || + TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start) || + TEST(instruction_select) || + TEST(instruction_case) || + TEST(instruction_critical) || + TEST(vers_niveau_superieur)) + { + if (TEST(vers_niveau_superieur)) + { + registre_exception = (*s_etat_processus) + .exception; + registre_erreur_execution = (*s_etat_processus) + .erreur_execution; + + analyse(s_etat_processus, + vers_niveau_superieur); + + 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).exception + = registre_exception; + (*s_etat_processus).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) - .niveau_courant = - registre_niveau_courant; + .type_cloture = 'L'; + } + else + { + 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); + } + } + } + else if (TEST(instruction_end) || + TEST(instruction_next) || + TEST(instruction_step) || + TEST(vers_niveau_inferieur)) + { + if (TEST(vers_niveau_inferieur)) + { + registre_exception = (*s_etat_processus) + .exception; + registre_erreur_execution = (*s_etat_processus) + .erreur_execution; + + analyse(s_etat_processus, + vers_niveau_inferieur); + + 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).exception + = registre_exception; + (*s_etat_processus).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 fin d'une section + // critique + + if ((*s_etat_processus).l_base_pile_systeme + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_end_incoherent; + + 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).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + + liberation(s_etat_processus, + s_objet_evalue); + + (*s_etat_processus).instruction_courante = instruction_courante; + return(d_erreur); + } + + (*s_etat_processus).sections_critiques--; + } + + depilement_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); + } + } + } + else if (TEST(instruction_then)) + { + if ((*(*s_etat_processus).l_base_pile_systeme) + .clause == 'R') + { (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = - registre_retour_definition; + .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; + + (*s_etat_processus).exception = d_ep; + (*s_etat_processus).erreur_execution = d_ex; + +//============================================================================== +// Fin de la réindentation +//============================================================================== + } } else { @@ -4813,14 +7246,12 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); if (evaluation(s_etat_processus, s_copie_variable_partagee, type_evaluation) == d_erreur) { depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); @@ -4848,7 +7279,6 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); @@ -4908,40 +7338,27 @@ 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) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { liberation(s_etat_processus, 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 = @@ -4962,16 +7379,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 @@ -5111,21 +7528,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 = @@ -5152,6 +7554,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) @@ -5163,8 +7581,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); } } @@ -5173,78 +7600,35 @@ 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 (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(d_erreur); - } - - for(n = 0; n < (*(*s_etat_processus).s_liste_variables_partagees) - .nombre_variables; n++) + if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur) { - if ((*(*s_etat_processus).s_liste_variables_partagees).table[n] - .niveau > (*s_etat_processus).niveau_courant) + if (presence_egalite == d_vrai) { - if (retrait_variable_partagee(s_etat_processus, - (*(*s_etat_processus).s_liste_variables_partagees) - .table[n].nom, (*(*s_etat_processus) - .s_liste_variables_partagees).table[n] - .variable_partagee) == d_erreur) - { - 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 (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); } - } - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; return(d_erreur); } @@ -5280,9 +7664,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; - return(d_erreur); } @@ -5295,9 +7676,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; - return(d_erreur); } } @@ -5305,8 +7683,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; } else if ((*s_objet).type == FCT) { @@ -5315,7 +7691,15 @@ evaluation(struct_processus *s_etat_proc registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; - cf(s_etat_processus, 35); + + if (type_evaluation == 'N') + { + cf(s_etat_processus, 35); + } + else + { + sf(s_etat_processus, 35); + } analyse(s_etat_processus, (*((struct_fonction *) (*s_objet).objet)).fonction);