--- rpl/src/instructions_v1.c 2011/06/10 11:35:13 1.19 +++ rpl/src/instructions_v1.c 2011/06/20 17:54:20 1.21 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.0 + RPL/2 (R) version 4.1.0.prerelease.1 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -920,6 +920,9 @@ instruction_version(struct_processus *s_ void instruction_vars(struct_processus *s_etat_processus) { + int i; + int nb_variables; + logical1 variable_partagee; struct_liste_chainee *l_element_courant; @@ -927,7 +930,7 @@ instruction_vars(struct_processus *s_eta struct_objet *s_objet_resultat; - unsigned long i; + struct_tableau_variables *tableau; (*s_etat_processus).erreur_execution = d_ex; @@ -971,8 +974,20 @@ instruction_vars(struct_processus *s_eta (*s_objet_resultat).objet = NULL; l_element_precedent = NULL; -#if 0 - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) + nb_variables = nombre_variables(s_etat_processus, + (*s_etat_processus).s_arbre_variables); + + if ((tableau = malloc(nb_variables * sizeof(struct_tableau_variables))) + == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + liste_variables(s_etat_processus, tableau, 0, + (*s_etat_processus).s_arbre_variables); + + for(i = 0; i < nb_variables; i++) { if (l_element_precedent == NULL) { @@ -1022,7 +1037,7 @@ instruction_vars(struct_processus *s_eta * Mise en place d'un verrou si la variable est partagée. */ - if ((*s_etat_processus).s_liste_variables[i].objet == NULL) + if (tableau[i].objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -1032,10 +1047,8 @@ instruction_vars(struct_processus *s_eta } if (recherche_variable_partagee(s_etat_processus, - ((*s_etat_processus).s_liste_variables[i]).nom, - ((*s_etat_processus).s_liste_variables[i]) - .variable_partagee, ((*s_etat_processus) - .s_liste_variables[i]).origine) == d_faux) + tableau[i].nom, tableau[i].variable_partagee, + tableau[i].origine) == d_faux) { // La variable partagée n'existe plus. @@ -1084,7 +1097,7 @@ instruction_vars(struct_processus *s_eta if (((*((struct_nom *) (*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)).donnee).objet)).nom = - malloc((strlen((*s_etat_processus).s_liste_variables[i].nom) + malloc((strlen(tableau[i].nom) + 1) * sizeof(unsigned char))) == NULL) { if (variable_partagee == d_vrai) @@ -1103,8 +1116,7 @@ instruction_vars(struct_processus *s_eta strcpy((*((struct_nom *) (*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)) - .donnee).objet)).nom, (*s_etat_processus) - .s_liste_variables[i].nom); + .donnee).objet)).nom, tableau[i].nom); /* * Préparation du niveau @@ -1148,7 +1160,7 @@ instruction_vars(struct_processus *s_eta (*((integer8 *) (*(*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)).suivant).donnee).objet)) = - (integer8) (*s_etat_processus).s_liste_variables[i].niveau; + (integer8) tableau[i].niveau; /* * Préparation du contenu de la variable @@ -1172,7 +1184,7 @@ instruction_vars(struct_processus *s_eta return; } - if ((*s_etat_processus).s_liste_variables[i].objet == NULL) + if (tableau[i].objet == NULL) { // Variable partagée @@ -1208,8 +1220,8 @@ instruction_vars(struct_processus *s_eta if (((*(*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)).suivant).suivant) - .donnee = copie_objet(s_etat_processus, (*s_etat_processus) - .s_liste_variables[i].objet, 'P')) == NULL) + .donnee = copie_objet(s_etat_processus, tableau[i].objet, + 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -1236,11 +1248,9 @@ instruction_vars(struct_processus *s_eta return; } - if (((*s_etat_processus).s_liste_variables[i].origine == 'P') - ? ((*s_etat_processus).s_liste_variables[i] - .variable_statique.adresse != 0) - : ((*s_etat_processus).s_liste_variables[i] - .variable_statique.pointeur != NULL)) + if ((tableau[i].origine == 'P') + ? (tableau[i].variable_statique.adresse != 0) + : (tableau[i].variable_statique.pointeur != NULL)) { if (((*(*(*(*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)).suivant).suivant) @@ -1293,8 +1303,7 @@ instruction_vars(struct_processus *s_eta return; } - if ((*s_etat_processus).s_liste_variables[i].variable_verrouillee - == d_vrai) + if (tableau[i].variable_verrouillee == d_vrai) { if (((*(*(*(*(*(*((struct_liste_chainee *) (*((struct_objet *) (*l_element_courant).donnee)).objet)).suivant).suivant) @@ -1392,7 +1401,8 @@ instruction_vars(struct_processus *s_eta l_element_precedent = l_element_courant; } -#endif + + free(tableau); if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur)