summaryrefslogtreecommitdiffstats
path: root/Doc/tools
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>1999-10-20 21:50:31 (GMT)
committerFred Drake <fdrake@acm.org>1999-10-20 21:50:31 (GMT)
commitd6512808f0e5b0953367eeef5adc6a4a7aaaa8c4 (patch)
treeab930518cf59d59e3ef37c2f93f0f1ebf3dad68c /Doc/tools
parent805bf1b330aec153eb9a3487e48a9a0dc3b90503 (diff)
downloadcpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.zip
cpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.tar.gz
cpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.tar.bz2
Module/script to parse the reference count data file and make the
information accessible to Python. When run as a script, just dumps the information back out in the data format, with functions in sorted order and a blank line between different functions. Still need to apply the information somehow.
Diffstat (limited to 'Doc/tools')
-rw-r--r--Doc/tools/refcounts.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/Doc/tools/refcounts.py b/Doc/tools/refcounts.py
new file mode 100644
index 0000000..6056328
--- /dev/null
+++ b/Doc/tools/refcounts.py
@@ -0,0 +1,95 @@
+"""Support functions for loading the reference count data file."""
+__version__ = '$Revision$'
+
+import os
+import string
+import sys
+
+
+# Determine the expected location of the reference count file:
+try:
+ p = os.path.dirname(__file__)
+except NameError:
+ p = sys.path[0]
+p = os.path.normpath(os.path.join(os.getcwd(), p, os.pardir,
+ "api", "refcounts.dat"))
+DEFAULT_PATH = p
+del p
+
+
+def load(path=DEFAULT_PATH):
+ return loadfile(open(path))
+
+
+def loadfile(fp):
+ d = {}
+ while 1:
+ line = fp.readline()
+ if not line:
+ break
+ line = string.strip(line)
+ if line[:1] in ("", "#"):
+ # blank lines and comments
+ continue
+ parts = string.split(line, ":", 4)
+ function, type, arg, refcount, comment = parts
+ if refcount:
+ refcount = int(refcount)
+ else:
+ refcount = None
+ #
+ # Get the entry, creating it if needed:
+ #
+ try:
+ entry = d[function]
+ except KeyError:
+ entry = d[function] = Entry(function)
+ #
+ # Update the entry with the new parameter or the result information.
+ #
+ if arg:
+ entry.args.append((arg, type, refcount))
+ else:
+ entry.result_type = type
+ entry.result_refs = refcount
+ return d
+
+
+class Entry:
+ def __init__(self, name):
+ self.name = name
+ self.args = []
+ self.result_type = ''
+ self.result_refs = None
+
+
+def dump(d):
+ """Dump the data in the 'canonical' format, with functions in
+ sorted order."""
+ items = d.items()
+ items.sort()
+ first = 1
+ for k, entry in items:
+ if first:
+ first = 0
+ else:
+ print
+ s = entry.name + ":%s:%s:%s:"
+ if entry.result_refs is None:
+ r = ""
+ else:
+ r = entry.result_refs
+ print s % (entry.result_type, "", r)
+ for t, n, r in entry.args:
+ if r is None:
+ r = ""
+ print s % (t, n, r)
+
+
+def main():
+ d = load()
+ dump(d)
+
+
+if __name__ == "__main__":
+ main()