Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
e3dfa9e5
Commit
e3dfa9e5
authored
9 years ago
by
Eric Snow
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Issue #16991: Fix a few leaks and other memory-related concerns in OrderedDict.
parent
d0a06455
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
14 additions
and
12 deletions
+14
-12
Objects/odictobject.c
Objects/odictobject.c
+14
-12
No files found.
Objects/odictobject.c
View file @
e3dfa9e5
...
...
@@ -1030,8 +1030,7 @@ odict_reduce(register PyODictObject *od)
goto
Done
;
if
(
!
ns_len
)
{
/* nothing novel to pickle in od.__dict__ */
Py_DECREF
(
ns
);
ns
=
NULL
;
Py_CLEAR
(
ns
);
}
}
...
...
@@ -1184,8 +1183,7 @@ _odict_popkey(PyObject *od, PyObject *key, PyObject *failobj)
value
=
PyObject_GetItem
(
od
,
key
);
if
(
value
!=
NULL
)
{
if
(
PyObject_DelItem
(
od
,
key
)
==
-
1
)
{
Py_DECREF
(
value
);
value
=
NULL
;
Py_CLEAR
(
value
);
}
}
}
...
...
@@ -1718,10 +1716,10 @@ odict_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject
*
od
=
PyDict_Type
.
tp_new
(
type
,
args
,
kwds
);
if
(
od
!=
NULL
)
{
((
PyODictObject
*
)
od
)
->
od_inst_dict
=
PyDict_New
();
((
PyODictObject
*
)
od
)
->
od_weakreflist
=
NULL
;
if
(
_odict_initialize
((
PyODictObject
*
)
od
)
<
0
)
return
NULL
;
((
PyODictObject
*
)
od
)
->
od_inst_dict
=
PyDict_New
();
((
PyODictObject
*
)
od
)
->
od_weakreflist
=
NULL
;
}
return
od
;
}
...
...
@@ -1845,8 +1843,7 @@ odictiter_nextkey(odictiterobject *di)
node
=
_odict_find_node
(
di
->
di_odict
,
di
->
di_current
);
if
(
node
==
NULL
)
{
/* Must have been deleted. */
Py_DECREF
(
di
->
di_current
);
di
->
di_current
=
NULL
;
Py_CLEAR
(
di
->
di_current
);
return
NULL
;
}
key
=
di
->
di_current
;
...
...
@@ -1884,8 +1881,11 @@ odictiter_iternext(odictiterobject *di)
PyObject
*
result
=
di
->
di_result
;
value
=
PyODict_GetItem
((
PyObject
*
)
di
->
di_odict
,
key
);
/* borrowed */
if
(
value
==
NULL
)
if
(
value
==
NULL
)
{
Py_DECREF
(
key
);
return
NULL
;
}
Py_INCREF
(
value
);
if
(
result
->
ob_refcnt
==
1
)
{
/* not in use so we can reuse it
...
...
@@ -1896,11 +1896,13 @@ odictiter_iternext(odictiterobject *di)
}
else
{
result
=
PyTuple_New
(
2
);
if
(
result
==
NULL
)
if
(
result
==
NULL
)
{
Py_DECREF
(
key
);
Py_DECREF
(
value
);
return
NULL
;
}
}
Py_INCREF
(
value
);
PyTuple_SET_ITEM
(
result
,
0
,
key
);
/* steals reference */
PyTuple_SET_ITEM
(
result
,
1
,
value
);
/* steals reference */
...
...
@@ -2365,7 +2367,6 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
else
if
(
PyObject_HasAttrString
(
other
,
"keys"
))
{
/* never fails */
PyObject
*
keys
,
*
iterator
,
*
key
;
keys
=
PyObject_CallMethod
(
other
,
"keys"
,
NULL
);
Py_DECREF
(
other
);
if
(
keys
==
NULL
)
return
NULL
;
iterator
=
PyObject_GetIter
(
keys
);
...
...
@@ -2383,6 +2384,7 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs)
}
Py_DECREF
(
key
);
}
Py_DECREF
(
other
);
Py_DECREF
(
iterator
);
if
(
res
!=
0
||
PyErr_Occurred
())
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment