annotate Lib/symtable.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents b36cb4602e21
children f1b7b5979e96
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,
54919
411884d01f8b return locals and cells in get_locals() not bound globals, though
Benjamin Peterson <benjamin@python.org>
parents: 52511
diff changeset
6 SCOPE_OFF, SCOPE_MASK, FREE, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL, LOCAL)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 import weakref
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9
48316
1af211236904 newSymbolTable is not public API
Benjamin Peterson <benjamin@python.org>
parents: 48315
diff changeset
10 __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
11
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
12 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
13 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
14 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
15 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
16 break
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
17 return _newSymbolTable(top, filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
18
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
19 class SymbolTableFactory:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
20 def __init__(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21 self.__memo = weakref.WeakValueDictionary()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
22
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
23 def new(self, table, filename):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
24 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
25 return Function(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
26 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
27 return Class(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 return SymbolTable(table, filename)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
29
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
30 def __call__(self, table, filename):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
31 key = table, filename
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
32 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
33 if obj is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
34 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
35 return obj
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
36
48316
1af211236904 newSymbolTable is not public API
Benjamin Peterson <benjamin@python.org>
parents: 48315
diff changeset
37 _newSymbolTable = SymbolTableFactory()
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
38
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
39
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
40 class SymbolTable(object):
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
41
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
42 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
43 self._table = raw_table
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
44 self._filename = filename
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
45 self._symbols = {}
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
46
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
47 def __repr__(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
48 if self.__class__ == SymbolTable:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 kind = ""
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 else:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 kind = "%s " % self.__class__.__name__
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
52
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
53 if self._table.name == "global":
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
54 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
55 else:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
56 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
57 self._table.name,
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
58 self._filename)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
59
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
60 def get_type(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 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
62 return "module"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63 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
64 return "function"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
65 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
66 return "class"
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
67 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
68 "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
69
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70 def get_id(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
71 return self._table.id
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
72
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
73 def get_name(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
74 return self._table.name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
75
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
76 def get_lineno(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
77 return self._table.lineno
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
78
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
79 def is_optimized(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
80 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
81 and not self._table.optimized)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
82
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
83 def is_nested(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
84 return bool(self._table.nested)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
85
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
86 def has_children(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
87 return bool(self._table.children)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
88
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
89 def has_exec(self):
17552
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
90 """Return true if the scope uses exec"""
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
91 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
92
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
93 def has_import_star(self):
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
94 """Return true if the scope uses import *"""
05436a74012d Fix three PyChecker-detected gotchas.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17245
diff changeset
95 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
96
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
97 def get_identifiers(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
98 return self._table.symbols.keys()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
99
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
100 def lookup(self, name):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
101 sym = self._symbols.get(name)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
102 if sym is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
103 flags = self._table.symbols[name]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
104 namespaces = self.__check_children(name)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
105 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
106 return sym
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
107
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
108 def get_symbols(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
109 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
110
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
111 def __check_children(self, name):
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
112 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
113 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
114 if st.name == name]
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
115
17192
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
116 def get_children(self):
48317
0fe6cb0c310d fix silly errors of mine
Benjamin Peterson <benjamin@python.org>
parents: 48316
diff changeset
117 return [_newSymbolTable(st, self._filename)
17192
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
118 for st in self._table.children]
1153796d21c2 flesh out __all__
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17161
diff changeset
119
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
120
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 class Function(SymbolTable):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
122
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123 # Default values for instance variables
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
124 __params = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
125 __locals = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 __frees = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
127 __globals = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
128
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
129 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
130 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
131 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
132
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
133 def get_parameters(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
134 if self.__params is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
135 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
136 return self.__params
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
137
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138 def get_locals(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
139 if self.__locals is None:
54919
411884d01f8b return locals and cells in get_locals() not bound globals, though
Benjamin Peterson <benjamin@python.org>
parents: 52511
diff changeset
140 locs = (LOCAL, CELL)
411884d01f8b return locals and cells in get_locals() not bound globals, though
Benjamin Peterson <benjamin@python.org>
parents: 52511
diff changeset
141 test = lambda x: ((x >> SCOPE_OFF) & SCOPE_MASK) in locs
411884d01f8b return locals and cells in get_locals() not bound globals, though
Benjamin Peterson <benjamin@python.org>
parents: 52511
diff changeset
142 self.__locals = self.__idents_matching(test)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
143 return self.__locals
17245
0377f927cafa Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 17192
diff changeset
144
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
145 def get_globals(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
146 if self.__globals is None:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
147 glob = (GLOBAL_IMPLICIT, GLOBAL_EXPLICIT)
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
148 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
149 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
150 return self.__globals
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
151
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
152 def get_frees(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
153 if self.__frees is None:
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
154 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
155 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
156 return self.__frees
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
157
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
158
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
159 class Class(SymbolTable):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
160
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
161 __methods = None
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
162
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
163 def get_methods(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
164 if self.__methods is None:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
165 d = {}
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
166 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
167 d[st.name] = 1
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 22830
diff changeset
168 self.__methods = tuple(d)
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
169 return self.__methods
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
170
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
171
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
172 class Symbol(object):
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
173
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
174 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
175 self.__name = name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
176 self.__flags = flags
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
177 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
178 self.__namespaces = namespaces or ()
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
179
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
180 def __repr__(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
181 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
182
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
183 def get_name(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
184 return self.__name
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
185
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
186 def is_referenced(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
187 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
188
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
189 def is_parameter(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
190 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
191
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
192 def is_global(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
193 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
194
52520
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
195 def is_declared_global(self):
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
196 return bool(self.__scope == GLOBAL_EXPLICIT)
6910792fcd4b Merged revisions 70801,70809 via svnmerge from
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 48317
diff changeset
197
17161
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
198 def is_local(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
199 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
200
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
201 def is_free(self):
48269
c36ccf2a71e1 get the symtable module back in working order
Benjamin Peterson <benjamin@python.org>
parents: 35943
diff changeset
202 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
203
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
204 def is_imported(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
205 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
206
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
207 def is_assigned(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_LOCAL)
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_namespace(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
211 """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
212
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
213 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
214 statement, this will be true.
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 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
217 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
218 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
219 namespace.
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
220 """
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
221 return bool(self.__namespaces)
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 get_namespaces(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
224 """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
225 return self.__namespaces
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
226
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
227 def get_namespace(self):
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
228 """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
229
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
230 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
231 """
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
232 if len(self.__namespaces) != 1:
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
233 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
234 return self.__namespaces[0]
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 if __name__ == "__main__":
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
237 import os, sys
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
238 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
239 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
240 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
241 info = mod.lookup(ident)
e3b5d03e3d7d First cut at a high-level symbol table interface
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
242 print info, info.is_local(), info.is_namespace()