13#include "nuitka/prelude.h"
16python_init_proc default_tp_init_wrapper;
18#if PYTHON_VERSION < 0x300
19static cmpfunc default_tp_compare;
22void _initSlotCompare(
void) {
28 PyThreadState *tstate = PyThreadState_GET();
31 PyObject *pos_args = MAKE_TUPLE1(tstate, (PyObject *)&PyLong_Type);
35 PyObject *kw_args = PyDict_New();
36#if PYTHON_VERSION < 0x0300
37 PyDict_SetItem(kw_args, const_str_plain___cmp__, Py_True);
39 PyDict_SetItem(kw_args, const_str_plain___init__, (PyObject *)Py_TYPE(Py_None));
42 CHECK_OBJECT(const_str_plain___cmp__);
43 PyTypeObject *c = (PyTypeObject *)PyObject_CallFunctionObjArgs((PyObject *)&PyType_Type, const_str_plain___cmp__,
44 pos_args, kw_args, NULL);
50#if PYTHON_VERSION < 0x0300
51 assert(c->tp_compare);
52 default_tp_compare = c->tp_compare;
56 default_tp_init_wrapper = c->tp_init;
61#if PYTHON_VERSION < 0x300
63static inline int adjust_tp_compare(
int c) {
64 PyThreadState *tstate = PyThreadState_GET();
66 if (HAS_ERROR_OCCURRED(tstate)) {
68 }
else if (c < -1 || c > 1) {
69 return c < -1 ? -1 : 1;
75static inline int coerce_objects(PyObject **pa, PyObject **pb) {
80 if (a->ob_type == b->ob_type && !PyType_HasFeature(a->ob_type, Py_TPFLAGS_CHECKTYPES)) {
86 if (a->ob_type->tp_as_number && a->ob_type->tp_as_number->nb_coerce) {
87 int res = (*a->ob_type->tp_as_number->nb_coerce)(pa, pb);
93 if (b->ob_type->tp_as_number && b->ob_type->tp_as_number->nb_coerce) {
94 int res = (*b->ob_type->tp_as_number->nb_coerce)(pb, pa);
104static int try_3way_compare(PyObject *a, PyObject *b) {
105 cmpfunc f1 = a->ob_type->tp_compare;
106 cmpfunc f2 = b->ob_type->tp_compare;
110 if (f1 != NULL && f1 == f2) {
112 return adjust_tp_compare(c);
117 if (f1 == default_tp_compare || f2 == default_tp_compare) {
118 return default_tp_compare(a, b);
122 c = coerce_objects(&a, &b);
131 f1 = a->ob_type->tp_compare;
132 if (f1 != NULL && f1 == b->ob_type->tp_compare) {
137 return adjust_tp_compare(c);
148static inline bool IS_SANE_TYPE(PyTypeObject *type) {
150#if PYTHON_VERSION < 0x300
151 type == &PyString_Type || type == &PyInt_Type ||
153 type == &PyLong_Type || type == &PyList_Type || type == &PyTuple_Type;