mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#! /usr/bin/env python
 | 
						|
"""Add reference count annotations to the Python/C API Reference."""
 | 
						|
__version__ = '$Revision$'
 | 
						|
 | 
						|
import getopt
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
import refcounts
 | 
						|
 | 
						|
 | 
						|
PREFIX_1 = r"\begin{cfuncdesc}{PyObject*}{"
 | 
						|
PREFIX_2 = r"\begin{cfuncdesc}{PyVarObject*}{"
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    rcfile = os.path.join(os.path.dirname(refcounts.__file__), os.pardir,
 | 
						|
                          "api", "refcounts.dat")
 | 
						|
    outfile = "-"
 | 
						|
    opts, args = getopt.getopt(sys.argv[1:], "o:r:", ["output=", "refcounts="])
 | 
						|
    for opt, arg in opts:
 | 
						|
        if opt in ("-o", "--output"):
 | 
						|
            outfile = arg
 | 
						|
        elif opt in ("-r", "--refcounts"):
 | 
						|
            rcfile = arg
 | 
						|
    rcdict = refcounts.load(rcfile)
 | 
						|
    if outfile == "-":
 | 
						|
        output = sys.stdout
 | 
						|
    else:
 | 
						|
        output = open(outfile, "w")
 | 
						|
    if not args:
 | 
						|
        args = ["-"]
 | 
						|
    for infile in args:
 | 
						|
        if infile == "-":
 | 
						|
            input = sys.stdin
 | 
						|
        else:
 | 
						|
            input = open(infile)
 | 
						|
        while 1:
 | 
						|
            line = input.readline()
 | 
						|
            if not line:
 | 
						|
                break
 | 
						|
            prefix = None
 | 
						|
            if line.startswith(PREFIX_1):
 | 
						|
                prefix = PREFIX_1
 | 
						|
            elif line.startswith(PREFIX_2):
 | 
						|
                prefix = PREFIX_2
 | 
						|
            if prefix:
 | 
						|
                s = line[len(prefix):].split('}', 1)[0]
 | 
						|
                try:
 | 
						|
                    info = rcdict[s]
 | 
						|
                except KeyError:
 | 
						|
                    sys.stderr.write("No refcount data for %s\n" % s)
 | 
						|
                else:
 | 
						|
                    if info.result_type in ("PyObject*", "PyVarObject*"):
 | 
						|
                        if info.result_refs is None:
 | 
						|
                            rc = "Always \NULL{}"
 | 
						|
                        else:
 | 
						|
                            rc = info.result_refs and "New" or "Borrowed"
 | 
						|
                            rc = rc + " reference"
 | 
						|
                        line = (r"\begin{cfuncdesc}[%s]{%s}{"
 | 
						|
                                % (rc, info.result_type)) \
 | 
						|
                                + line[len(prefix):]
 | 
						|
            output.write(line)
 | 
						|
        if infile != "-":
 | 
						|
            input.close()
 | 
						|
    if outfile != "-":
 | 
						|
        output.close()
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |