diff options
author | Moshe Zadka <moshez@math.huji.ac.il> | 2001-01-29 06:21:17 (GMT) |
---|---|---|
committer | Moshe Zadka <moshez@math.huji.ac.il> | 2001-01-29 06:21:17 (GMT) |
commit | 497671e094b7f18221cc1f872bfe68afc57c860b (patch) | |
tree | 82c5fb1c0b85a8670c71c9146ee9c5b34c08a43e | |
parent | 2beeb22533acf5fbc29e650003a79d633aecffc0 (diff) | |
download | cpython-497671e094b7f18221cc1f872bfe68afc57c860b.zip cpython-497671e094b7f18221cc1f872bfe68afc57c860b.tar.gz cpython-497671e094b7f18221cc1f872bfe68afc57c860b.tar.bz2 |
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
-rw-r--r-- | Lib/test/test_funcattrs.py | 19 | ||||
-rw-r--r-- | Lib/test/test_opcodes.py | 14 | ||||
-rw-r--r-- | Objects/funcobject.c | 35 |
3 files changed, 28 insertions, 40 deletions
diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py index 9c07a8f..0591ba6 100644 --- a/Lib/test/test_funcattrs.py +++ b/Lib/test/test_funcattrs.py @@ -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] + diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py index 5381e4d..31569d5 100644 --- a/Lib/test/test_opcodes.py +++ b/Lib/test/test_opcodes.py @@ -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') diff --git a/Objects/funcobject.c b/Objects/funcobject.c index b7e25aa..b166d60 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -270,37 +270,6 @@ func_repr(PyFunctionObject *op) } 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) { int err; @@ -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*/ |