Skip to content

Commit b32d914

Browse files
committed
static analyze: python dynamic_cast checks
1 parent f670a99 commit b32d914

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

modules/python/src2/gen2.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@
1111

1212
ignored_arg_types = ["RNG*"]
1313

14-
gen_template_check_self = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
14+
gen_template_check_self = Template(""" $cname* _self_ = NULL;
15+
if(PyObject_TypeCheck(self, &pyopencv_${name}_Type))
16+
_self_ = ${amp}((pyopencv_${name}_t*)self)->v${get};
17+
if (_self_ == NULL)
1518
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
16-
$cname* _self_ = ${amp}((pyopencv_${name}_t*)self)->v${get};
1719
""")
1820

19-
gen_template_check_self_algo = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
21+
gen_template_check_self_algo = Template(""" $cname* _self_ = NULL;
22+
if(PyObject_TypeCheck(self, &pyopencv_${name}_Type))
23+
_self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.get());
24+
if (_self_ == NULL)
2025
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
21-
$cname* _self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.get());
2226
""")
2327

2428
gen_template_call_constructor_prelude = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
@@ -200,7 +204,10 @@
200204
gen_template_get_prop_algo = Template("""
201205
static PyObject* pyopencv_${name}_get_${member}(pyopencv_${name}_t* p, void *closure)
202206
{
203-
return pyopencv_from(dynamic_cast<$cname*>(p->v.get())${access}${member});
207+
$cname* _self_ = dynamic_cast<$cname*>(p->v.get());
208+
if (_self_ == NULL)
209+
return failmsgp("Incorrect type of object (must be '${name}' or its derivative)");
210+
return pyopencv_from(_self_${access}${member});
204211
}
205212
""")
206213

@@ -224,7 +231,13 @@
224231
PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
225232
return -1;
226233
}
227-
return pyopencv_to(value, dynamic_cast<$cname*>(p->v.get())${access}${member}) ? 0 : -1;
234+
$cname* _self_ = dynamic_cast<$cname*>(p->v.get());
235+
if (_self_ == NULL)
236+
{
237+
failmsgp("Incorrect type of object (must be '${name}' or its derivative)");
238+
return -1;
239+
}
240+
return pyopencv_to(value, _self_${access}${member}) ? 0 : -1;
228241
}
229242
""")
230243

0 commit comments

Comments
 (0)