--- rpl/src/instructions_f1.c 2010/02/10 10:14:22 1.3 +++ rpl/src/instructions_f1.c 2011/06/27 09:04:57 1.29 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.0 + Copyright (C) 1989-2011 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); @@ -578,6 +589,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 +597,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 +650,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; }