mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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()
 | 
