mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +08:00
The one thing I love more then writing code is deleting code.
* Removed func_hash and func_compare, so they can be treated as immutable content-less objects (address hash and comparison) * Added tests to that affect to test_funcattrs (also testing func_code is writable) * Reverse meaning of tests in test_opcodes which checked identical code gets identical functions
This commit is contained in:
parent
2beeb22533
commit
497671e094
@ -154,3 +154,22 @@ else: raise TestFailed
|
||||
# This isn't specifically related to function attributes, but it does test a
|
||||
# core dump regression in funcobject.c
|
||||
del another.func_defaults
|
||||
|
||||
def foo():
|
||||
pass
|
||||
|
||||
def bar():
|
||||
pass
|
||||
|
||||
def temp():
|
||||
print 1
|
||||
|
||||
if foo==bar: raise TestFailed
|
||||
|
||||
d={}
|
||||
d[foo] = 1
|
||||
|
||||
foo.func_code = temp.func_code
|
||||
|
||||
d[foo]
|
||||
|
||||
|
@ -50,12 +50,12 @@ b = BClass()
|
||||
|
||||
try: raise AClass, b
|
||||
except BClass, v:
|
||||
if v != b: raise TestFailed
|
||||
else: raise TestFailed
|
||||
if v != b: raise TestFailed, "v!=b"
|
||||
else: raise TestFailed, "no exception"
|
||||
|
||||
try: raise b
|
||||
except AClass, v:
|
||||
if v != b: raise TestFailed
|
||||
if v != b: raise TestFailed, "v!=b AClass"
|
||||
|
||||
# not enough arguments
|
||||
try: raise BClass, a
|
||||
@ -64,21 +64,21 @@ except TypeError: pass
|
||||
try: raise DClass, a
|
||||
except DClass, v:
|
||||
if not isinstance(v, DClass):
|
||||
raise TestFailed
|
||||
raise TestFailed, "v not DClass"
|
||||
|
||||
print '2.3 comparing function objects'
|
||||
|
||||
f = eval('lambda: None')
|
||||
g = eval('lambda: None')
|
||||
if f != g: raise TestFailed
|
||||
if f == g: raise TestFailed, "functions should not be same"
|
||||
|
||||
f = eval('lambda a: a')
|
||||
g = eval('lambda a: a')
|
||||
if f != g: raise TestFailed
|
||||
if f == g: raise TestFailed, "functions should not be same"
|
||||
|
||||
f = eval('lambda a=1: a')
|
||||
g = eval('lambda a=1: a')
|
||||
if f != g: raise TestFailed
|
||||
if f == g: raise TestFailed, "functions should not be same"
|
||||
|
||||
f = eval('lambda: 0')
|
||||
g = eval('lambda: 1')
|
||||
|
@ -269,37 +269,6 @@ func_repr(PyFunctionObject *op)
|
||||
return PyString_FromString(buf);
|
||||
}
|
||||
|
||||
static int
|
||||
func_compare(PyFunctionObject *f, PyFunctionObject *g)
|
||||
{
|
||||
int c;
|
||||
if (f->func_globals != g->func_globals)
|
||||
return (f->func_globals < g->func_globals) ? -1 : 1;
|
||||
if (f->func_defaults != g->func_defaults) {
|
||||
if (f->func_defaults == NULL)
|
||||
return -1;
|
||||
if (g->func_defaults == NULL)
|
||||
return 1;
|
||||
c = PyObject_Compare(f->func_defaults, g->func_defaults);
|
||||
if (c != 0)
|
||||
return c;
|
||||
}
|
||||
return PyObject_Compare(f->func_code, g->func_code);
|
||||
}
|
||||
|
||||
static long
|
||||
func_hash(PyFunctionObject *f)
|
||||
{
|
||||
long h,x;
|
||||
h = PyObject_Hash(f->func_code);
|
||||
if (h == -1) return h;
|
||||
x = _Py_HashPointer(f->func_globals);
|
||||
if (x == -1) return x;
|
||||
h ^= x;
|
||||
if (h == -1) h = -2;
|
||||
return h;
|
||||
}
|
||||
|
||||
static int
|
||||
func_traverse(PyFunctionObject *f, visitproc visit, void *arg)
|
||||
{
|
||||
@ -347,12 +316,12 @@ PyTypeObject PyFunction_Type = {
|
||||
0, /*tp_print*/
|
||||
0, /*tp_getattr*/
|
||||
0, /*tp_setattr*/
|
||||
(cmpfunc)func_compare, /*tp_compare*/
|
||||
0, /*tp_compare*/
|
||||
(reprfunc)func_repr, /*tp_repr*/
|
||||
0, /*tp_as_number*/
|
||||
0, /*tp_as_sequence*/
|
||||
0, /*tp_as_mapping*/
|
||||
(hashfunc)func_hash, /*tp_hash*/
|
||||
0, /*tp_hash*/
|
||||
0, /*tp_call*/
|
||||
0, /*tp_str*/
|
||||
(getattrofunc)func_getattro, /*tp_getattro*/
|
||||
|
Loading…
Reference in New Issue
Block a user