source: vendor/python/2.5/Lib/compiler/symbols.py

Last change on this file was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 14.2 KB
Line 
1"""Module symbol-table generator"""
2
3from compiler import ast
4from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL, SC_UNKNOWN
5from compiler.misc import mangle
6import types
7
8
9import sys
10
11MANGLE_LEN = 256
12
13class Scope:
14 # XXX how much information do I need about each name?
15 def __init__(self, name, module, klass=None):
16 self.name = name
17 self.module = module
18 self.defs = {}
19 self.uses = {}
20 self.globals = {}
21 self.params = {}
22 self.frees = {}
23 self.cells = {}
24 self.children = []
25 # nested is true if the class could contain free variables,
26 # i.e. if it is nested within another function.
27 self.nested = None
28 self.generator = None
29 self.klass = None
30 if klass is not None:
31 for i in range(len(klass)):
32 if klass[i] != '_':
33 self.klass = klass[i:]
34 break
35
36 def __repr__(self):
37 return "<%s: %s>" % (self.__class__.__name__, self.name)
38
39 def mangle(self, name):
40 if self.klass is None:
41 return name
42 return mangle(name, self.klass)
43
44 def add_def(self, name):
45 self.defs[self.mangle(name)] = 1
46
47 def add_use(self, name):
48 self.uses[self.mangle(name)] = 1
49
50 def add_global(self, name):
51 name = self.mangle(name)
52 if self.uses.has_key(name) or self.defs.has_key(name):
53 pass # XXX warn about global following def/use
54 if self.params.has_key(name):
55 raise SyntaxError, "%s in %s is global and parameter" % \
56 (name, self.name)
57 self.globals[name] = 1
58 self.module.add_def(name)
59
60 def add_param(self, name):
61 name = self.mangle(name)
62 self.defs[name] = 1
63 self.params[name] = 1
64
65 def get_names(self):
66 d = {}
67 d.update(self.defs)
68 d.update(self.uses)
69 d.update(self.globals)
70 return d.keys()