with self.assertRaises(TypeError):
issubclass(list, type_)
+ def test_or_type_operator_with_bad_module(self):
+ class TypeVar:
+ @property
+ def __module__(self):
+ 1 / 0
+ # Crashes in Issue44483
+ with self.assertRaises(ZeroDivisionError):
+ str | TypeVar()
+
def test_ellipsis_type(self):
self.assertIsInstance(Ellipsis, types.EllipsisType)
return is_typing_module(obj);
}
+// Emulates short-circuiting behavior of the ``||`` operator
+// while also checking negative values.
+#define CHECK_RES(res) { \
+ int result = res; \
+ if (result) { \
+ return result; \
+ } \
+}
+
+// Returns 1 on true, 0 on false, and -1 on error.
static int
is_unionable(PyObject *obj)
{
return 1;
}
PyTypeObject *type = Py_TYPE(obj);
+ CHECK_RES(is_typevar(obj));
+ CHECK_RES(is_new_type(obj));
+ CHECK_RES(is_special_form(obj));
return (
- is_typevar(obj) ||
- is_new_type(obj) ||
- is_special_form(obj) ||
+ // The following checks never fail.
PyType_Check(obj) ||
PyObject_TypeCheck(obj, &Py_GenericAliasType) ||
type == &_Py_UnionType);