@@ -16,8 +16,13 @@ static PyObject *AttributeValue(const void *node, const char *prop) {
1616}
1717
1818static const char * String (const void * node , const char * prop ) {
19+ const char * retval = NULL ;
1920 PyObject * o = Attribute (node , prop );
20- return o ? PyUnicode_AsUTF8 (o ) : NULL ;
21+ if (o != NULL ) {
22+ retval = PyUnicode_AsUTF8 (o );
23+ Py_DECREF (o );
24+ }
25+ return retval ;
2126}
2227
2328static size_t Size (const void * node , const char * prop ) {
@@ -26,8 +31,14 @@ static size_t Size(const void *node, const char *prop) {
2631}
2732
2833static PyObject * ItemAt (PyObject * object , int index ) {
34+ PyObject * retval = NULL ;
2935 PyObject * seq = PySequence_Fast (object , "expected a sequence" );
30- return PyList_GET_ITEM (seq , index );
36+ if (seq != NULL ) {
37+ retval = PyList_GET_ITEM (seq , index );
38+ Py_DECREF (seq );
39+ }
40+
41+ return retval ;
3142}
3243
3344
@@ -68,8 +79,13 @@ static const char *PropertyKeyAt(const void *node, int index) {
6879 return NULL ;
6980 }
7081
82+ const char * retval = NULL ;
7183 PyObject * keys = PyMapping_Keys (properties );
72- return keys ? PyUnicode_AsUTF8 (ItemAt (keys , index )) : NULL ;
84+ if (keys != NULL ) {
85+ retval = PyUnicode_AsUTF8 (ItemAt (keys , index ));
86+ Py_DECREF (keys );
87+ }
88+ return retval ;
7389}
7490
7591static const char * PropertyValueAt (const void * node , int index ) {
@@ -78,8 +94,13 @@ static const char *PropertyValueAt(const void *node, int index) {
7894 return NULL ;
7995 }
8096
97+ const char * retval = NULL ;
8198 PyObject * values = PyMapping_Values (properties );
82- return values ? PyUnicode_AsUTF8 (ItemAt (values , index )) : NULL ;
99+ if (values != NULL ) {
100+ retval = PyUnicode_AsUTF8 (ItemAt (values , index ));
101+ Py_DECREF (values );
102+ }
103+ return retval ;
83104}
84105
85106static uint32_t PositionValue (const void * node , const char * prop , const char * field ) {
@@ -275,7 +296,9 @@ static PyObject *PyFilter(PyObject *self, PyObject *args)
275296 PyList_SET_ITEM (list , i , node );
276297 }
277298 NodesFree (nodes );
278- return PySeqIter_New (list );
299+ PyObject * iter = PySeqIter_New (list );
300+ Py_DECREF (list );
301+ return iter ;
279302}
280303
281304static PyMethodDef extension_methods [] = {
0 commit comments