1 #@ MODIF nommage Noyau DATE 18/03/2003 AUTEUR VABHHTS J.PELLET
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 Ce module sert à nommer les concepts produits par les commandes.
23 Le nom du concept est obtenu en appelant la fonction GetNomConceptResultat
24 du module avec le nom de la commande en argument.
26 Cette fonction parcourt le source dans lequel la commande se trouve, parse le
27 fichier et retrouve le nom du concept qui se trouve à gauche du signe = précédant
28 le nom de la commande.
30 Cette fonction utilise la fonction cur_frame du module N_utils qui retourne la frame
31 d'exécution Python située 2 niveaux au-dessus. C'est à partir de cette frame que
32 l'on retrouve le fichier source et le numéro de ligne où se trouve l'appel à la commande.
45 def GetNomConceptResultat(ope):
47 Cette fonction recherche dans la pile des appels, l'appel à la commande
48 qui doit etre situé à 2 niveaux au-dessus (cur_frame(2)).
49 On retrouve d'abord la frame d'exécution f. Puis le numéro de la ligne
50 dans le source f.f_lineno et le nom du fichier source (f.f_code.co_filename).
51 A partir de là, on récupère la ligne de source avec linecache.getline
52 et on vérifie que cette ligne correspond véritablement à l'appel.
54 En effet, lorsque les commandes tiennent sur plusieurs lignes, on retrouve
55 la dernière ligne. Il faut donc remonter dans le source jusqu'à la première
58 Enfin la fonction evalnom forme un nom acceptable lorsque le concept est un
59 élément d'une liste, par exemple.
62 f=N_utils.cur_frame(2)
63 lineno = f.f_lineno # XXX Too bad if -O is used
64 #lineno = f_lineno(f) # Ne marche pas toujours
66 filename = co.co_filename
68 #print "NOMOP,FICHIER, LIGNE ",ope,filename,lineno
69 line = linecache.getline(filename, lineno)
70 if not line: line = None
76 if re.search(regex1 % ope,line):
77 l=re.split(regex1 % ope,line)
79 #print "COMMANDE ",string.join(list)
81 # On suppose que le concept resultat a bien ete
82 # isole en tete de la ligne de source
83 m=evalnom(string.strip(l[0]),f.f_locals)
85 if m!=[] : return m[-1]
88 line = linecache.getline(filename, lineno)
90 #print "appel inconnu"
95 Retourne un nom pour le concept resultat identifie par text
96 Pour obtenir ce nom il y a plusieurs possibilites :
97 1. text est un identificateur python c est le nom du concept
98 2. text est un element d une liste on construit le nom en
99 evaluant la partie indice dans le contexte de l appelant d
101 l=re.split('([\[\]]+)',text)
103 if l[-1] == '' :l=l[:-1]
108 ll=string.split(s,',')
109 ll=re.split('[ ,]+',s)
110 if ll[0] == '' :ll=ll[1:]
116 if i+1<len(l) and l[i+1] == '[': # le nom est suivi d un subscript
118 nom=id0+'_'+str(eval(sub,d))
128 Calcule le numero de ligne courant
129 Devrait marcher meme avec -O
130 Semble ne pas marcher en présence de tuples longs
133 if not hasattr(c, 'co_lnotab'):return f.f_lineno
135 line = c.co_firstlineno
138 for i in range(0, len(tab), 2):
139 addr = addr + ord(tab[i])
142 line = line + ord(tab[i+1])