annotate Tools/scripts/combinerefs.py @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents fcfe324663a6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 44204
diff changeset
1 #! /usr/bin/env python3
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3 """
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4 combinerefs path
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
6 A helper for analyzing PYTHONDUMPREFS output.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
7
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
8 When the PYTHONDUMPREFS envar is set in a debug build, at Python shutdown
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
9 time Py_Finalize() prints the list of all live objects twice: first it
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
10 prints the repr() of each object while the interpreter is still fully intact.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
11 After cleaning up everything it can, it prints all remaining live objects
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
12 again, but the second time just prints their addresses, refcounts, and type
28697
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
13 names (because the interpreter has been torn down, calling repr methods at
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
14 this point can get into infinite loops or blow up).
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
15
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
16 Save all this output into a file, then run this script passing the path to
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
17 that file. The script finds both output chunks, combines them, then prints
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
18 a line of output for each object still alive at the end:
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
19
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
20 address refcnt typename repr
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
21
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
22 address is the address of the object, in whatever format the platform C
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
23 produces for a %p format code.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
24
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
25 refcnt is of the form
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
26
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
27 "[" ref "]"
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
28
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
29 when the object's refcount is the same in both PYTHONDUMPREFS output blocks,
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
30 or
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
31
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
32 "[" ref_before "->" ref_after "]"
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
33
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
34 if the refcount changed.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
35
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
36 typename is object->ob_type->tp_name, extracted from the second PYTHONDUMPREFS
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
37 output block.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
38
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
39 repr is repr(object), extracted from the first PYTHONDUMPREFS output block.
28697
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
40 CAUTION: If object is a container type, it may not actually contain all the
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
41 objects shown in the repr: the repr was captured from the first output block,
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
42 and some of the containees may have been released since then. For example,
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
43 it's common for the line showing the dict of interned strings to display
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
44 strings that no longer exist at the end of Py_Finalize; this can be recognized
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
45 (albeit painfully) because such containees don't have a line of their own.
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
46
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
47 The objects are listed in allocation order, with most-recently allocated
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
48 printed first, and the first object allocated printed last.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
49
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
50
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
51 Simple examples:
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
52
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
53 00857060 [14] str '__len__'
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
54
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
55 The str object '__len__' is alive at shutdown time, and both PYTHONDUMPREFS
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
56 output blocks said there were 14 references to it. This is probably due to
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
57 C modules that intern the string "__len__" and keep a reference to it in a
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
58 file static.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
59
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
60 00857038 [46->5] tuple ()
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
61
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
62 46-5 = 41 references to the empty tuple were removed by the cleanup actions
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
63 between the times PYTHONDUMPREFS produced output.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
64
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
65 00858028 [1025->1456] str '<dummy key>'
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
66
28697
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
67 The string '<dummy key>', which is used in dictobject.c to overwrite a real
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
68 key that gets deleted, grew several hundred references during cleanup. It
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
69 suggests that stuff did get removed from dicts by cleanup, but that the dicts
018170a4a2d7 Docstring clarifications.
Tim Peters <tim.peters@gmail.com>
parents: 28677
diff changeset
70 themselves are staying alive for some reason. """
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
71
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
72 import re
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
73 import sys
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
74
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
75 # Generate lines from fileiter. If whilematch is true, continue reading
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
76 # while the regexp object pat matches line. If whilematch is false, lines
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
77 # are read so long as pat doesn't match them. In any case, the first line
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
78 # that doesn't match pat (when whilematch is true), or that does match pat
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
79 # (when whilematch is false), is lost, and fileiter will resume at the line
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
80 # following it.
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
81 def read(fileiter, pat, whilematch):
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
82 for line in fileiter:
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
83 if bool(pat.match(line)) == whilematch:
28670
c555cd02b0f9 Heh -- I checked in an old version of this, at a time I documented the
Tim Peters <tim.peters@gmail.com>
parents: 28669
diff changeset
84 yield line
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
85 else:
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
86 break
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
87
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
88 def combine(fname):
44204
50b03afa0bbe Fix a last use of file() that should be open().
Guido van Rossum <guido@python.org>
parents: 42427
diff changeset
89 f = open(fname)
50b03afa0bbe Fix a last use of file() that should be open().
Guido van Rossum <guido@python.org>
parents: 42427
diff changeset
90
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
91 fi = iter(f)
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
92
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
93 for line in read(fi, re.compile(r'^Remaining objects:$'), False):
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
94 pass
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
95
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
96 crack = re.compile(r'([a-zA-Z\d]+) \[(\d+)\] (.*)')
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
97 addr2rc = {}
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
98 addr2guts = {}
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
99 before = 0
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
100 for line in read(fi, re.compile(r'^Remaining object addresses:$'), False):
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
101 m = crack.match(line)
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
102 if m:
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
103 addr, addr2rc[addr], addr2guts[addr] = m.groups()
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
104 before += 1
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
105 else:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
106 print('??? skipped:', line)
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
107
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
108 after = 0
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
109 for line in read(fi, crack, True):
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
110 after += 1
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
111 m = crack.match(line)
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
112 assert m
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
113 addr, rc, guts = m.groups() # guts is type name here
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
114 if addr not in addr2rc:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
115 print('??? new object created while tearing down:', line.rstrip())
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
116 continue
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
117 print(addr, end=' ')
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
118 if rc == addr2rc[addr]:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
119 print('[%s]' % rc, end=' ')
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
120 else:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
121 print('[%s->%s]' % (addr2rc[addr], rc), end=' ')
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
122 print(guts, addr2guts[addr])
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
123
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
124 f.close()
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 28697
diff changeset
125 print("%d objects before, %d after" % (before, after))
28669
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
126
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
127 if __name__ == '__main__':
0d8d4c8dc68b _Py_PrintReferenceAddresses(): also print the type name. In real use
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
128 combine(sys.argv[1])