Merge changes from 59576 from trunk to p3yk branch; these were skipped

in the regular merge.  Fixes issue #1693.
This commit is contained in:
Guido van Rossum 2008-01-01 04:06:48 +00:00
parent a9de06d2c5
commit f5243f07f6
1 changed files with 16 additions and 13 deletions

View File

@ -3167,28 +3167,22 @@ inherit_special(PyTypeObject *type, PyTypeObject *base)
type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS; type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
} }
/* Map rich comparison operators to their __xx__ namesakes */ static char *hash_name_op[] = {
static char *name_op[] = {
"__lt__",
"__le__",
"__eq__", "__eq__",
"__ne__",
"__gt__",
"__ge__",
/* These are only for overrides_cmp_or_hash(): */
"__cmp__", "__cmp__",
"__hash__", "__hash__",
NULL
}; };
static int static int
overrides_cmp_or_hash(PyTypeObject *type) overrides_hash(PyTypeObject *type)
{ {
int i; char **p;
PyObject *dict = type->tp_dict; PyObject *dict = type->tp_dict;
assert(dict != NULL); assert(dict != NULL);
for (i = 0; i < 8; i++) { for (p = hash_name_op; *p; p++) {
if (PyDict_GetItemString(dict, name_op[i]) != NULL) if (PyDict_GetItemString(dict, *p) != NULL)
return 1; return 1;
} }
return 0; return 0;
@ -3314,7 +3308,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
if (type->tp_compare == NULL && if (type->tp_compare == NULL &&
type->tp_richcompare == NULL && type->tp_richcompare == NULL &&
type->tp_hash == NULL && type->tp_hash == NULL &&
!overrides_cmp_or_hash(type)) !overrides_hash(type))
{ {
type->tp_compare = base->tp_compare; type->tp_compare = base->tp_compare;
type->tp_richcompare = base->tp_richcompare; type->tp_richcompare = base->tp_richcompare;
@ -4739,6 +4733,15 @@ slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
return 0; return 0;
} }
static char *name_op[] = {
"__lt__",
"__le__",
"__eq__",
"__ne__",
"__gt__",
"__ge__",
};
static PyObject * static PyObject *
half_richcompare(PyObject *self, PyObject *other, int op) half_richcompare(PyObject *self, PyObject *other, int op)
{ {