Skip to content

Commit cf81f03

Browse files
committed
Add a test.
Such an implementation is used in `CoClass` of `comtypes`.
1 parent 80deddb commit cf81f03

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

Lib/test/test_ctypes/test_c_simple_type_meta.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,32 @@ class _Sub2(_Sub):
4747
self.assertTrue(issubclass(POINTER(_Sub2), _Sub2))
4848
self.assertTrue(issubclass(POINTER(_Sub2), POINTER(_Sub)))
4949
self.assertTrue(issubclass(POINTER(_Sub), POINTER(_CtBase)))
50+
51+
def test_early_return_in_dunder_new_2(self):
52+
# Such an implementation is used in `CoClass` of `comtypes`.
53+
54+
class _ct_meta(type):
55+
def __new__(cls, name, bases, namespace):
56+
self = super().__new__(cls, name, bases, namespace)
57+
if isinstance(self, _p_meta):
58+
return self
59+
p = _p_meta(
60+
f"POINTER({self.__name__})", (self, c_void_p), {}
61+
)
62+
ctypes._pointer_type_cache[self] = p
63+
return self
64+
65+
class _p_meta(PyCSimpleType, _ct_meta):
66+
pass
67+
68+
class _Core(object):
69+
pass
70+
71+
class _CtBase(_Core, metaclass=_ct_meta):
72+
pass
73+
74+
class _Sub(_CtBase):
75+
pass
76+
77+
self.assertIsInstance(POINTER(_Sub), _p_meta)
78+
self.assertTrue(issubclass(POINTER(_Sub), _Sub))

0 commit comments

Comments
 (0)