def _COMPARE_OP(op, arg0, arg1): result = llfalse slow = 0 ret_val = llpy_null if (arg0 != llpy_null) and (arg1 != llpy_null): if _PyInt_CheckExact(arg0) and _PyInt_CheckExact(arg1): arg0_l = PyInt_AsLong(arg0) arg1_l = PyInt_AsLong(arg1) if op == PyCmp_LT: result = arg0 < arg1 elif op == PyCmp_LE: result = arg0 <= arg1 elif op == PyCmp_EQ: result = arg0 == arg1 elif op == PyCmp_NE: result = arg0 != arg1 elif op == PyCmp_GT: result = arg0 > arg1 elif op == PyCmp_GE: result = arg0 >= arg1 elif op == PyCmp_IS: result = arg0 == arg1 elif op == PyCmp_IS_NOT: result = arg0 != arg1 else: slow = 1 else: slow = 1 if slow != 0: ret_val = _cmp_outcome(op, arg0, arg1) else: ret_val = PyBool_FromLong(lc_long(result)) _DECREF(arg0) _DECREF(arg1) return ret_val
def _cmp_outcome(op, arg0, arg1): result = llfalse result_i = lc_int(0) if op == PyCmp_IS: result = arg0 == arg1 elif op == PyCmp_IS_NOT: result = arg0 != arg1 elif op == PyCmp_IN: result_i = PySequence_Contains(arg1, arg0) if result_i < 0: return llpy_null result = li1(result_i) elif op == PyCmp_NOT_IN: result_i = PySequence_Contains(arg1, arg0) if result_i < 0: return llpy_null result = ~li1(result_i) elif op == PyCmp_EXC_MATCH: # XXX: Generate warnings result = li1(PyErr_GivenExceptionMatches(arg0, arg1)) else: return PyObject_RichCompare(arg0, arg1, op) return PyBool_FromLong(lc_long(result))