--- rpl/src/evaluation.c 2010/06/09 12:19:13 1.18 +++ rpl/src/evaluation.c 2010/06/24 09:21:43 1.19 @@ -436,6 +436,37 @@ evaluation(struct_processus *s_etat_proc } } + autorisation_empilement_programme = (*s_etat_processus) + .autorisation_empilement_programme; + + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (presence_variable_partagee == d_vrai) + { + liberation(s_etat_processus, s_copie_variable_partagee); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + return(d_erreur); + } + + (*(*s_etat_processus).l_base_pile_systeme) + .retour_definition = 'Y'; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; + + (*s_etat_processus).mode_execution_programme = 'Y'; + (*s_etat_processus).autorisation_empilement_programme = 'N'; + + (*(*s_etat_processus).l_base_pile_systeme) + .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) @@ -488,8 +519,18 @@ evaluation(struct_processus *s_etat_proc profilage(s_etat_processus, NULL); } + depilement_pile_systeme(s_etat_processus); + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; } else if ((*s_etat_processus).erreur_execution != d_ex_nom_implicite) { @@ -4532,123 +4573,159 @@ evaluation(struct_processus *s_etat_proc if (presence_fonction == d_vrai) { - autorisation_empilement_programme = (*s_etat_processus) - .autorisation_empilement_programme; - registre_position_courante = (*s_etat_processus) - .position_courante; - - empilement_pile_systeme(s_etat_processus); - - if ((*s_etat_processus).erreur_systeme != d_es) + if ((*((struct_nom *) (*(*l_element_courant).donnee) + .objet)).symbole == d_vrai) { - if (presence_variable_partagee == d_vrai) + // 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, + (*l_element_courant).donnee, 'P')) == NULL) { - liberation(s_etat_processus, - s_copie_variable_partagee); + (*s_etat_processus).instruction_courante = + instruction_courante; + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return(d_erreur); } - if (presence_egalite == d_vrai) + if (empilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), + s_sous_objet) == d_erreur) { - liberation(s_etat_processus, s_objet_evalue); + (*s_etat_processus).instruction_courante = + instruction_courante; + liberation(s_etat_processus, s_sous_objet); + return(d_erreur); } - - (*s_etat_processus).instruction_courante = - instruction_courante; - return(d_erreur); - } - - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = 'Y'; - (*(*s_etat_processus).l_base_pile_systeme) - .origine_routine_evaluation = 'Y'; - - (*s_etat_processus).mode_execution_programme = 'Y'; - (*s_etat_processus).autorisation_empilement_programme - = 'N'; - - (*(*s_etat_processus).l_base_pile_systeme) - .niveau_courant = (*s_etat_processus) - .niveau_courant; - - if (presence_variable_partagee == d_faux) - { - (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); } else { - (*s_etat_processus).position_courante = - (*((unsigned long *) - (*s_copie_variable_partagee).objet)); - liberation(s_etat_processus, - s_copie_variable_partagee); - } + autorisation_empilement_programme = + (*s_etat_processus) + .autorisation_empilement_programme; + registre_position_courante = (*s_etat_processus) + .position_courante; - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante].nom); + empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { + if (presence_variable_partagee == d_vrai) + { + liberation(s_etat_processus, + s_copie_variable_partagee); + } + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; return(d_erreur); } - } - registre_evaluation_forcee = - (*s_etat_processus).evaluation_forcee; + (*(*s_etat_processus).l_base_pile_systeme) + .retour_definition = 'Y'; + (*(*s_etat_processus).l_base_pile_systeme) + .origine_routine_evaluation = 'Y'; - if (type_evaluation == 'N') - { - (*s_etat_processus).evaluation_forcee = 'Y'; - } + (*s_etat_processus).mode_execution_programme = 'Y'; + (*s_etat_processus) + .autorisation_empilement_programme = 'N'; - if (sequenceur(s_etat_processus) == d_erreur) - { - (*s_etat_processus).evaluation_forcee = - registre_evaluation_forcee; + (*(*s_etat_processus).l_base_pile_systeme) + .niveau_courant = (*s_etat_processus) + .niveau_courant; - if (presence_egalite == d_vrai) + if (presence_variable_partagee == d_faux) { - liberation(s_etat_processus, s_objet_evalue); + (*s_etat_processus).position_courante = + (*((unsigned long *) + ((*((*s_etat_processus) + .s_liste_variables[(*s_etat_processus) + .position_variable_courante] + .objet)).objet))); + } + else + { + (*s_etat_processus).position_courante = + (*((unsigned long *) + (*s_copie_variable_partagee).objet)); + liberation(s_etat_processus, + s_copie_variable_partagee); + } + + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, + (*s_etat_processus).s_liste_variables + [(*s_etat_processus) + .position_variable_courante].nom); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } } + registre_evaluation_forcee = + (*s_etat_processus).evaluation_forcee; + + if (type_evaluation == 'N') + { + (*s_etat_processus).evaluation_forcee = 'Y'; + } + + if (sequenceur(s_etat_processus) == d_erreur) + { + (*s_etat_processus).evaluation_forcee = + registre_evaluation_forcee; + + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + (*s_etat_processus).instruction_courante = + instruction_courante; + (*s_etat_processus).mode_execution_programme = + registre_mode_execution_programme; + return(d_erreur); + } + + (*s_etat_processus).evaluation_forcee = + registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; - (*s_etat_processus).mode_execution_programme = - registre_mode_execution_programme; - return(d_erreur); - } - - (*s_etat_processus).evaluation_forcee = - registre_evaluation_forcee; - (*s_etat_processus).instruction_courante = - instruction_courante; - (*s_etat_processus).mode_execution_programme = 'N'; + (*s_etat_processus).mode_execution_programme = 'N'; - depilement_pile_systeme(s_etat_processus); + depilement_pile_systeme(s_etat_processus); - if ((*s_etat_processus).erreur_systeme != d_es) - { - if (presence_egalite == d_vrai) + if ((*s_etat_processus).erreur_systeme != d_es) { - liberation(s_etat_processus, s_objet_evalue); + if (presence_egalite == d_vrai) + { + liberation(s_etat_processus, + s_objet_evalue); + } + + return(d_erreur); } - return(d_erreur); + (*s_etat_processus).retour_routine_evaluation = 'N'; + (*s_etat_processus).position_courante = + registre_position_courante; + (*s_etat_processus) + .autorisation_empilement_programme = + autorisation_empilement_programme; } - - (*s_etat_processus).retour_routine_evaluation = 'N'; - (*s_etat_processus).position_courante = - registre_position_courante; - (*s_etat_processus).autorisation_empilement_programme = - autorisation_empilement_programme; } else if (((type_evaluation == 'N') || ((*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole ==