annotate Lib/symtable.py @ 58925:eecf1bef052d 2.6

Merged revisions 78207 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78207 | ezio.melotti | 2010-02-17 01:26:09 +0200 (Wed, 17 Feb 2010) | 1 line #7930: fix stripid ........
author Ezio Melotti <ezio.melotti@gmail.com>
date Tue, 16 Feb 2010 23:29:44 +0000
parents 6910792fcd4b
children b36cb4602e21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 """Interface to the compiler's internal symbol tables"""
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
2
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 import _symtable
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
4 from _symtable import (USE, DEF_GLOBAL, DEF_LOCAL, DEF_PARAM,
48315
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
5 DEF_IMPORT, DEF_BOUND, OPT_IMPORT_STAR, OPT_EXEC, OPT_BARE_EXEC,
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
6 SCOPE_OFF, SCOPE_MASK, FREE, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7
48315
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
8 import warnings
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9 import weakref
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10
48316
1af211236904 newSymbolTable is not public API
Benjamin Peterson <benjamin@python.org>
parents: 48315
diff changeset
11 __all__ = ["symtable", "SymbolTable", "Class", "Function", "Symbol"]
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13 def symtable(code, filename, compile_type):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 raw = _symtable.symtable(code, filename, compile_type)
35943
5c8dc5d218d8 Get symtable to limp along, can run compiler/symbols.py. Not saying much, needs more work.
Neal Norwitz <nnorwitz@gmail.com>
parents: 23634
diff changeset
15 for top in raw.itervalues():
5c8dc5d218d8 Get symtable to limp along, can run compiler/symbols.py. Not saying much, needs more work.
Neal Norwitz <nnorwitz@gmail.com>
parents: 23634
diff changeset
16 if top.name == 'top':
5c8dc5d218d8 Get symtable to limp along, can run compiler/symbols.py. Not saying much, needs more work.
Neal Norwitz <nnorwitz@gmail.com>
parents: 23634
diff changeset
17 break
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
18 return _newSymbolTable(top, filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 class SymbolTableFactory:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 def __init__(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22 self.__memo = weakref.WeakValueDictionary()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 def new(self, table, filename):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
25 if table.type == _symtable.TYPE_FUNCTION:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 return Function(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
27 if table.type == _symtable.TYPE_CLASS:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 return Class(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29 return SymbolTable(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 def __call__(self, table, filename):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 key = table, filename
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
33 obj = self.__memo.get(key, None)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 if obj is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
35 obj = self.__memo[key] = self.new(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36 return obj
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
37
48316
1af211236904 newSymbolTable is not public API
Benjamin Peterson <benjamin@python.org>
parents: 48315
diff changeset
38 _newSymbolTable = SymbolTableFactory()
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
39
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
40
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
41 class SymbolTable(object):
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
42
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
43 def __init__(self, raw_table, filename):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 self._table = raw_table
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45 self._filename = filename
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46 self._symbols = {}
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48 def __repr__(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 if self.__class__ == SymbolTable:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 kind = ""
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 else:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
52 kind = "%s " % self.__class__.__name__
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
53
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54 if self._table.name == "global":
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
55 return "<{0}SymbolTable for module {1}>".format(kind, self._filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
56 else:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
57 return "<{0}SymbolTable for {1} in {2}>".format(kind,
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
58 self._table.name,
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
59 self._filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 def get_type(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
62 if self._table.type == _symtable.TYPE_MODULE:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63 return "module"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
64 if self._table.type == _symtable.TYPE_FUNCTION:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
65 return "function"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
66 if self._table.type == _symtable.TYPE_CLASS:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 return "class"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
68 assert self._table.type in (1, 2, 3), \
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
69 "unexpected type: {0}".format(self._table.type)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71 def get_id(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
72 return self._table.id
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
73
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
74 def get_name(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
75 return self._table.name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
76
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
77 def get_lineno(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
78 return self._table.lineno
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
79
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
80 def is_optimized(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
81 return bool(self._table.type == _symtable.TYPE_FUNCTION
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
82 and not self._table.optimized)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
83
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
84 def is_nested(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
85 return bool(self._table.nested)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
86
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
87 def has_children(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88 return bool(self._table.children)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
90 def has_exec(self):
17552
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
91 """Return true if the scope uses exec"""
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
92 return bool(self._table.optimized & (OPT_EXEC | OPT_BARE_EXEC))
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
93
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
94 def has_import_star(self):
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
95 """Return true if the scope uses import *"""
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
96 return bool(self._table.optimized & OPT_IMPORT_STAR)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 def get_identifiers(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
99 return self._table.symbols.keys()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
100
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 def lookup(self, name):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102 sym = self._symbols.get(name)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 if sym is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 flags = self._table.symbols[name]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105 namespaces = self.__check_children(name)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
106 sym = self._symbols[name] = Symbol(name, flags, namespaces)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107 return sym
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 def get_symbols(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
110 return [self.lookup(ident) for ident in self.get_identifiers()]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
112 def __check_children(self, name):
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
113 return [_newSymbolTable(st, self._filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
114 for st in self._table.children
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115 if st.name == name]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
116
17192
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
117 def get_children(self):
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
118 return [_newSymbolTable(st, self._filename)
17192
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
119 for st in self._table.children]
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
120
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
121
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122 class Function(SymbolTable):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
124 # Default values for instance variables
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125 __params = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 __locals = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
127 __frees = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
128 __globals = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
129
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
130 def __idents_matching(self, test_func):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
131 return tuple([ident for ident in self.get_identifiers()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
132 if test_func(self._table.symbols[ident])])
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
134 def get_parameters(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
135 if self.__params is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
136 self.__params = self.__idents_matching(lambda x:x & DEF_PARAM)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
137 return self.__params
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
139 def get_locals(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
140 if self.__locals is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
141 self.__locals = self.__idents_matching(lambda x:x & DEF_BOUND)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
142 return self.__locals
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
143
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
144 def get_globals(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
145 if self.__globals is None:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
146 glob = (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
147 test = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) in glob
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
148 self.__globals = self.__idents_matching(test)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
149 return self.__globals
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
150
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
151 def get_frees(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
152 if self.__frees is None:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
153 is_free = lambda x:((x >> SCOPE_OFF) & SCOPE_MASK) == FREE
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
154 self.__frees = self.__idents_matching(is_free)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
155 return self.__frees
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
156
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
157
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
158 class Class(SymbolTable):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
159
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
160 __methods = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
162 def get_methods(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
163 if self.__methods is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
164 d = {}
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
165 for st in self._table.children:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
166 d[st.name] = 1
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
167 self.__methods = tuple(d)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
168 return self.__methods
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
169
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
170
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
171 class Symbol(object):
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
172
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
173 def __init__(self, name, flags, namespaces=None):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
174 self.__name = name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
175 self.__flags = flags
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
176 self.__scope = (flags >> SCOPE_OFF) & SCOPE_MASK # like PyST_GetScope()
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
177 self.__namespaces = namespaces or ()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
178
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
179 def __repr__(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
180 return "<symbol {0!r}>".format(self.__name)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
181
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
182 def get_name(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
183 return self.__name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
184
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
185 def is_referenced(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
186 return bool(self.__flags & _symtable.USE)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
187
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
188 def is_parameter(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
189 return bool(self.__flags & DEF_PARAM)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
190
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
191 def is_global(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
192 return bool(self.__scope in (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT))
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
193
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
194 def is_vararg(self):
48315
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
195 warnings.warn("is_vararg() is obsolete and will be removed",
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
196 DeprecationWarning, 2)
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
197 return False
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
198
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
199 def is_keywordarg(self):
48315
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
200 warnings.warn("is_keywordarg() is obsolete and will be removed",
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
201 DeprecationWarning, 2)
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
202 return False
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
203
52520
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
204 def is_declared_global(self):
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
205 return bool(self.__scope == GLOBAL_EXPLICIT)
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
206
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
207 def is_local(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
208 return bool(self.__flags & DEF_BOUND)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
209
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
210 def is_free(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
211 return bool(self.__scope == FREE)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
212
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
213 def is_imported(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
214 return bool(self.__flags & DEF_IMPORT)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
215
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
216 def is_assigned(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
217 return bool(self.__flags & DEF_LOCAL)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
218
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
219 def is_in_tuple(self):
48315
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
220 warnings.warn("is_in_tuple() is obsolete and will be removed",
abde4db307a5 deprecate some useless, noop methods in symtable
Benjamin Peterson <benjamin@python.org>
parents: 48269
diff changeset
221 DeprecationWarning, 2)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
222
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
223 def is_namespace(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
224 """Returns true if name binding introduces new namespace.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
225
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226 If the name is used as the target of a function or class
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227 statement, this will be true.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
229 Note that a single name can be bound to multiple objects. If
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
230 is_namespace() is true, the name may also be bound to other
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
231 objects, like an int or list, that does not introduce a new
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
232 namespace.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 """
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
234 return bool(self.__namespaces)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
235
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
236 def get_namespaces(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
237 """Return a list of namespaces bound to this name"""
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
238 return self.__namespaces
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
239
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
240 def get_namespace(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
241 """Returns the single namespace bound to this name.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
242
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
243 Raises ValueError if the name is bound to multiple namespaces.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
244 """
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
245 if len(self.__namespaces) != 1:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
246 raise ValueError, "name is bound to multiple namespaces"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
247 return self.__namespaces[0]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
248
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
249 if __name__ == "__main__":
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
250 import os, sys
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
251 src = open(sys.argv[0]).read()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
252 mod = symtable(src, os.path.split(sys.argv[0])[1], "exec")
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
253 for ident in mod.get_identifiers():
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
254 info = mod.lookup(ident)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
255 print info, info.is_local(), info.is_namespace()