mirror of
https://github.com/python/cpython.git
synced 2025-07-25 20:24:11 +00:00

Most uses of PyCode_New found by http://www.google.com/codesearch?q=PyCode_New are trying to build an empty code object, usually to put it in a dummy frame object. This patch adds a PyCode_NewEmpty wrapper which lets the user specify just the filename, function name, and first line number, instead of also requiring lots of code internals.
120 lines
2.3 KiB
Python
120 lines
2.3 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 optimize_away():
|
|
... 'doc string'
|
|
... 'not a docstring'
|
|
... 53
|
|
... 53L
|
|
|
|
>>> dump(optimize_away.func_code)
|
|
name: optimize_away
|
|
argcount: 0
|
|
names: ()
|
|
varnames: ()
|
|
cellvars: ()
|
|
freevars: ()
|
|
nlocals: 0
|
|
flags: 67
|
|
consts: ("'doc string'", 'None')
|
|
|
|
"""
|
|
|
|
import unittest
|
|
import _testcapi
|
|
|
|
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))
|
|
|
|
|
|
class CodeTest(unittest.TestCase):
|
|
|
|
def test_newempty(self):
|
|
co = _testcapi.code_newempty("filename", "funcname", 15)
|
|
self.assertEquals(co.co_filename, "filename")
|
|
self.assertEquals(co.co_name, "funcname")
|
|
self.assertEquals(co.co_firstlineno, 15)
|
|
|
|
|
|
def test_main(verbose=None):
|
|
from test.test_support import run_doctest, run_unittest
|
|
from test import test_code
|
|
run_doctest(test_code, verbose)
|
|
run_unittest(CodeTest)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
test_main()
|