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:
Moshe Zadka 2001-01-29 06:21:17 +00:00
parent 2beeb22533
commit 497671e094
3 changed files with 28 additions and 40 deletions

View file

@ -154,3 +154,22 @@ def another():
# 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]

View file

@ -50,12 +50,12 @@ def __init__(self, ignore):
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 @@ def __init__(self, ignore):
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')

View file

@ -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*/