2047 static PyObject *
2048 richcompare(PyObject *v, PyObject *w, int op)
2049 {
2050 int cmp, k, vi, wi;
2051 idx_t i;
2052
2053 if (!bitarray_Check(v) || !bitarray_Check(w)) {
taking True path
when considering range: -0x80000000 <= value <= -1
taking False path
taking True path
when considering range: -0x80000000 <= value <= -1
taking False path
2054 Py_INCREF(Py_NotImplemented);
2055 return Py_NotImplemented;
2056 }
2057 #define va ((bitarrayobject *) v)
2058 #define wa ((bitarrayobject *) w)
2059 if (va->nbits != wa->nbits && (op == Py_EQ || op == Py_NE)) {
when taking True path
when considering range: 2 <= value <= 0x7ffffffd
taking False path
2060 /* Shortcut: if the lengths differ, the bitarrays differ */
2061 if (op == Py_EQ)
2062 Py_RETURN_FALSE;
2063
2064 Py_RETURN_TRUE;
2065 }
2066 /* to avoid uninitialized warning for some compilers */
2067 vi = wi = 0;
2068 /* Search for the first index where items are different */
2069 k = 1;
2070 for (i = 0; i < va->nbits && i < wa->nbits; i++) {
when considering range: 1 <= value <= 0x7fffffffffffffff
taking True path
when considering range: 1 <= value <= 0x7fffffffffffffff
taking True path
when considering range: -0x8000000000000000 <= value <= 1
taking False path
2071 vi = GETBIT(va, i);
when treating unknown char * from bitarray/_bitarray.c:2071 as non-NULL
when considering range: -0x80000000 <= value <= -1
taking True path
when considering value == (int)0 from bitarray/_bitarray.c:2071
2072 wi = GETBIT(wa, i);
when treating unknown char * from bitarray/_bitarray.c:2072 as non-NULL
when considering range: -0x80000000 <= value <= -1
taking True path
when considering value == (int)0 from bitarray/_bitarray.c:2072
2073 k = (vi == wi);
2074 if (k == 0)
taking False path
2075 break;
2076 }
2077 if (k) {
taking True path
2078 /* No more items to compare -- compare sizes */
2079 idx_t vs = va->nbits;
2080 idx_t ws = wa->nbits;
2081 #undef va
2082 #undef wa
2083 switch (op) {
when following default
2084 case Py_LT: cmp = vs < ws; break;
2085 case Py_LE: cmp = vs <= ws; break;
2086 case Py_EQ: cmp = vs == ws; break;
2087 case Py_NE: cmp = vs != ws; break;
2088 case Py_GT: cmp = vs > ws; break;
2089 case Py_GE: cmp = vs >= ws; break;
2090 default: return NULL; /* cannot happen */
2091 }
2092 if (cmp)
2093 Py_RETURN_TRUE;
2094
2095 Py_RETURN_FALSE;
2096 }
2097 /* We have an item that differs. First, shortcuts for EQ/NE */
2098 if (op == Py_EQ)
2099 Py_RETURN_FALSE;
2100
2101 if (op == Py_NE)
2102 Py_RETURN_TRUE;
2103
2104 /* Compare the final item using the proper operator */
2105 switch (op) {
2106 case Py_LT: cmp = vi < wi; break;
2107 case Py_LE: cmp = vi <= wi; break;
2108 case Py_EQ: cmp = vi == wi; break;
2109 case Py_NE: cmp = vi != wi; break;
2110 case Py_GT: cmp = vi > wi; break;
2111 case Py_GE: cmp = vi >= wi; break;
2112 default: return NULL; /* cannot happen */
2113 }
2114 if (cmp)
2115 Py_RETURN_TRUE;
2116
2117 Py_RETURN_FALSE;
2118 }
returning (PyObject*)NULL without setting an exception
found 2 similar trace(s) to this