annotate Lib/persist.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 517d29ebc840
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # persist.py
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Implement limited persistence.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Simple interface:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # persist.save() save __main__ module on file (overwrite)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # persist.load() load __main__ module from file (merge)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # These use the filename persist.defaultfile, initialized to 'wsrestore.py'.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # A raw interface also exists:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # persist.writedict(dict, fp) save dictionary to open file
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # persist.readdict(dict, fp) read (merge) dictionary from open file
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # Internally, the function dump() and a whole bunch of support of functions
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # traverse a graph of objects and print them in a restorable form
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # (which happens to be a Python module).
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # XXX Limitations:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 # - Volatile objects are dumped as strings:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 # - open files, windows etc.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # - Other 'obscure' objects are dumped as strings:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # - classes, instances and methods
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # - compiled regular expressions
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # - anything else reasonably obscure (e.g., capabilities)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # - type objects for obscure objects
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 # - It's slow when there are many of lists or dictionaries
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # (This could be fixed if there were a quick way to compute a hash
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 # function of any object, even if recursive)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 defaultfile = 'wsrestore.py'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 def save():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 import __main__
776
7259e96a04a9 posix -> os
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
35 import os
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # XXX On SYSV, if len(defaultfile) >= 14, this is wrong!
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 backup = defaultfile + '~'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 try:
776
7259e96a04a9 posix -> os
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
39 os.unlink(backup)
7259e96a04a9 posix -> os
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
40 except os.error:
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 pass
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 try:
776
7259e96a04a9 posix -> os
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
43 os.rename(defaultfile, backup)
7259e96a04a9 posix -> os
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
44 except os.error:
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 pass
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 fp = open(defaultfile, 'w')
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 writedict(__main__.__dict__, fp)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 fp.close()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 def load():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 import __main__
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 fp = open(defaultfile, 'r')
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 readdict(__main__.__dict__, fp)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 def writedict(dict, fp):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 import sys
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 savestdout = sys.stdout
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 try:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 sys.stdout = fp
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 dump(dict) # Writes to sys.stdout
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 finally:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 sys.stdout = savestdout
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 def readdict(dict, fp):
217
1958723bfe02 Remove reference to util.
Guido van Rossum <guido@python.org>
parents: 195
diff changeset
65 contents = fp.read()
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 globals = {}
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 exec(contents, globals)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 top = globals['top']
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 for key in top.keys():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 if dict.has_key(key):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 print 'warning:', key, 'not overwritten'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 else:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 dict[key] = top[key]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 # Function dump(x) prints (on sys.stdout!) a sequence of Python statements
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 # that, when executed in an empty environment, will reconstruct the
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 # contents of an arbitrary dictionary.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 import sys
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 # Name used for objects dict on output.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 FUNNYNAME = FN = 'A'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 # Top-level function. Call with the object you want to dump.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 def dump(x):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 types = {}
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 stack = [] # Used by test for recursive objects
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 print FN, '= {}'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 topuid = dumpobject(x, types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 print 'top =', FN, '[', `topuid`, ']'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 # Generic function to dump any object.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 dumpswitch = {}
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 def dumpobject(x, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 typerepr = `type(x)`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 if not types.has_key(typerepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 types[typerepr] = {}
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 typedict = types[typerepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 if dumpswitch.has_key(typerepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 return dumpswitch[typerepr](x, typedict, types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 else:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 return dumpbadvalue(x, typedict, types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 # Generic function to dump unknown values.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 # This assumes that the Python interpreter prints such values as
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 # <foo object at xxxxxxxx>.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 # The object will be read back as a string: '<foo object at xxxxxxxx>'.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 # In some cases it may be possible to fix the dump manually;
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 # to ease the editing, these cases are labeled with an XXX comment.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 def dumpbadvalue(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 xrepr = `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 if typedict.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 return typedict[xrepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 typedict[xrepr] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 print FN, '[', `uid`, '] =', `xrepr`, '# XXX'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 # Generic function to dump pure, simple values, except strings
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 def dumpvalue(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 xrepr = `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 if typedict.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 return typedict[xrepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 typedict[xrepr] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 print FN, '[', `uid`, '] =', `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 # Functions to dump string objects
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 def dumpstring(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 # XXX This can break if strings have embedded '\0' bytes
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 # XXX because of a bug in the dictionary module
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 if typedict.has_key(x):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 return typedict[x]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 typedict[x] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 print FN, '[', `uid`, '] =', `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 # Function to dump type objects
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 typeswitch = {}
529
1efdb15221dd New class syntax.
Guido van Rossum <guido@python.org>
parents: 217
diff changeset
151 class some_class:
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 def method(self): pass
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 some_instance = some_class()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 def dumptype(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 xrepr = `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 if typedict.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 return typedict[xrepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 typedict[xrepr] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 if typeswitch.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 print FN, '[', `uid`, '] =', typeswitch[xrepr]
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
163 elif x == type(sys):
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 print 'import sys'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 print FN, '[', `uid`, '] = type(sys)'
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
166 elif x == type(sys.stderr):
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 print 'import sys'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 print FN, '[', `uid`, '] = type(sys.stderr)'
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
169 elif x == type(dumptype):
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 print 'def some_function(): pass'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 print FN, '[', `uid`, '] = type(some_function)'
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
172 elif x == type(some_class):
1291
517d29ebc840 * ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents: 776
diff changeset
173 print 'class some_class: pass'
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 print FN, '[', `uid`, '] = type(some_class)'
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
175 elif x == type(some_instance):
1291
517d29ebc840 * ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents: 776
diff changeset
176 print 'class another_class: pass'
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 print 'some_instance = another_class()'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 print FN, '[', `uid`, '] = type(some_instance)'
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 529
diff changeset
179 elif x == type(some_instance.method):
1291
517d29ebc840 * ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents: 776
diff changeset
180 print 'class yet_another_class:'
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 print ' def method(): pass'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 print 'another_instance = yet_another_class()'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 print FN, '[', `uid`, '] = type(another_instance.method)'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 else:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 # Unknown type
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 print FN, '[', `uid`, '] =', `xrepr`, '# XXX'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 # Initialize the typeswitch
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 for x in None, 0, 0.0, '', (), [], {}:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 typeswitch[`type(x)`] = 'type(' + `x` + ')'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 for s in 'type(0)', 'abs', '[].append':
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 typeswitch[`type(eval(s))`] = 'type(' + s + ')'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 # Dump a tuple object
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 def dumptuple(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 item_uids = []
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 xrepr = ''
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 for item in x:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 item_uid = dumpobject(item, types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 item_uids.append(item_uid)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 xrepr = xrepr + ' ' + item_uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 del stack[-1:]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 if typedict.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 return typedict[xrepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 typedict[xrepr] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 print FN, '[', `uid`, '] = (',
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 for item_uid in item_uids:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 print FN, '[', `item_uid`, '],',
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 print ')'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 # Dump a list object
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 def dumplist(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 # Check for recursion
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 for x1, uid1 in stack:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 if x is x1: return uid1
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 # Check for occurrence elsewhere in the typedict
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 for uid1 in typedict.keys():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 if x is typedict[uid1]: return uid1
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 # This uses typedict differently!
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 typedict[uid] = x
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 print FN, '[', `uid`, '] = []'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 stack.append(x, uid)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 item_uids = []
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 for item in x:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 item_uid = dumpobject(item, types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 item_uids.append(item_uid)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 del stack[-1:]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 for item_uid in item_uids:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 print FN, '[', `uid`, '].append(', FN, '[', `item_uid`, '])'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 # Dump a dictionary object
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 def dumpdict(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 # Check for recursion
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 for x1, uid1 in stack:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 if x is x1: return uid1
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 # Check for occurrence elsewhere in the typedict
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 for uid1 in typedict.keys():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 if x is typedict[uid1]: return uid1
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 # This uses typedict differently!
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 typedict[uid] = x
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 print FN, '[', `uid`, '] = {}'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 stack.append(x, uid)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 item_uids = []
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 for key in x.keys():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 val_uid = dumpobject(x[key], types, stack)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 item_uids.append(key, val_uid)
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 del stack[-1:]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 for key, val_uid in item_uids:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 print FN, '[', `uid`, '][', `key`, '] =',
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 print FN, '[', `val_uid`, ']'
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 # Dump a module object
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 def dumpmodule(x, typedict, types, stack):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 xrepr = `x`
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 if typedict.has_key(xrepr):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 return typedict[xrepr]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 from string import split
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 # `x` has the form <module 'foo'>
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 name = xrepr[9:-2]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 uid = genuid()
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 typedict[xrepr] = uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 print 'import', name
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 print FN, '[', `uid`, '] =', name
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 return uid
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 # Initialize dumpswitch, a table of functions to dump various objects,
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 # indexed by `type(x)`.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 for x in None, 0, 0.0:
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 dumpswitch[`type(x)`] = dumpvalue
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 for x, f in ('', dumpstring), (type(0), dumptype), ((), dumptuple), \
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 ([], dumplist), ({}, dumpdict), (sys, dumpmodule):
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 dumpswitch[`type(x)`] = f
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 # Generate the next unique id; a string consisting of digits.
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 # The seed is stored as seed[0].
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 seed = [0]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 #
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 def genuid():
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 x = seed[0]
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 seed[0] = seed[0] + 1
45f43f755e5c Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 return `x`