--- rpl/src/evaluation.c 2012/09/29 17:53:02 1.57 +++ rpl/src/evaluation.c 2013/03/05 16:20:47 1.70 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 - Copyright (C) 1989-2012 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. @@ -95,7 +95,6 @@ evaluation(struct_processus *s_etat_proc unsigned long k; unsigned long l; - unsigned long n; unsigned long niveau_initial; unsigned long nombre_termes; unsigned long registre_hauteur_pile_operationnelle; @@ -181,14 +180,6 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - presence_variable_partagee = d_faux; if (recherche_variable_partagee(s_etat_processus, @@ -196,17 +187,14 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { presence_variable = d_vrai; presence_variable_partagee = d_vrai; - if ((*((*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet)).type - == ADR) + if ((*(*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet) + .type == ADR) { presence_fonction = d_vrai; } @@ -214,17 +202,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; @@ -235,8 +221,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; @@ -248,14 +234,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 @@ -309,15 +287,13 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = (*s_etat_processus) - .niveau_courant; + .niveau_courant = (*s_etat_processus).niveau_courant; if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*(*(*s_etat_processus).pointeur_variable_courante) - .objet).objet))); + (*((unsigned long *) ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).objet))); } else { @@ -325,14 +301,6 @@ evaluation(struct_processus *s_etat_proc (*((unsigned long *) (*s_copie_variable_partagee) .objet)); liberation(s_etat_processus, s_copie_variable_partagee); - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } } if ((*s_etat_processus).profilage == d_vrai) @@ -409,17 +377,6 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).erreur_systeme != d_es) { - if (presence_variable_partagee == d_vrai) - { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - } - return(d_erreur); } } @@ -758,8 +715,10 @@ 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) @@ -802,10 +761,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 = @@ -956,6 +935,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1057,9 +1037,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1143,9 +1126,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -1332,6 +1314,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1420,9 +1403,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1506,9 +1492,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -1706,6 +1691,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -1802,9 +1788,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -1888,9 +1877,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -2322,19 +2310,12 @@ evaluation(struct_processus *s_etat_proc if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - } - if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, - 'E') == d_vrai) + 'E') != NULL) { // Une variable partagée existe. @@ -2342,21 +2323,12 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).pointeur_variable_courante) .objet = (*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet; + .pointeur_variable_partagee_courante) + .objet; } else { presence_variable_partagee = d_faux; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - } } } else @@ -2386,8 +2358,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2420,8 +2392,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2454,8 +2426,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2494,8 +2466,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -2537,8 +2509,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; @@ -2574,8 +2546,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; @@ -2617,8 +2589,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; @@ -2680,7 +2652,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2716,7 +2688,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2753,7 +2725,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2799,7 +2771,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -2835,8 +2807,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; @@ -2878,8 +2850,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; @@ -2921,8 +2893,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; @@ -2984,7 +2956,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3019,7 +2991,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3072,7 +3044,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3108,7 +3080,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3151,7 +3123,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3186,7 +3158,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3227,7 +3199,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3265,7 +3237,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3322,7 +3294,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3359,7 +3331,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3401,7 +3373,7 @@ evaluation(struct_processus *s_etat_proc if (pthread_mutex_unlock( &((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3453,8 +3425,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; @@ -3485,7 +3457,7 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3522,7 +3494,7 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) + .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = @@ -3557,8 +3529,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3588,7 +3560,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees) .mutex)) != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3620,7 +3593,8 @@ evaluation(struct_processus *s_etat_proc NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3643,7 +3617,8 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + .pointeur_variable_partagee_courante).mutex)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -3937,6 +3912,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4038,9 +4014,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4124,9 +4103,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -4354,6 +4332,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4442,9 +4421,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4528,9 +4510,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -4724,6 +4705,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -4812,9 +4794,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -4898,9 +4883,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -5178,6 +5162,7 @@ evaluation(struct_processus *s_etat_proc registre_erreur_execution; } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -5279,9 +5264,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = + (((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture == 'F') || ((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -5365,9 +5353,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -5595,6 +5582,7 @@ evaluation(struct_processus *s_etat_proc } } else if (TEST(instruction_for) || + TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( @@ -5683,379 +5671,12 @@ evaluation(struct_processus *s_etat_proc */ presence_compteur = - ((*(*s_etat_processus) + (((*(*s_etat_processus) .l_base_pile_systeme) - .type_cloture == 'F') - ? 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_variable_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); - - 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); - } - } - } - } - } - - l_element_courant = - (*l_element_courant).suivant; - } - - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - (*s_etat_processus).instruction_courante = - instruction_courante; - - (*s_etat_processus).exception = d_ep; - (*s_etat_processus).erreur_execution = d_ex; - - erreur_evaluation = d_erreur; - } - else - { - // On ne détruit pas les variables pour les inclure - // dans le fichier rpl-core. - - (*s_etat_processus).gel_liste_variables = d_vrai; - - registre_erreur_execution = - (*s_etat_processus).erreur_execution; - registre_exception = - (*s_etat_processus).exception; - registre_erreur_systeme = - (*s_etat_processus).erreur_systeme; - - (*s_etat_processus).s_objet_errone = s_objet; - (*s_etat_processus).s_objet_erreur = - (*l_element_courant).donnee; - - l_element_courant = (*l_element_courant).suivant; - - while(l_element_courant != NULL) - { - if ((*(*l_element_courant).donnee).type == FCT) - { - (*s_etat_processus).instruction_courante = - (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).nom_fonction; - fonction = (*((struct_fonction *) - (*(*l_element_courant).donnee) - .objet)).fonction; - - if (recherche_variable(s_etat_processus, - (*s_etat_processus) - .instruction_courante) == d_faux) - { - (*s_etat_processus).erreur_systeme - = d_es; - - /* - * Traitement de la pile système par les - * différentes instructions. - */ - - if (TEST(instruction_if) || - TEST(instruction_iferr) || - TEST(instruction_do) || - TEST(instruction_while) || - TEST(instruction_for) || - TEST(instruction_forall) || - TEST(instruction_start) || - TEST(instruction_select) || - TEST(instruction_case) || - TEST(instruction_critical) || - TEST(vers_niveau_superieur)) - { - if (TEST(vers_niveau_superieur)) - { - analyse(s_etat_processus, - vers_niveau_superieur); - - if ((*s_etat_processus) - .erreur_systeme != d_es) - { - if (presence_egalite == - d_vrai) - { - liberation( - s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .instruction_courante = - instruction_courante; - return(d_erreur); - } - } - else if (TEST(instruction_for) || - 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( - s_etat_processus); - - if ((*s_etat_processus) - .erreur_systeme != d_es) - { - if (presence_egalite == - d_vrai) - { - liberation( - s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .instruction_courante = - instruction_courante; - return(d_erreur); - } - } - } - else if (TEST(instruction_end) || - TEST(instruction_next) || - TEST(instruction_step) || - TEST(vers_niveau_inferieur)) - { - if (TEST(vers_niveau_inferieur)) - { - analyse(s_etat_processus, - vers_niveau_inferieur); - - if ((*s_etat_processus) - .erreur_systeme != d_es) - { - if (presence_egalite == - d_vrai) - { - liberation( - s_etat_processus, - s_objet_evalue); - } - - (*s_etat_processus) - .instruction_courante = - instruction_courante; - return(d_erreur); - } - } - else if ((TEST(instruction_next) || - TEST(instruction_step)) && + .type_cloture == 'F') || ((*(*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') + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus) @@ -6139,9 +5760,8 @@ evaluation(struct_processus *s_etat_proc .niveau_courant--; if ( - retrait_variable_par_niveau( - s_etat_processus) == - d_erreur) + retrait_variables_par_niveau( + s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) @@ -6341,15 +5961,6 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - presence_variable_partagee = d_faux; if (recherche_variable_partagee( @@ -6357,17 +5968,14 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { presence_variable = d_vrai; presence_variable_partagee = d_vrai; - if ((*((*(*s_etat_processus) - .s_liste_variables_partagees).table - [(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet)).type - == ADR) + if ((*(*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).objet).type == ADR) { presence_fonction = d_vrai; } @@ -6378,18 +5986,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 = @@ -6405,8 +6010,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; @@ -6418,16 +6023,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 @@ -6578,7 +6173,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'; @@ -6713,18 +6308,18 @@ evaluation(struct_processus *s_etat_proc } } - registre_niveau_courant = (*(*s_etat_processus) - .l_base_pile_systeme).niveau_courant; - registre_retour_definition = - (*(*s_etat_processus) - .l_base_pile_systeme).retour_definition; + empilement_pile_systeme(s_etat_processus); (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); + (*(*s_etat_processus).l_base_pile_systeme) + .pointeur_objet_retour = + l_element_courant; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; if (evaluation(s_etat_processus, (*(*s_etat_processus) @@ -6733,13 +6328,6 @@ evaluation(struct_processus *s_etat_proc { depilement_pile_systeme(s_etat_processus); - (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = - registre_niveau_courant; - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = - registre_retour_definition; - if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); @@ -6763,13 +6351,6 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); - - (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = - registre_niveau_courant; - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = - registre_retour_definition; } else { @@ -6887,40 +6468,27 @@ evaluation(struct_processus *s_etat_proc { // Variable partagée - if (pthread_mutex_lock( - &((*(*s_etat_processus) - .s_liste_variables_partagees) - .mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - if (recherche_variable_partagee( s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) - .variable_partagee, 'E') == d_vrai) + .variable_partagee, 'E') != NULL) { liberation(s_etat_processus, s_objet_elementaire); if ((s_objet_elementaire = - copie_objet(s_etat_processus, - (*(*s_etat_processus) - .s_liste_variables_partagees) - .table[(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet, - 'P')) == NULL) + copie_objet(s_etat_processus, + (*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).objet, 'P')) == NULL) { if (pthread_mutex_unlock( - &((*(*s_etat_processus) - .s_liste_variables_partagees - ).mutex)) != 0) + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) { (*s_etat_processus) .erreur_systeme = @@ -6941,16 +6509,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 @@ -7143,8 +6711,17 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).niveau_courant = niveau_initial; - if (retrait_variable_par_niveau(s_etat_processus) == d_erreur) + if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; return(d_erreur); } } @@ -7153,78 +6730,35 @@ evaluation(struct_processus *s_etat_proc * Retrait des variables statiques créées dans l'expression */ - for(n = 0; n < (*s_etat_processus).nombre_variables_statiques; n++) + if (retrait_variables_statiques_locales(s_etat_processus) == d_erreur) { - if ((*s_etat_processus).s_liste_variables_statiques[n] - .niveau > (*s_etat_processus).niveau_courant) + if (presence_egalite == d_vrai) { - if (retrait_variable_statique(s_etat_processus, - (*s_etat_processus).s_liste_variables_statiques[n].nom, - (*s_etat_processus).s_liste_variables_statiques[n] - .variable_statique) == d_erreur) - { - if (presence_egalite == d_vrai) - { - liberation(s_etat_processus, s_objet_evalue); - } - - (*s_etat_processus).instruction_courante = - instruction_courante; - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - return(d_erreur); - } + liberation(s_etat_processus, s_objet_evalue); } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; + return(d_erreur); } /* * Retrait des variables partagées créées dans l'expression */ - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(d_erreur); - } - - for(n = 0; n < (*(*s_etat_processus).s_liste_variables_partagees) - .nombre_variables; n++) + if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur) { - if ((*(*s_etat_processus).s_liste_variables_partagees).table[n] - .niveau > (*s_etat_processus).niveau_courant) + if (presence_egalite == d_vrai) { - if (retrait_variable_partagee(s_etat_processus, - (*(*s_etat_processus).s_liste_variables_partagees) - .table[n].nom, (*(*s_etat_processus) - .s_liste_variables_partagees).table[n] - .variable_partagee) == d_erreur) - { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return(d_erreur); - } - - if (presence_egalite == d_vrai) - { - liberation(s_etat_processus, s_objet_evalue); - } - - (*s_etat_processus).instruction_courante = - instruction_courante; - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - return(d_erreur); - } + liberation(s_etat_processus, s_objet_evalue); } - } - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; return(d_erreur); }