--- rpl/src/evaluation.c 2010/04/07 13:33:22 1.9 +++ rpl/src/evaluation.c 2010/04/21 12:30:26 1.13 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.13 + RPL/2 (R) version 4.0.14 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -143,14 +143,31 @@ evaluation(struct_processus *s_etat_proc if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_tampon).objet)).nom) == d_faux) { + (*s_etat_processus).erreur_execution = d_ex; + if ((*s_etat_processus).autorisation_nom_implicite == 'N') { if ((*((struct_nom *) (*s_objet_tampon).objet)).symbole == d_faux) { + if (test_cfsf(s_etat_processus, 31) == d_vrai) + { + if (empilement_pile_last(s_etat_processus, 0) + == d_erreur) + { + return(d_erreur); + } + } + + erreur_evaluation = d_erreur; (*s_etat_processus).erreur_execution = - d_ex_manque_argument; - return(d_erreur); + d_ex_nom_implicite; + + if (type_evaluation == 'I') + { + (*s_etat_processus).derniere_erreur_evaluation = + (*s_etat_processus).erreur_execution; + } } } @@ -474,10 +491,10 @@ evaluation(struct_processus *s_etat_proc (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; } - else + else if ((*s_etat_processus).erreur_execution != d_ex_nom_implicite) { if ((s_objet_tampon = copie_objet(s_etat_processus, - s_objet, 'P')) == NULL) + s_objet, 'Q')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -495,12 +512,6 @@ evaluation(struct_processus *s_etat_proc instruction_courante; return(d_erreur); } - - if ((*s_etat_processus).erreur_execution == - d_ex_variable_non_definie) - { - (*s_etat_processus).erreur_execution = d_ex; - } } } else @@ -4013,7 +4024,7 @@ evaluation(struct_processus *s_etat_proc { /* * La fin de l'expression est atteinte, - * le sequenceur reprend la main. + * le séquenceur reprend la main. */ if (presence_egalite == d_vrai) @@ -4392,20 +4403,37 @@ evaluation(struct_processus *s_etat_proc if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_elementaire).objet)).nom) == d_faux) { + (*s_etat_processus).erreur_systeme = d_es; + presence_variable = d_faux; + if ((*s_etat_processus).autorisation_nom_implicite == 'N') { if ((*((struct_nom *) (*s_objet_elementaire).objet)) .symbole == d_faux) { - (*s_etat_processus).erreur_systeme = - d_es_nom_implicite; - return(d_erreur); + if (test_cfsf(s_etat_processus, 31) == d_vrai) + { + if (empilement_pile_last(s_etat_processus, + 0) == d_erreur) + { + return(d_erreur); + } + } + + erreur_evaluation = d_erreur; + (*s_etat_processus).erreur_execution = + d_ex_nom_implicite; + + if (type_evaluation == 'I') + { + (*s_etat_processus) + .derniere_erreur_evaluation = + (*s_etat_processus) + .erreur_execution; + } } } - - (*s_etat_processus).erreur_systeme = d_es; - presence_variable = d_faux; } else { @@ -4788,6 +4816,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition; @@ -4818,6 +4847,7 @@ evaluation(struct_processus *s_etat_proc (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = + registre_niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = registre_retour_definition; @@ -5099,6 +5129,10 @@ 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 + // symbolique. + if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue);