--- rpl/src/gestion_pile_systeme.c 2010/07/13 08:59:20 1.15 +++ rpl/src/gestion_pile_systeme.c 2010/07/13 13:01:21 1.16 @@ -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; @@ -302,11 +303,17 @@ void trace(struct_processus *s_etat_processus, FILE *flux) { integer8 i; + integer8 candidat; + + long delta; struct_liste_pile_systeme *l_element_courant; unsigned char *tampon; + unsigned long p; + unsigned long v; + l_element_courant = (*s_etat_processus).l_base_pile_systeme; i = 0; @@ -326,7 +333,7 @@ trace(struct_processus *s_etat_processus while(l_element_courant != NULL) { - fprintf(flux, "%d : (%p) D=", i--, l_element_courant); + fprintf(flux, "%d : (%016X) D=", i--, l_element_courant); fprintf(flux, ((*l_element_courant).creation_variables_statiques == d_vrai) ? "1" : "0"); @@ -351,21 +358,53 @@ 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).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 + + candidat = (*s_etat_processus) + .longueur_definitions_chainees; + p = 0; + + for(v = 0; v < (*s_etat_processus).nombre_variables; v++) + { + if ((*s_etat_processus).s_liste_variables[v].niveau + == 0) + { + delta = (*l_element_courant).adresse_retour + - (*((unsigned long *) + ((*(*s_etat_processus) + .s_liste_variables[v].objet).objet))); + + if ((delta > 0) && (delta < candidat)) + { + candidat = delta; + p = v + 1; + } + } + } + + if (p > 0) + { + fprintf(flux, "\n Call from %s", (*s_etat_processus) + .s_liste_variables[p - 1].nom); + } + else + { + fprintf(flux, "\n Call from RPL/2 initialization"); + } + } + else + { + fprintf(flux, "RPL/2 initialization"); } } } @@ -376,21 +415,44 @@ 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 + + p = 0; + + for(v = 0; v < (*s_etat_processus).nombre_variables; v++) + { + if ((*s_etat_processus).s_liste_variables[v].niveau + == 0) + { + if ((*s_etat_processus).s_liste_variables[v].objet + == (*l_element_courant) + .pointeur_adresse_retour) + { + p = v + 1; + break; + } + } + } + + if (p > 0) + { + fprintf(flux, "\n Branch to %s", (*s_etat_processus) + .s_liste_variables[p - 1].nom); + } + else + { + fprintf(flux, "\n Call from RPL/2 initialization"); + } } } }