--- rpl/src/instructions_f1.c 2011/04/11 12:10:07 1.21 +++ rpl/src/instructions_f1.c 2012/12/19 09:58:24 1.50 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.0 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -428,8 +428,7 @@ instruction_fleche(struct_processus *s_e if (recherche_variable(s_etat_processus, s_variable.nom) == d_vrai) { if ((*s_etat_processus).niveau_courant == - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].niveau) + (*(*s_etat_processus).pointeur_variable_courante).niveau) { liberation(s_etat_processus, s_objet); free(s_variable.nom); @@ -458,7 +457,7 @@ instruction_fleche(struct_processus *s_e if (recherche_variable_statique(s_etat_processus, s_variable.nom, position_variable, ((*s_etat_processus).mode_execution_programme == 'Y') - ? 'P' : 'E') == d_vrai) + ? 'P' : 'E') != NULL) { // Variable statique à utiliser @@ -471,12 +470,10 @@ instruction_fleche(struct_processus *s_e s_variable.origine = 'E'; } - s_variable.objet = (*s_etat_processus) - .s_liste_variables_statiques[(*s_etat_processus) - .position_variable_statique_courante].objet; - (*s_etat_processus).s_liste_variables_statiques - [(*s_etat_processus) - .position_variable_statique_courante].objet = NULL; + s_variable.objet = (*(*s_etat_processus) + .pointeur_variable_statique_courante).objet; + (*(*s_etat_processus).pointeur_variable_statique_courante) + .objet = NULL; } else { @@ -552,8 +549,7 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).objet_courant; } - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + if (pthread_mutex_lock(&mutex_creation_variable_partagee) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -562,12 +558,19 @@ instruction_fleche(struct_processus *s_e if (recherche_variable_partagee(s_etat_processus, s_variable.nom, position_variable, ((*s_etat_processus).mode_execution_programme == 'Y') - ? 'P' : 'E') == d_vrai) + ? 'P' : 'E') != NULL) { // Variable partagée à utiliser + if (pthread_mutex_unlock(&mutex_creation_variable_partagee) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + 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; return; @@ -590,7 +593,6 @@ instruction_fleche(struct_processus *s_e } else { - // Variable partagée à utiliser // Variable partagee à créer (*s_etat_processus).erreur_systeme = d_es; @@ -599,7 +601,7 @@ instruction_fleche(struct_processus *s_e + 1) * sizeof(unsigned char))) == 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; return; @@ -651,24 +653,17 @@ instruction_fleche(struct_processus *s_e if (creation_variable_partagee(s_etat_processus, &s_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; - } - return; } - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) + s_variable.objet = NULL; + + if (pthread_mutex_unlock(&mutex_creation_variable_partagee) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - - s_variable.objet = NULL; } } else @@ -736,7 +731,7 @@ instruction_fleche(struct_processus *s_e (*s_etat_processus).niveau_courant--; - if (retrait_variable_par_niveau(s_etat_processus) == d_erreur) + if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { return; } @@ -985,8 +980,6 @@ instruction_for(struct_processus *s_etat } } - empilement_pile_systeme(s_etat_processus); - if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { @@ -1027,6 +1020,13 @@ instruction_for(struct_processus *s_etat instruction_valide = (*s_etat_processus).instruction_valide; (*s_etat_processus).test_instruction = 'Y'; + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return; + } + if ((*s_etat_processus).mode_execution_programme == 'Y') { if (recherche_instruction_suivante(s_etat_processus) == d_erreur) @@ -1044,6 +1044,8 @@ instruction_for(struct_processus *s_etat free((*s_etat_processus).instruction_courante); (*s_etat_processus).instruction_courante = tampon; + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_nom_reserve; return; } @@ -1058,6 +1060,7 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); return; } @@ -1067,6 +1070,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } @@ -1078,6 +1083,7 @@ instruction_for(struct_processus *s_etat { if ((*s_etat_processus).expression_courante == NULL) { + depilement_pile_systeme(s_etat_processus); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } @@ -1102,6 +1108,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle; return; } @@ -1110,6 +1118,8 @@ instruction_for(struct_processus *s_etat liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle; return; }