mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
Wrote down the invariants of some common objects whose structure is
exposed in header files. Fixed a few comments in these headers. As we might have expected, writing down invariants systematically exposed a (minor) bug. In this case, function objects have a writeable func_code attribute, which could be set to code objects with the wrong number of free variables. Calling the resulting function segfaulted the interpreter. Added a corresponding test.
This commit is contained in:
parent
063e1e846d
commit
89a39461bf
12 changed files with 98 additions and 25 deletions
|
@ -218,11 +218,11 @@ d[foo]
|
|||
|
||||
# Test all predefined function attributes systematically
|
||||
|
||||
def cantset(obj, name, value):
|
||||
def cantset(obj, name, value, exception=(AttributeError, TypeError)):
|
||||
verify(hasattr(obj, name)) # Otherwise it's probably a typo
|
||||
try:
|
||||
setattr(obj, name, value)
|
||||
except (AttributeError, TypeError):
|
||||
except exception:
|
||||
pass
|
||||
else:
|
||||
raise TestFailed, "shouldn't be able to set %s to %r" % (name, value)
|
||||
|
@ -279,11 +279,20 @@ def test_func_name():
|
|||
|
||||
|
||||
def test_func_code():
|
||||
a = b = 24
|
||||
def f(): pass
|
||||
def g(): print 12
|
||||
def f1(): print a
|
||||
def g1(): print b
|
||||
def f2(): print a, b
|
||||
verify(type(f.func_code) is types.CodeType)
|
||||
f.func_code = g.func_code
|
||||
cantset(f, "func_code", None)
|
||||
# can't change the number of free vars
|
||||
cantset(f, "func_code", f1.func_code, exception=ValueError)
|
||||
cantset(f1, "func_code", f.func_code, exception=ValueError)
|
||||
cantset(f1, "func_code", f2.func_code, exception=ValueError)
|
||||
f1.func_code = g1.func_code
|
||||
|
||||
def test_func_defaults():
|
||||
def f(a, b): return (a, b)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue