diff --git a/Objects/funcobject.c b/Objects/funcobject.c index cf08af738d2..4dc0b9034d2 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -106,6 +106,27 @@ func_repr(op) return newstringobject(buf); } +static int +func_compare(f, g) + funcobject *f, *g; +{ + if (f->func_globals != g->func_globals) + return (f->func_globals < g->func_globals) ? -1 : 1; + return cmpobject(f->func_code, g->func_code); +} + +static long +func_hash(f) + funcobject *f; +{ + long h; + h = hashobject(f->func_code); + if (h == -1) return h; + h = h ^ (long)f->func_globals; + if (h == -1) h = -2; + return h; +} + typeobject Functype = { OB_HEAD_INIT(&Typetype) 0, @@ -116,6 +137,10 @@ typeobject Functype = { 0, /*tp_print*/ func_getattr, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + func_compare, /*tp_compare*/ func_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + func_hash, /*tp_hash*/ }; diff --git a/Python/compile.c b/Python/compile.c index 3a6d1819c05..565c65cbfcd 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -92,6 +92,35 @@ code_repr(co) return newstringobject(buf); } +static int +code_compare(co, cp) + codeobject *co, *cp; +{ + int cmp; + cmp = cmpobject((object *)co->co_code, (object *)cp->co_code); + if (cmp) return cmp; + cmp = cmpobject(co->co_consts, cp->co_consts); + if (cmp) return cmp; + cmp = cmpobject(co->co_names, cp->co_names); + return cmp; +} + +static long +code_hash(co) + codeobject *co; +{ + long h, h1, h2, h3; + h1 = hashobject((object *)co->co_code); + if (h1 == -1) return -1; + h2 = hashobject(co->co_consts); + if (h2 == -1) return -1; + h3 = hashobject(co->co_names); + if (h3 == -1) return -1; + h = h1 ^ h2 ^ h3; + if (h == -1) h = -2; + return h; +} + typeobject Codetype = { OB_HEAD_INIT(&Typetype) 0, @@ -102,11 +131,12 @@ typeobject Codetype = { 0, /*tp_print*/ code_getattr, /*tp_getattr*/ 0, /*tp_setattr*/ - 0, /*tp_compare*/ + code_compare, /*tp_compare*/ code_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ + code_hash, /*tp_hash*/ }; codeobject *