--- rpl/src/evaluation.c 2011/01/03 12:08:03 1.31 +++ rpl/src/evaluation.c 2013/03/20 17:11:43 1.75 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.20 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 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; @@ -76,8 +84,6 @@ evaluation(struct_processus *s_etat_proc struct_objet *s_sous_objet; struct_objet *s_copie_variable_partagee; - struct_variable *registre_variables; - unsigned char autorisation_empilement_programme; unsigned char *instruction_courante; unsigned char *message; @@ -90,19 +96,9 @@ evaluation(struct_processus *s_etat_proc 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 m; - 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)(); @@ -178,40 +174,26 @@ evaluation(struct_processus *s_etat_proc { if ((*s_etat_processus).traitement_symbolique == 'N') { - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] + if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { // 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, - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).nom, - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]) - .variable_partagee, 'E') == d_vrai) + (*(*s_etat_processus) + .pointeur_variable_courante).nom, + (*(*s_etat_processus) + .pointeur_variable_courante) + .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; } @@ -219,17 +201,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; @@ -240,8 +220,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; @@ -253,14 +233,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 @@ -269,9 +241,8 @@ evaluation(struct_processus *s_etat_proc presence_variable = d_vrai; - if ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .objet)).type == ADR) + if ((*(*(*s_etat_processus).pointeur_variable_courante) + .objet).type == ADR) { presence_fonction = d_vrai; } @@ -315,39 +286,26 @@ 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).s_liste_variables - [(*s_etat_processus) - .position_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) { profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] + (*(*s_etat_processus).pointeur_variable_courante) .nom); if ((*s_etat_processus).erreur_systeme != d_es) @@ -366,6 +324,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 = @@ -399,11 +359,9 @@ evaluation(struct_processus *s_etat_proc registre_evaluation_expression_compilee = (*s_etat_processus).evaluation_expression_compilee; - if (((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine == 'E') && - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].niveau - == 0)) + if (((*(*s_etat_processus).pointeur_variable_courante).origine + == 'E') && ((*(*s_etat_processus) + .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus).evaluation_expression_compilee = 'Y'; } @@ -415,23 +373,11 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] + (*(*s_etat_processus).pointeur_variable_courante) .nom); 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); } } @@ -465,13 +411,13 @@ evaluation(struct_processus *s_etat_proc .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); + // ICI + //empilement_pile_systeme(s_etat_processus); if (presence_variable_partagee == d_faux) { - if (evaluation(s_etat_processus, (*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet, + if (evaluation(s_etat_processus, (*(*s_etat_processus) + .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { if ((*s_etat_processus).profilage == d_vrai) @@ -479,6 +425,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; @@ -501,6 +449,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; @@ -520,7 +470,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) { @@ -771,8 +720,6 @@ evaluation(struct_processus *s_etat_proc 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) @@ -815,10 +762,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 = @@ -836,8 +803,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 { @@ -926,9 +893,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)) @@ -946,6 +915,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; @@ -958,6 +935,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( @@ -1001,6 +1006,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; @@ -1013,8 +1026,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); @@ -1098,9 +1285,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)) @@ -1111,11 +1300,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 { @@ -1153,14 +1378,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); } @@ -1251,9 +1662,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)) @@ -1264,12 +1677,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( @@ -1306,6 +1755,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; @@ -1320,8 +1777,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); @@ -1363,8 +1997,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 { @@ -1674,49 +2308,28 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .objet == NULL) + 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).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).nom, - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]) - .variable_partagee, 'E') == d_vrai) + (*(*s_etat_processus) + .pointeur_variable_courante).nom, + (*(*s_etat_processus) + .pointeur_variable_courante).variable_partagee, + 'E') != NULL) { // Une variable partagée existe. presence_variable_partagee = d_vrai; - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet = - (*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet; + (*(*s_etat_processus).pointeur_variable_courante) + .objet = (*(*s_etat_processus) + .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 @@ -1728,8 +2341,7 @@ evaluation(struct_processus *s_etat_proc * Recherche d'un élément dans un vecteur */ - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) + if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { // La variable partagée n'existe plus. @@ -1742,14 +2354,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus) + .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; @@ -1761,15 +2372,12 @@ evaluation(struct_processus *s_etat_proc return(d_erreur);; } } - else if ((((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == VIN) || - ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == VRL) || - ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == VCX)) + else if ((((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VIN) || + ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VRL) || + ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VCX)) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { @@ -1780,14 +2388,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus) + .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; @@ -1808,21 +2415,20 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } - if ((*s_objet_indice_i).type == INT) + if ((*s_objet_indice_i).type != INT) { liberation(s_etat_processus, s_objet_indice_i); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus) + .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; @@ -1848,23 +2454,21 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_indice_i); if ((i < 1) || (i > (integer8) (*((struct_vecteur *) - (*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).objet)) .taille)) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet = + (*(*s_etat_processus) + .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; @@ -1885,9 +2489,8 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } - if ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)).type + if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VIN) { if (((*s_objet_elementaire).objet = malloc(sizeof( @@ -1901,15 +2504,14 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -1926,14 +2528,12 @@ evaluation(struct_processus *s_etat_proc (*s_objet_elementaire).type = INT; (*((integer8 *) (*s_objet_elementaire).objet)) = ((integer8 *) (*((struct_vecteur *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1]; } - else if ((*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).type + else if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VRL) { if (((*s_objet_elementaire).objet = malloc(sizeof( @@ -1941,15 +2541,14 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -1972,14 +2571,12 @@ evaluation(struct_processus *s_etat_proc (*s_objet_elementaire).type = REL; (*((real8 *) (*s_objet_elementaire).objet)) = ((real8 *) (*((struct_vecteur *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1]; } - else if ((*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).type + else if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == VCX) { if (((*s_objet_elementaire).objet = malloc(sizeof( @@ -1987,15 +2584,14 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -2019,19 +2615,15 @@ evaluation(struct_processus *s_etat_proc (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) - .objet)).tableau)[i - 1] - .partie_reelle; + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) + .objet)).tableau)[i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) - .objet)).tableau)[i - 1] - .partie_imaginaire; + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) + .objet)).tableau)[i - 1].partie_imaginaire; } } @@ -2039,15 +2631,12 @@ evaluation(struct_processus *s_etat_proc * Recherche d'un élément dans une matrice */ - else if ((((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == MIN) || - ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == MRL) || - ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == MCX)) + else if ((((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == MIN) || + ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == MRL) || + ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == MCX)) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 2)) { @@ -2058,14 +2647,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2095,14 +2683,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2133,14 +2720,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2169,29 +2755,24 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_indice_j); if ((i < 1) || (i > (integer8) (*((struct_matrice *) - (*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).objet)) .nombre_lignes) || (j < 1) || (j > (integer8) - (*((struct_matrice *) (*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).objet)) + (*((struct_matrice *) (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).objet)) .nombre_colonnes)) { - liberation(s_etat_processus, s_objet_indice_i); - liberation(s_etat_processus, s_objet_indice_j); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2213,25 +2794,22 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } - if ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)).type - == MIN) + if ((*((*(*s_etat_processus).pointeur_variable_courante) + .objet)).type == MIN) { if (((*s_objet_elementaire).objet = malloc(sizeof( integer8))) == NULL) { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -2254,14 +2832,12 @@ evaluation(struct_processus *s_etat_proc (*s_objet_elementaire).type = INT; (*((integer8 *) (*s_objet_elementaire).objet)) = ((integer8 **) (*((struct_matrice *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1]; } - else if ((*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).type + else if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == MRL) { if (((*s_objet_elementaire).objet = malloc(sizeof( @@ -2269,15 +2845,14 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -2300,14 +2875,12 @@ evaluation(struct_processus *s_etat_proc (*s_objet_elementaire).type = REL; (*((real8 *) (*s_objet_elementaire).objet)) = ((real8 **) (*((struct_matrice *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1]; } - else if ((*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).type + else if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == MCX) { if (((*s_objet_elementaire).objet = malloc(sizeof( @@ -2315,15 +2888,14 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -2348,18 +2920,16 @@ evaluation(struct_processus *s_etat_proc .objet)).partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1] .partie_reelle; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) - (*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet)) + (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1] .partie_imaginaire; } @@ -2369,9 +2939,8 @@ evaluation(struct_processus *s_etat_proc * Recherche de l'élément idoine dans la liste */ - else if (((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == LST) && + else if (((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == LST) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { @@ -2382,14 +2951,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2418,14 +2986,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2451,9 +3018,8 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_indice_i); - l_sous_element_courant = (*(((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet)).objet; + l_sous_element_courant = (*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).objet; j = 0; while(l_sous_element_courant != NULL) @@ -2473,14 +3039,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2510,14 +3075,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2542,9 +3106,8 @@ evaluation(struct_processus *s_etat_proc * Recherche de l'élément idoine dans la table */ - else if (((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == TAB) && + else if (((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == TBL) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { @@ -2555,14 +3118,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2591,14 +3153,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2625,23 +3186,21 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_indice_i); if ((i < 1) || (i > (integer8) (*((struct_tableau *) - (*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet) + (*(*(*s_etat_processus) + .pointeur_variable_courante).objet) .objet)).nombre_elements)) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2667,21 +3226,19 @@ evaluation(struct_processus *s_etat_proc if ((s_objet_elementaire = copie_objet(s_etat_processus, - (*((struct_tableau *) (*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet) + (*((struct_tableau *) (*(*(*s_etat_processus) + .pointeur_variable_courante).objet) .objet)).elements[i - 1], 'P')) == NULL) { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2701,23 +3258,18 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } - else if (((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == ALG) || - ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == RPN)) + else if (((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == ALG) || + ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == RPN)) { registre_evaluation_expression_compilee = (*s_etat_processus) .evaluation_expression_compilee; - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].origine == 'E') && - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .niveau == 0)) + if (((*(*s_etat_processus).pointeur_variable_courante) + .origine == 'E') && ((*(*s_etat_processus) + .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus).evaluation_expression_compilee = 'Y'; @@ -2728,9 +3280,8 @@ evaluation(struct_processus *s_etat_proc 'N'; } - if (evaluation(s_etat_processus, (*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet, + if (evaluation(s_etat_processus, (*(*s_etat_processus) + .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { (*s_etat_processus).evaluation_expression_compilee = @@ -2738,14 +3289,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2776,14 +3326,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2805,9 +3354,8 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } } - else if ((*(((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) - .objet)).type == ADR) + else if ((*((*(*s_etat_processus) + .pointeur_variable_courante).objet)).type == ADR) { autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; @@ -2820,14 +3368,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2840,6 +3387,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); @@ -2859,32 +3408,27 @@ evaluation(struct_processus *s_etat_proc .niveau_courant; (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); + (*((integer8 *) ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet))); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + (*(*s_etat_processus) + .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -2910,13 +3454,12 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2929,6 +3472,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 = @@ -2948,13 +3493,12 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .pointeur_variable_courante).objet = + NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2984,14 +3528,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -3016,13 +3559,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -3049,13 +3592,13 @@ evaluation(struct_processus *s_etat_proc { if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -3074,13 +3617,12 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_vrai) { - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet - = NULL; + (*(*s_etat_processus) + .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; @@ -3242,8 +3784,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 { @@ -3331,9 +3873,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)) @@ -3351,6 +3895,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; @@ -3363,6 +3915,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( @@ -3406,6 +3986,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; @@ -3418,8 +4006,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); @@ -3541,9 +4306,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)) @@ -3554,11 +4321,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 { @@ -3596,14 +4399,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); @@ -3691,9 +4679,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)) @@ -3704,11 +4694,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 { @@ -3746,14 +4772,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); @@ -3795,8 +5006,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 { @@ -3823,8 +5034,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 { @@ -3912,9 +5123,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)) @@ -3932,6 +5145,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; @@ -3944,6 +5165,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( @@ -3987,6 +5236,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; @@ -3999,8 +5256,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); @@ -4122,9 +5556,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)) @@ -4135,12 +5571,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( @@ -4177,14 +5649,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); @@ -4272,9 +5929,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)) @@ -4285,11 +5944,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 { @@ -4327,14 +6022,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); @@ -4367,7 +6247,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); @@ -4376,8 +6255,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 { @@ -4453,42 +6332,26 @@ evaluation(struct_processus *s_etat_proc { if ((*s_etat_processus).traitement_symbolique == 'N') { - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet == NULL) + if ((*(*s_etat_processus) + .pointeur_variable_courante).objet == NULL) { // 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, - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).nom, - ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]) - .variable_partagee, 'E') == d_vrai) + s_etat_processus, (*(*s_etat_processus) + .pointeur_variable_courante).nom, + (*(*s_etat_processus) + .pointeur_variable_courante) + .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; } @@ -4499,18 +6362,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 = @@ -4526,8 +6386,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; @@ -4539,27 +6399,15 @@ 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 { presence_variable = d_vrai; - if ((*((*s_etat_processus) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).type == ADR) + if ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet) + .type == ADR) { presence_fonction = d_vrai; } @@ -4648,16 +6496,15 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); + (*((integer8 *) + ((*(*(*s_etat_processus) + .pointeur_variable_courante) + .objet).objet))); } else { (*s_etat_processus).position_courante = - (*((unsigned long *) + (*((integer8 *) (*s_copie_variable_partagee).objet)); liberation(s_etat_processus, s_copie_variable_partagee); @@ -4666,9 +6513,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + (*(*s_etat_processus) + .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { @@ -4695,6 +6541,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 = @@ -4703,7 +6551,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'; @@ -4739,9 +6587,8 @@ evaluation(struct_processus *s_etat_proc { if ((s_sous_objet = copie_objet(s_etat_processus, - (*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet, + (*(*s_etat_processus) + .pointeur_variable_courante).objet, 'P')) == NULL) { if (presence_variable_partagee == d_vrai) @@ -4810,12 +6657,10 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus) .evaluation_expression_compilee; - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].origine == 'E') - && ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].niveau == 0)) + if (((*(*s_etat_processus) + .pointeur_variable_courante) + .origine == 'E') && ((*(*s_etat_processus) + .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus) .evaluation_expression_compilee = 'Y'; @@ -4831,10 +6676,8 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, - (*s_etat_processus) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + (*(*s_etat_processus) + .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) @@ -4843,34 +6686,26 @@ 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) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet, + (*(*s_etat_processus) + .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { 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); @@ -4894,23 +6729,14 @@ 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; } else { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, - (*s_etat_processus) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + (*(*s_etat_processus) + .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) @@ -4925,14 +6751,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); @@ -4960,7 +6784,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); @@ -5014,51 +6837,33 @@ evaluation(struct_processus *s_etat_proc (*((struct_nom *) (*s_objet_elementaire) .objet)).nom) == d_vrai) { - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet + if ((*(*s_etat_processus) + .pointeur_variable_courante).objet == NULL) { // 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) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).nom, - ((*s_etat_processus) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante]) - .variable_partagee, 'E') == d_vrai) + (*(*s_etat_processus) + .pointeur_variable_courante).nom, + (*(*s_etat_processus) + .pointeur_variable_courante) + .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 = @@ -5079,16 +6884,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 @@ -5100,10 +6905,8 @@ evaluation(struct_processus *s_etat_proc if ((s_objet_elementaire = copie_objet(s_etat_processus, - (*s_etat_processus) - .s_liste_variables - [(*s_etat_processus) - .position_variable_courante].objet, + (*(*s_etat_processus) + .pointeur_variable_courante).objet, 'P')) == NULL) { if (presence_egalite == d_vrai) @@ -5230,21 +7033,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 = @@ -5271,6 +7059,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) @@ -5282,128 +7086,54 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).niveau_courant = niveau_initial; - for(m = 0, n = 0; n < (*s_etat_processus).nombre_variables; n++) - { - if ((*s_etat_processus).s_liste_variables[n].niveau - > niveau_initial) - { - m++; - } - } - - registre_variables = (*s_etat_processus).s_liste_variables; - (*s_etat_processus).nombre_variables -= m; - - if (((*s_etat_processus).s_liste_variables = malloc( - (*s_etat_processus).nombre_variables * - sizeof(struct_variable))) == NULL) + 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).erreur_systeme = d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; return(d_erreur); } - - for(m = 0, n = 0; n < (*s_etat_processus).nombre_variables; n++) - { - if (registre_variables[n + m].niveau > niveau_initial) - { - free(registre_variables[n + m].nom); - liberation(s_etat_processus, - registre_variables[n + m].objet); - m++; - n--; - } - else - { - (*s_etat_processus).s_liste_variables[n] = - registre_variables[n + m]; - } - } - - free(registre_variables); } /* * 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) + if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur) { - (*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 ((*(*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); }