--- rpl/src/gestion_pile_systeme.c 2010/06/24 10:10:41 1.13 +++ rpl/src/gestion_pile_systeme.c 2012/08/22 10:47:14 1.45 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.17 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -131,6 +131,7 @@ empilement_pile_systeme(struct_processus (*(*s_etat_processus).l_base_pile_systeme).clause = ' '; (*(*s_etat_processus).l_base_pile_systeme).adresse_retour = 0; (*(*s_etat_processus).l_base_pile_systeme).niveau_courant = 0; + (*(*s_etat_processus).l_base_pile_systeme).pointeur_adresse_retour = NULL; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL; (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = NULL; @@ -301,9 +302,17 @@ effacement_pile_systeme(struct_processus void trace(struct_processus *s_etat_processus, FILE *flux) { + integer8 i; + integer8 candidat; + + long delta; + + struct_liste_chainee *l_variable; + struct_liste_chainee *l_candidat; + struct_liste_pile_systeme *l_element_courant; - integer8 i; + unsigned char *tampon; l_element_courant = (*s_etat_processus).l_base_pile_systeme; i = 0; @@ -324,7 +333,7 @@ trace(struct_processus *s_etat_processus while(l_element_courant != NULL) { - fprintf(flux, "%d : D=", i--); + fprintf(flux, "%d : (%016X) D=", i--, l_element_courant); fprintf(flux, ((*l_element_courant).creation_variables_statiques == d_vrai) ? "1" : "0"); @@ -344,26 +353,66 @@ trace(struct_processus *s_etat_processus if ((*l_element_courant).retour_definition == 'Y') { - fprintf(flux, "RTRN "); + fprintf(flux, "RTN "); if ((*l_element_courant).origine_routine_evaluation == 'Y') { fprintf(flux, "EVL "); - - if ((*l_element_courant).adresse_retour != 0) - { - fprintf(flux, "P=%lu", (*l_element_courant) - .adresse_retour); - } } else { fprintf(flux, "SEQ "); - if ((*l_element_courant).pointeur_objet_retour != NULL) + if ((*l_element_courant).adresse_retour != 0) { - fprintf(flux, "A=%X", (*l_element_courant) - .pointeur_objet_retour); + fprintf(flux, "P=%016X", (*l_element_courant) + .adresse_retour); + + // Calcul de la routine de départ + + l_variable = (struct_liste_chainee *) + (*(*(*s_etat_processus) + .l_liste_variables_par_niveau).precedent).liste; + candidat = (*s_etat_processus) + .longueur_definitions_chainees; + l_candidat = NULL; + + // l_variable balaie les variables de niveau 0. + + while(l_variable != NULL) + { + if ((*(*((struct_variable *) (*l_variable).donnee)) + .objet).type == ADR) + { + delta = (*l_element_courant).adresse_retour + - (*((unsigned long *) + (*(*((struct_variable *) (*l_variable) + .donnee)).objet).objet)); + + if ((delta > 0) && (delta < candidat)) + { + candidat = delta; + l_candidat = l_variable; + } + } + + l_variable = (*l_variable).suivant; + } + + if (l_candidat != NULL) + { + fprintf(flux, "\n Call from %s", + (*((struct_variable *) (*l_candidat).donnee)) + .nom); + } + else + { + fprintf(flux, "\n Call from RPL/2 initialization"); + } + } + else + { + fprintf(flux, "RPL/2 initialization"); } } } @@ -374,27 +423,85 @@ trace(struct_processus *s_etat_processus if ((*l_element_courant).origine_routine_evaluation == 'Y') { fprintf(flux, "EVL "); - - if ((*l_element_courant).adresse_retour != 0) - { - fprintf(flux, "P=%lu", (*l_element_courant) - .adresse_retour); - } } else { fprintf(flux, "SEQ "); - if ((*l_element_courant).pointeur_objet_retour != NULL) + if ((*l_element_courant).pointeur_adresse_retour != NULL) { - fprintf(flux, "A=%X", (*l_element_courant) - .pointeur_objet_retour); + fprintf(flux, "A=%016X ", (*l_element_courant) + .pointeur_adresse_retour); + + // Calcul de la routine de départ + + l_variable = (struct_liste_chainee *) + (*(*(*s_etat_processus) + .l_liste_variables_par_niveau).precedent).liste; + candidat = (*s_etat_processus) + .longueur_definitions_chainees; + l_candidat = NULL; + + // l_variable balaie les variables de niveau 0. + + while(l_variable != NULL) + { + if ( (*(*l_variable).donnee).objet == + (*l_element_courant).pointeur_adresse_retour) + { + l_candidat = l_variable; + break; + } + + l_variable = (*l_variable).suivant; + } + + if (l_candidat != NULL) + { + fprintf(flux, "\n Branch to %s", + (*((struct_variable *) (*l_candidat).donnee)) + .nom); + } + else + { + fprintf(flux, "\n Branch to evaluation subroutine"); + } } } } fprintf(flux, "\n"); + if ((*l_element_courant).indice_boucle != NULL) + { + tampon = formateur(s_etat_processus, 0, + (*l_element_courant).indice_boucle); + fprintf(flux, " Index = %s\n", tampon); + free(tampon); + } + + if ((*l_element_courant).limite_indice_boucle != NULL) + { + tampon = formateur(s_etat_processus, 0, + (*l_element_courant).limite_indice_boucle); + fprintf(flux, " Limit = %s\n", tampon); + free(tampon); + } + + if ((*l_element_courant).objet_de_test != NULL) + { + tampon = formateur(s_etat_processus, 0, + (*l_element_courant).objet_de_test); + fprintf(flux, " Test object = %s\n", tampon); + free(tampon); + } + + if ((*l_element_courant).nom_variable != NULL) + { + fprintf(flux, " Variable name = %s\n", + (*l_element_courant).nom_variable); + } + l_element_courant = (*l_element_courant).suivant; }