--- rpl/src/evaluation.c 2013/03/05 21:02:35 1.72 +++ rpl/src/evaluation.c 2016/08/26 08:57:55 1.102 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -31,14 +31,14 @@ ================================================================================ Evaluation d'une expression ================================================================================ - Entrées : + Entrées : structure processus, - objet à évaluer (non libéré au retour de la routine) + objet à évaluer (non libéré au retour de la routine) et type ('E' pour 'EVAL', 'I' pour interactif et 'N' pour '->NUM') -------------------------------------------------------------------------------- - Sorties : objet évalué au niveau 1 de la pile + Sorties : objet évalué au niveau 1 de la pile -------------------------------------------------------------------------------- - Effets de bord : néant + Effets de bord : néant ================================================================================ */ @@ -48,6 +48,13 @@ evaluation(struct_processus *s_etat_proc { integer8 i; integer8 j; + integer8 k; + integer8 l; + integer8 niveau_initial; + integer8 nombre_termes; + integer8 registre_hauteur_pile_operationnelle; + integer8 registre_position_courante; + logical1 drapeau_then; logical1 erreur_evaluation; @@ -84,21 +91,13 @@ evaluation(struct_processus *s_etat_proc unsigned char registre_evaluation_forcee; unsigned char registre_instruction_valide; unsigned char registre_mode_execution_programme; - unsigned char registre_retour_definition; unsigned char registre_test; unsigned char registre_test_2; unsigned char registre_type_evaluation; - unsigned int registre_erreur_execution; - unsigned int registre_erreur_systeme; - unsigned int registre_exception; - - unsigned long k; - unsigned long l; - unsigned long niveau_initial; - unsigned long nombre_termes; - unsigned long registre_hauteur_pile_operationnelle; - unsigned long registre_position_courante; + int registre_erreur_execution; + int registre_erreur_systeme; + int registre_exception; void (*fonction)(); @@ -177,7 +176,7 @@ evaluation(struct_processus *s_etat_proc if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { - // Variable partagée + // Variable partagée presence_variable_partagee = d_faux; @@ -237,7 +236,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Variable privée + // Variable privée presence_variable = d_vrai; @@ -291,13 +290,13 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) ((*(*(*s_etat_processus) + (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet))); } else { (*s_etat_processus).position_courante = - (*((unsigned long *) (*s_copie_variable_partagee) + (*((integer8 *) (*s_copie_variable_partagee) .objet)); liberation(s_etat_processus, s_copie_variable_partagee); } @@ -324,6 +323,8 @@ evaluation(struct_processus *s_etat_proc if (sequenceur(s_etat_processus) == d_erreur) { + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).mode_execution_programme = @@ -409,8 +410,6 @@ evaluation(struct_processus *s_etat_proc .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); - if (presence_variable_partagee == d_faux) { if (evaluation(s_etat_processus, (*(*s_etat_processus) @@ -422,6 +421,8 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; @@ -444,6 +445,8 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; @@ -463,7 +466,6 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { @@ -569,10 +571,10 @@ evaluation(struct_processus *s_etat_proc if (presence_egalite == d_vrai) { - // S'il y a un signe '=', on modifie l'expression à évaluer en ôtant - // le signe '=' et en le remplaçant d'une part par SWAP DROP - // et d'autre part par DROP. On évalue la première puis la - // seconde normalement avant de reconstituer le tout à la fin + // S'il y a un signe '=', on modifie l'expression à évaluer en ôtant + // le signe '=' et en le remplaçant d'une part par SWAP DROP + // et d'autre part par DROP. On évalue la première puis la + // seconde normalement avant de reconstituer le tout à la fin // de la routine. l_registre_pile_operationnelle = NULL; @@ -631,8 +633,8 @@ evaluation(struct_processus *s_etat_proc return(d_erreur); } - // Récupération de l'objet au niveau 1 résultat de l'évaluation - // du premier membre de l'équation puis destruction de la pile. + // Récupération de l'objet au niveau 1 résultat de l'évaluation + // du premier membre de l'équation puis destruction de la pile. if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_evalue) == d_erreur) @@ -644,7 +646,7 @@ evaluation(struct_processus *s_etat_proc instruction_clear(s_etat_processus); - // Régénération de la pile initiale + // Régénération de la pile initiale while(depilement(s_etat_processus, &l_registre_pile_operationnelle, &s_sous_objet) != d_erreur) @@ -708,13 +710,9 @@ evaluation(struct_processus *s_etat_proc } /* - * Exécution de la séquence d'instructions + * Exécution de la séquence d'instructions */ - registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; - l_element_courant = (struct_liste_chainee *) (*s_objet).objet; autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; @@ -733,8 +731,8 @@ evaluation(struct_processus *s_etat_proc if ((*(*l_element_courant).donnee).type == FCT) { /* - * Tester la cohérence avec une variable pour récupérer les - * données selon les indices passés en argument (tableaux, + * Tester la cohérence avec une variable pour récupérer les + * données selon les indices passés en argument (tableaux, * listes...). */ @@ -760,18 +758,8 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus) .evaluation_expression_compilee; - if (((*(*s_etat_processus).pointeur_variable_courante) - .origine == 'E') && ((*(*s_etat_processus) - .pointeur_variable_courante).niveau == 0)) - { - (*s_etat_processus).evaluation_expression_compilee - = 'Y'; - } - else - { - (*s_etat_processus).evaluation_expression_compilee - = 'N'; - } + (*s_etat_processus).evaluation_expression_compilee + = 'Y'; analyse(s_etat_processus, (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) @@ -798,7 +786,8 @@ evaluation(struct_processus *s_etat_proc == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -878,8 +867,8 @@ evaluation(struct_processus *s_etat_proc .objet)).fonction; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -1027,7 +1016,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -1144,7 +1133,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour + // Traitement spécifique pour // la fin d'une section // critique @@ -1270,8 +1259,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -1393,7 +1382,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -1510,7 +1499,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour + // Traitement spécifique pour // la fin d'une section // critique @@ -1609,7 +1598,7 @@ evaluation(struct_processus *s_etat_proc } else { - // On ne détruit pas les variables pour les inclure + // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; @@ -1647,8 +1636,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -1778,7 +1767,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -1895,7 +1884,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour + // Traitement spécifique pour // la fin d'une section critique if ((*s_etat_processus) @@ -1992,7 +1981,8 @@ evaluation(struct_processus *s_etat_proc .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -2017,7 +2007,7 @@ evaluation(struct_processus *s_etat_proc else { /* - * Régénération de la fonction en notation algébrique + * Régénération de la fonction en notation algébrique */ if ((s_objet_elementaire = (struct_objet *) @@ -2203,7 +2193,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Clôture de l'expression + * Clôture de l'expression */ if (((*l_element_fonction).suivant = @@ -2312,7 +2302,7 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).variable_partagee, 'E') != NULL) { - // Une variable partagée existe. + // Une variable partagée existe. presence_variable_partagee = d_vrai; @@ -2332,13 +2322,13 @@ evaluation(struct_processus *s_etat_proc } /* - * Recherche d'un élément dans un vecteur + * Recherche d'un élément dans un vecteur */ if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { - // La variable partagée n'existe plus. + // La variable partagée n'existe plus. free(s_objet_elementaire); @@ -2622,7 +2612,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Recherche d'un élément dans une matrice + * Recherche d'un élément dans une matrice */ else if ((((*((*(*s_etat_processus) @@ -2930,7 +2920,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Recherche de l'élément idoine dans la liste + * Recherche de l'élément idoine dans la liste */ else if (((*((*(*s_etat_processus) @@ -3094,10 +3084,90 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + // Si l'objet élémentaire est un nom et que ce nom n'est + // pas un nom symbolique, il convient de l'évaluer. + + if ((*s_objet_elementaire).type == NOM) + { + if (((*((struct_nom *) (*s_objet_elementaire) + .objet)).symbole == d_faux) || + (type_evaluation == 'N')) + { + if (evaluation(s_etat_processus, + s_objet_elementaire, 'E') == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + liberation(s_etat_processus, + s_objet_elementaire); + + + if (depilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + &s_objet_elementaire) == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } } /* - * Recherche de l'élément idoine dans la table + * Recherche de l'élément idoine dans la table */ else if (((*((*(*s_etat_processus) @@ -3251,6 +3321,86 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } + + // Si l'objet élémentaire est un nom et que ce nom n'est + // pas un nom symbolique, il convient de l'évaluer. + + if ((*s_objet_elementaire).type == NOM) + { + if (((*((struct_nom *) (*s_objet_elementaire) + .objet)).symbole == d_faux) || + (type_evaluation == 'N')) + { + if (evaluation(s_etat_processus, + s_objet_elementaire, 'E') == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + liberation(s_etat_processus, + s_objet_elementaire); + + + if (depilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + &s_objet_elementaire) == d_erreur) + { + if (presence_variable_partagee == d_vrai) + { + (*(*s_etat_processus) + .pointeur_variable_courante) + .objet = NULL; + + if (pthread_mutex_unlock( + &((*(*s_etat_processus) + .pointeur_variable_partagee_courante + ).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } } else if (((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == ALG) || @@ -3381,6 +3531,8 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); @@ -3400,8 +3552,7 @@ evaluation(struct_processus *s_etat_proc .niveau_courant; (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*(*(*s_etat_processus) + (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet))); if ((*s_etat_processus).profilage == d_vrai) @@ -3465,6 +3616,8 @@ evaluation(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = @@ -3665,7 +3818,7 @@ evaluation(struct_processus *s_etat_proc .evaluation_expression_compilee; (*s_etat_processus).evaluation_expression_compilee - = 'N'; + = 'Y'; if (evaluation(s_etat_processus, (*l_element_courant) .donnee, type_evaluation) == d_erreur) @@ -3776,7 +3929,8 @@ evaluation(struct_processus *s_etat_proc == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -3855,8 +4009,8 @@ evaluation(struct_processus *s_etat_proc .objet)).fonction; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -4004,7 +4158,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -4121,7 +4275,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -4207,6 +4361,8 @@ evaluation(struct_processus *s_etat_proc do { + l_element_courant = (*l_element_courant) + .suivant; l_registre_atome = l_element_courant; if (l_element_courant == NULL) @@ -4246,9 +4402,6 @@ evaluation(struct_processus *s_etat_proc drapeau_then = TEST(instruction_then) ? d_vrai : d_faux; } - - l_element_courant = (*l_element_courant) - .suivant; } while(drapeau_then == d_faux); (*s_etat_processus).expression_courante = @@ -4288,8 +4441,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -4411,7 +4564,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -4528,7 +4681,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -4623,7 +4776,7 @@ evaluation(struct_processus *s_etat_proc } else { - // On ne détruit pas les variables pour les inclure + // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; @@ -4661,8 +4814,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -4784,7 +4937,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -4901,7 +5054,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -4998,7 +5151,8 @@ evaluation(struct_processus *s_etat_proc .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -5026,7 +5180,8 @@ evaluation(struct_processus *s_etat_proc == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -5061,6 +5216,8 @@ evaluation(struct_processus *s_etat_proc free(message); + l_registre_atome = l_element_courant; + while((*(*s_etat_processus).l_base_pile_systeme) .clause != 'R') { @@ -5105,8 +5262,8 @@ evaluation(struct_processus *s_etat_proc .objet)).fonction; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -5254,7 +5411,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -5371,7 +5528,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -5457,13 +5614,15 @@ evaluation(struct_processus *s_etat_proc do { + (*s_etat_processus).expression_courante = + l_registre_atome; l_registre_atome = l_element_courant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, - * le séquenceur reprend la main. + * le séquenceur reprend la main. */ if (presence_egalite == d_vrai) @@ -5501,9 +5660,6 @@ evaluation(struct_processus *s_etat_proc .suivant; } while(drapeau_then == d_faux); - (*s_etat_processus).expression_courante = - l_registre_atome; - (*(*s_etat_processus).l_base_pile_systeme) .clause = 'X'; instruction_then(s_etat_processus); @@ -5538,8 +5694,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -5661,7 +5817,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -5778,7 +5934,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -5873,7 +6029,7 @@ evaluation(struct_processus *s_etat_proc } else { - // On ne détruit pas les variables pour les inclure + // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; @@ -5911,8 +6067,8 @@ evaluation(struct_processus *s_etat_proc = d_es; /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if (TEST(instruction_if) || @@ -6034,7 +6190,7 @@ evaluation(struct_processus *s_etat_proc .type_cloture != 'L')) { /* - * Libération des compteurs + * Libération des compteurs * de boucle */ @@ -6151,7 +6307,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Traitement spécifique pour la + // Traitement spécifique pour la // fin d'une section critique if ((*s_etat_processus) @@ -6247,7 +6403,8 @@ evaluation(struct_processus *s_etat_proc .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) - .pid_processus_pere, rpl_sigalrm); + .pid_processus_pere, rpl_sigalrm, + d_faux); } else { @@ -6326,7 +6483,7 @@ evaluation(struct_processus *s_etat_proc if ((*(*s_etat_processus) .pointeur_variable_courante).objet == NULL) { - // Variable partagée + // Variable partagée presence_variable_partagee = d_faux; @@ -6417,8 +6574,8 @@ evaluation(struct_processus *s_etat_proc if ((*((struct_nom *) (*(*l_element_courant).donnee) .objet)).symbole == d_vrai) { - // L'objet apparaît comme un symbole dans - // l'expression en cours d'évaluation. On se + // L'objet apparaît comme un symbole dans + // l'expression en cours d'évaluation. On se // contente de l'empiler. if ((s_sous_objet = copie_objet(s_etat_processus, @@ -6487,7 +6644,7 @@ evaluation(struct_processus *s_etat_proc if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = - (*((unsigned long *) + (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante) .objet).objet))); @@ -6495,7 +6652,7 @@ evaluation(struct_processus *s_etat_proc else { (*s_etat_processus).position_courante = - (*((unsigned long *) + (*((integer8 *) (*s_copie_variable_partagee).objet)); liberation(s_etat_processus, s_copie_variable_partagee); @@ -6532,6 +6689,8 @@ evaluation(struct_processus *s_etat_proc s_objet_evalue); } + depilement_pile_systeme(s_etat_processus); + (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = @@ -6718,6 +6877,359 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); + + if ((((*s_etat_processus).erreur_execution != + d_ex) || ((*s_etat_processus) + .erreur_systeme != d_es)) && + ((*s_etat_processus).arret_si_exception + == d_faux)) + { + // Reprise sur erreur. + +//============================================================================== +// Réindentation +//============================================================================== + + drapeau_then = d_faux; + + while(drapeau_then == d_faux) + { + l_registre_atome = l_element_courant; + l_element_courant = (*l_element_courant).suivant; + + if (l_element_courant == NULL) + { + /* + * La fin de l'expression est atteinte, + * le sequenceur reprend la main. + */ + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, s_objet_evalue); + } + + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; + return(d_absence_erreur); + } + + if ((*(*l_element_courant).donnee).type == FCT) + { + (*s_etat_processus).instruction_courante = + (*((struct_fonction *) + (*(*l_element_courant).donnee) + .objet)).nom_fonction; + + if (recherche_variable(s_etat_processus, + (*s_etat_processus).instruction_courante) == d_faux) + { + (*s_etat_processus).erreur_systeme = d_es; + fonction = (*((struct_fonction *) + (*(*l_element_courant).donnee) + .objet)).fonction; + + /* + * Traitement de la pile système par les + * différentes instructions. + */ + + if (TEST(instruction_if) || + TEST(instruction_iferr) || + TEST(instruction_do) || + TEST(instruction_while) || + TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start) || + TEST(instruction_select) || + TEST(instruction_case) || + TEST(instruction_critical) || + TEST(vers_niveau_superieur)) + { + if (TEST(vers_niveau_superieur)) + { + registre_exception = (*s_etat_processus) + .exception; + registre_erreur_execution = (*s_etat_processus) + .erreur_execution; + + analyse(s_etat_processus, + vers_niveau_superieur); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus).exception + = registre_exception; + (*s_etat_processus).erreur_execution = + registre_erreur_execution; + } + else if (TEST(instruction_for) || + TEST(instruction_forall) || + TEST(instruction_start)) + { + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus).l_base_pile_systeme) + .type_cloture = 'L'; + } + else + { + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } + else if (TEST(instruction_end) || + TEST(instruction_next) || + TEST(instruction_step) || + TEST(vers_niveau_inferieur)) + { + if (TEST(vers_niveau_inferieur)) + { + registre_exception = (*s_etat_processus) + .exception; + registre_erreur_execution = (*s_etat_processus) + .erreur_execution; + + analyse(s_etat_processus, + vers_niveau_inferieur); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*s_etat_processus).exception + = registre_exception; + (*s_etat_processus).erreur_execution = + registre_erreur_execution; + } + else if ((TEST(instruction_next) || + TEST(instruction_step)) && + ((*(*s_etat_processus) + .l_base_pile_systeme) + .type_cloture != 'L')) + { + /* + * Libération des compteurs + * de boucle + */ + + presence_compteur = (((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'F') + || ((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'A')) + ? d_vrai : d_faux; + + if (((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture != 'S') && (presence_compteur + == d_faux)) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable(s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme).nom_variable) + == d_faux) + { + (*s_etat_processus).erreur_systeme = + d_es; + (*s_etat_processus).erreur_execution = + d_ex_erreur_traitement_boucle; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante + = instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante) + .objet == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es; + (*s_etat_processus).erreur_execution = + d_ex_variable_partagee; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante + = instruction_courante; + return(d_erreur); + } + + (*s_etat_processus) + .niveau_courant--; + + if (retrait_variables_par_niveau( + s_etat_processus) == d_erreur) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = instruction_courante; + return(d_erreur); + } + } + + depilement_pile_systeme(s_etat_processus); + } + else + { + // Traitement spécifique pour + // la fin d'une section + // critique + + if ((*s_etat_processus).l_base_pile_systeme + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_end_incoherent; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + + liberation(s_etat_processus, + s_objet_evalue); + + (*s_etat_processus).instruction_courante = instruction_courante; + return(d_erreur); + } + + (*s_etat_processus).sections_critiques--; + } + + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus) + .erreur_systeme != d_es) + { + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + } + } + else if (TEST(instruction_then)) + { + if ((*(*s_etat_processus).l_base_pile_systeme) + .clause == 'R') + { + (*(*s_etat_processus).l_base_pile_systeme) + .clause = 'X'; + instruction_then(s_etat_processus); + drapeau_then = d_vrai; + } + } + } + } + } + + (*s_etat_processus).expression_courante = + l_element_courant; + (*s_etat_processus).instruction_courante = + instruction_courante; + + (*s_etat_processus).exception = d_ep; + (*s_etat_processus).erreur_execution = d_ex; + +//============================================================================== +// Fin de la réindentation +//============================================================================== + } } else { @@ -6740,14 +7252,12 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; - empilement_pile_systeme(s_etat_processus); if (evaluation(s_etat_processus, s_copie_variable_partagee, type_evaluation) == d_erreur) { depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); @@ -6775,7 +7285,6 @@ evaluation(struct_processus *s_etat_proc } depilement_pile_systeme(s_etat_processus); - depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); @@ -6816,7 +7325,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Vérification du drapeau symbole pour + * Vérification du drapeau symbole pour * savoir si l'on met dans la pile le nom * ou le contenu de la variable. */ @@ -6833,7 +7342,7 @@ evaluation(struct_processus *s_etat_proc .pointeur_variable_courante).objet == NULL) { - // Variable partagée + // Variable partagée if (recherche_variable_partagee( s_etat_processus, @@ -6890,7 +7399,7 @@ evaluation(struct_processus *s_etat_proc } else { - // Variable privée + // Variable privée liberation(s_etat_processus, s_objet_elementaire); @@ -6974,8 +7483,8 @@ evaluation(struct_processus *s_etat_proc ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { - // Il est anormal de récupérer ici une erreur - // d'exécution puisqu'on empile une constante + // Il est anormal de récupérer ici une erreur + // d'exécution puisqu'on empile une constante // symbolique. if (presence_egalite == d_vrai) @@ -7072,8 +7581,8 @@ evaluation(struct_processus *s_etat_proc if (niveau_initial < (*s_etat_processus).niveau_courant) { /* - * Retrait des variables dans le cas où l'évaluation de - * l'expression a été interrompue + * Retrait des variables dans le cas où l'évaluation de + * l'expression a été interrompue */ (*s_etat_processus).niveau_courant = niveau_initial; @@ -7094,7 +7603,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Retrait des variables statiques créées dans l'expression + * Retrait des variables statiques créées dans l'expression */ if (retrait_variables_statiques_locales(s_etat_processus) == d_erreur) @@ -7112,7 +7621,7 @@ evaluation(struct_processus *s_etat_proc } /* - * Retrait des variables partagées créées dans l'expression + * Retrait des variables partagées créées dans l'expression */ if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur) @@ -7131,7 +7640,7 @@ evaluation(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_requete_arret != 0) { - // Restauration de la pile système + // Restauration de la pile système while(pile_systeme_originelle != (*s_etat_processus).l_base_pile_systeme) @@ -7142,7 +7651,7 @@ evaluation(struct_processus *s_etat_proc if (presence_egalite == d_vrai) { - // Ajout du membre évalué lors de la première passe + // Ajout du membre évalué lors de la première passe if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_evalue) == d_erreur) @@ -7161,9 +7670,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; - return(d_erreur); } @@ -7176,9 +7682,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; - return(d_erreur); } } @@ -7186,8 +7689,6 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; - (*(*s_etat_processus).l_base_pile_systeme).retour_definition = - registre_retour_definition; } else if ((*s_objet).type == FCT) { @@ -7196,7 +7697,15 @@ evaluation(struct_processus *s_etat_proc registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; - cf(s_etat_processus, 35); + + if (type_evaluation == 'N') + { + cf(s_etat_processus, 35); + } + else + { + sf(s_etat_processus, 35); + } analyse(s_etat_processus, (*((struct_fonction *) (*s_objet).objet)).fonction);