--- rpl/src/optimisation.c 2011/06/20 17:54:21 1.23 +++ rpl/src/optimisation.c 2011/06/20 21:08:22 1.24 @@ -38,14 +38,19 @@ logical1 sequenceur_optimise(struct_processus *s_etat_processus) { - logical1 erreur; + int i; + int nb_variables; + int point_entree; - long i; - long point_entree; + logical1 erreur; - unsigned char *message; + struct_objet *programme_principal; - unsigned long adresse_point_entree; + struct_tableau_variables *tableau; + + unsigned char *message; + + unsigned long adresse_point_entree; if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & @@ -72,16 +77,35 @@ sequenceur_optimise(struct_processus *s_ (*s_etat_processus).autorisation_empilement_programme = 'Y'; (*s_etat_processus).mode_execution_programme = 'N'; - BUG(1); -#if 0 - for(i = 0; i < (long) (*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) + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Mémoire insuffisante\n"); + } + else + { + printf("+++System : Not enough memory\n"); + } + + return(d_erreur); + } + + liste_variables(s_etat_processus, tableau, 0, + (*s_etat_processus).s_arbre_variables); + + for(i = 0; i < nb_variables; i++) { - if ((*s_etat_processus).s_liste_variables[i].niveau == 0) + if (tableau[i].niveau == 0) { // Variables qui contiennent les points d'entrée des définitions. (*s_etat_processus).position_courante = (*((unsigned long *) - (*((*s_etat_processus).s_liste_variables[i].objet)).objet)); + (*(tableau[i].objet)).objet)); if (point_entree == -1) { @@ -111,6 +135,7 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Optimization failed\n"); } + free(tableau); return(d_erreur); } @@ -128,14 +153,33 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Optimization failed\n"); } + free(tableau); return(d_erreur); } - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[i].objet); + // Modification de la variable. Il n'existe à cet instant + // que des variables de niveau 0. + + if (recherche_variable(s_etat_processus, tableau[i].nom) == + d_faux) + { + if ((*s_etat_processus).langue == 'F') + { + printf("+++Fatal : Optimisation impossible\n"); + } + else + { + printf("+++Fatal : Optimization failed\n"); + } + + free(tableau); + return(d_erreur); + } + + liberation(s_etat_processus, tableau[i].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - &((*s_etat_processus).s_liste_variables[i].objet)) + &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { if ((*s_etat_processus).langue == 'F') @@ -147,11 +191,18 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Optimization failed\n"); } + free(tableau); return(d_erreur); } - (*s_etat_processus).s_liste_variables[i].origine = 'E'; + (*(*s_etat_processus).pointeur_variable_courante).origine = 'E'; free((*s_etat_processus).instruction_courante); + + if (point_entree == i) + { + programme_principal = (*(*s_etat_processus) + .pointeur_variable_courante).objet; + } } } @@ -166,6 +217,7 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Optimization failed\n"); } + free(tableau); return(d_erreur); } @@ -206,6 +258,7 @@ sequenceur_optimise(struct_processus *s_ printf("+++Fatal : Optimization failed\n"); } + free(tableau); return(d_erreur); } @@ -215,8 +268,7 @@ sequenceur_optimise(struct_processus *s_ if ((*s_etat_processus).profilage == d_vrai) { - profilage(s_etat_processus, (*s_etat_processus).s_liste_variables - [point_entree].nom); + profilage(s_etat_processus, tableau[point_entree].nom); } if ((*s_etat_processus).erreur_systeme != d_es) @@ -230,11 +282,13 @@ sequenceur_optimise(struct_processus *s_ printf("+++System : Not enough memory\n"); } + free(tableau); return(d_erreur); } - erreur = evaluation(s_etat_processus, (*s_etat_processus).s_liste_variables - [point_entree].objet, 'E'); + free(tableau); + + erreur = evaluation(s_etat_processus, programme_principal, 'E'); if ((*s_etat_processus).profilage == d_vrai) { @@ -259,7 +313,6 @@ sequenceur_optimise(struct_processus *s_ } return(erreur); -#endif } // vim: ts=4