mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 3e0055f8c6
			
		
	
	
		3e0055f8c6
		
	
	
	
	
		
			
			This change implements a new bytecode compiler, based on a transformation of the parse tree to an abstract syntax defined in Parser/Python.asdl. The compiler implementation is not complete, but it is in stable enough shape to run the entire test suite excepting two disabled tests.
		
			
				
	
	
		
			85 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """This module includes tests of the code object representation.
 | |
| 
 | |
| >>> def f(x):
 | |
| ...     def g(y):
 | |
| ...         return x + y
 | |
| ...     return g
 | |
| ...
 | |
| 
 | |
| >>> dump(f.func_code)
 | |
| name: f
 | |
| argcount: 1
 | |
| names: ()
 | |
| varnames: ('x', 'g')
 | |
| cellvars: ('x',)
 | |
| freevars: ()
 | |
| nlocals: 2
 | |
| flags: 3
 | |
| consts: ('None', '<code object g>')
 | |
| 
 | |
| >>> dump(f(4).func_code)
 | |
| name: g
 | |
| argcount: 1
 | |
| names: ()
 | |
| varnames: ('y',)
 | |
| cellvars: ()
 | |
| freevars: ('x',)
 | |
| nlocals: 1
 | |
| flags: 19
 | |
| consts: ('None',)
 | |
| 
 | |
| >>> def h(x, y):
 | |
| ...     a = x + y
 | |
| ...     b = x - y
 | |
| ...     c = a * b
 | |
| ...     return c
 | |
| ... 
 | |
| >>> dump(h.func_code)
 | |
| name: h
 | |
| argcount: 2
 | |
| names: ()
 | |
| varnames: ('x', 'y', 'a', 'b', 'c')
 | |
| cellvars: ()
 | |
| freevars: ()
 | |
| nlocals: 5
 | |
| flags: 67
 | |
| consts: ('None',)
 | |
| 
 | |
| >>> def attrs(obj):
 | |
| ...     print obj.attr1
 | |
| ...     print obj.attr2
 | |
| ...     print obj.attr3
 | |
| 
 | |
| >>> dump(attrs.func_code)
 | |
| name: attrs
 | |
| argcount: 1
 | |
| names: ('attr1', 'attr2', 'attr3')
 | |
| varnames: ('obj',)
 | |
| cellvars: ()
 | |
| freevars: ()
 | |
| nlocals: 1
 | |
| flags: 67
 | |
| consts: ('None',)
 | |
| 
 | |
| """
 | |
| 
 | |
| def consts(t):
 | |
|     """Yield a doctest-safe sequence of object reprs."""
 | |
|     for elt in t:
 | |
|         r = repr(elt)
 | |
|         if r.startswith("<code object"):
 | |
|             yield "<code object %s>" % elt.co_name
 | |
|         else:
 | |
|             yield r
 | |
| 
 | |
| def dump(co):
 | |
|     """Print out a text representation of a code object."""
 | |
|     for attr in ["name", "argcount", "names", "varnames", "cellvars",
 | |
|                  "freevars", "nlocals", "flags"]:
 | |
|         print "%s: %s" % (attr, getattr(co, "co_" + attr))
 | |
|     print "consts:", tuple(consts(co.co_consts))
 | |
| 
 | |
| def test_main(verbose=None):
 | |
|     from test.test_support import run_doctest
 | |
|     from test import test_code
 | |
|     run_doctest(test_code, verbose)
 |