mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	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.
		
			
				
	
	
		
			95 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""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()
 |