--- rpl/src/instructions_f1.c 2010/01/26 15:22:45 1.1.1.1 +++ rpl/src/instructions_f1.c 2012/10/07 13:44:09 1.45 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.11 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -271,6 +271,7 @@ instruction_fleche(struct_processus *s_e } else { + (*s_etat_processus).expression_courante = l_element_courant; (*s_etat_processus).erreur_execution = d_ex_nom_invalide; return; } @@ -285,6 +286,7 @@ instruction_fleche(struct_processus *s_e } else if ((*(*l_element_courant).donnee).type != NOM) { + (*s_etat_processus).expression_courante = l_element_courant; (*s_etat_processus).erreur_execution = d_ex_nom_invalide; return; } @@ -293,6 +295,7 @@ instruction_fleche(struct_processus *s_e if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { + (*s_etat_processus).expression_courante = l_element_courant; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -301,6 +304,7 @@ instruction_fleche(struct_processus *s_e if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { + (*s_etat_processus).expression_courante = l_element_courant; return; } @@ -312,6 +316,8 @@ instruction_fleche(struct_processus *s_e l_element_courant = (*l_element_courant).suivant; } while((fin_scrutation == d_faux) && (l_element_courant != NULL)); + (*s_etat_processus).objet_courant = + (*(*s_etat_processus).expression_courante).donnee; (*s_etat_processus).instruction_courante = tampon; if (fin_scrutation == d_faux) @@ -351,6 +357,12 @@ instruction_fleche(struct_processus *s_e for(i = 0; i < nombre_variables; i++) { + if (l_emplacement_valeurs == NULL) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + l_emplacement_valeurs = (*l_emplacement_valeurs).suivant; } @@ -416,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); @@ -446,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 @@ -459,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 { @@ -578,6 +587,7 @@ instruction_fleche(struct_processus *s_e } else { + // Variable partagée à utiliser // Variable partagee à créer (*s_etat_processus).erreur_systeme = d_es; @@ -585,6 +595,13 @@ instruction_fleche(struct_processus *s_e if ((s_variable_partagee.nom = malloc((strlen(s_variable.nom) + 1) * sizeof(unsigned char))) == NULL) { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .s_liste_variables_partagees).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -631,6 +648,13 @@ 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; } @@ -709,7 +733,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; } @@ -958,8 +982,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) { @@ -1000,6 +1022,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) @@ -1017,6 +1046,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; } @@ -1031,6 +1062,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; } @@ -1040,6 +1072,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; } @@ -1051,6 +1085,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; } @@ -1075,6 +1110,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; } @@ -1083,6 +1120,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; }