From 4b324fcb8cade30755b3e2afdc30bc2c66eedae8 Mon Sep 17 00:00:00 2001 From: Jun Komoda <45822440+junkmd@users.noreply.github.com> Date: Wed, 23 Oct 2024 14:30:46 +0000 Subject: [PATCH] Add a test. Such an implementation is used in `CoClass` of `comtypes`. --- .../test_ctypes/test_c_simple_type_meta.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Lib/test/test_ctypes/test_c_simple_type_meta.py b/Lib/test/test_ctypes/test_c_simple_type_meta.py index 3da701d39432e7..de97ca690f8421 100644 --- a/Lib/test/test_ctypes/test_c_simple_type_meta.py +++ b/Lib/test/test_ctypes/test_c_simple_type_meta.py @@ -47,3 +47,32 @@ class _Sub2(_Sub): self.assertTrue(issubclass(POINTER(_Sub2), _Sub2)) self.assertTrue(issubclass(POINTER(_Sub2), POINTER(_Sub))) self.assertTrue(issubclass(POINTER(_Sub), POINTER(_CtBase))) + + def test_early_return_in_dunder_new_2(self): + # Such an implementation is used in `CoClass` of `comtypes`. + + class _ct_meta(type): + def __new__(cls, name, bases, namespace): + self = super().__new__(cls, name, bases, namespace) + if isinstance(self, _p_meta): + return self + p = _p_meta( + f"POINTER({self.__name__})", (self, c_void_p), {} + ) + ctypes._pointer_type_cache[self] = p + return self + + class _p_meta(PyCSimpleType, _ct_meta): + pass + + class _Core(object): + pass + + class _CtBase(_Core, metaclass=_ct_meta): + pass + + class _Sub(_CtBase): + pass + + self.assertIsInstance(POINTER(_Sub), _p_meta) + self.assertTrue(issubclass(POINTER(_Sub), _Sub))