fix: catch missing self argument in overloads constructor (#2914)

This commit is contained in:
Robert Haschke 2021-04-02 19:13:44 +02:00 committed by GitHub
parent 3df0ee6fe3
commit c2db53da56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 6 deletions

View File

@ -555,8 +555,8 @@ protected:
auto self_value_and_holder = value_and_holder(); auto self_value_and_holder = value_and_holder();
if (overloads->is_constructor) { if (overloads->is_constructor) {
if (!PyObject_TypeCheck(parent.ptr(), (PyTypeObject *) overloads->scope.ptr())) { if (!parent || !PyObject_TypeCheck(parent.ptr(), (PyTypeObject *) overloads->scope.ptr())) {
PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument"); PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid or missing `self` argument");
return nullptr; return nullptr;
} }

View File

@ -486,7 +486,9 @@ def test_invalid_self():
# Same as above, but for a class with an alias: # Same as above, but for a class with an alias:
class BrokenTF6(m.TestFactory6): class BrokenTF6(m.TestFactory6):
def __init__(self, bad): def __init__(self, bad):
if bad == 1: if bad == 0:
m.TestFactory6.__init__()
elif bad == 1:
a = m.TestFactory2(tag.pointer, 1) a = m.TestFactory2(tag.pointer, 1)
m.TestFactory6.__init__(a, tag.base, 1) m.TestFactory6.__init__(a, tag.base, 1)
elif bad == 2: elif bad == 2:
@ -506,13 +508,13 @@ def test_invalid_self():
BrokenTF1(arg) BrokenTF1(arg)
assert ( assert (
str(excinfo.value) str(excinfo.value)
== "__init__(self, ...) called with invalid `self` argument" == "__init__(self, ...) called with invalid or missing `self` argument"
) )
for arg in (1, 2, 3, 4): for arg in (0, 1, 2, 3, 4):
with pytest.raises(TypeError) as excinfo: with pytest.raises(TypeError) as excinfo:
BrokenTF6(arg) BrokenTF6(arg)
assert ( assert (
str(excinfo.value) str(excinfo.value)
== "__init__(self, ...) called with invalid `self` argument" == "__init__(self, ...) called with invalid or missing `self` argument"
) )