Skip to content

Commit 28e4aa6

Browse files
author
Anselm Kruis
committed
merge 3.3-slp (Stackless python#117)
2 parents ee7479d + 494f2c2 commit 28e4aa6

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

Python/ceval.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,7 @@ slp_eval_frame_setup_with(PyFrameObject *f, int throwflag, PyObject *retval)
12631263
* SETUP_WITH operation.
12641264
* NOTE / XXX: see above.
12651265
*/
1266-
Py_XINCREF(f); /* fool the link optimizer */
1266+
Py_XINCREF(f); /* fool the link optimizer */
12671267
Py_XINCREF(retval); /* fool the link optimizer */
12681268
r = slp_eval_frame_value(f, throwflag, retval);
12691269
Py_XDECREF(retval);
@@ -1282,7 +1282,7 @@ slp_eval_frame_with_cleanup(PyFrameObject *f, int throwflag, PyObject *retval)
12821282
* NOTE / XXX: see above.
12831283
*/
12841284
Py_XINCREF(f); /* fool the link optimizer */
1285-
Py_XINCREF(f); /* fool the link optimizer */
1285+
Py_XINCREF(f); /* fool the link optimizer */
12861286
r = slp_eval_frame_value(f, throwflag, retval);
12871287
Py_XDECREF(f);
12881288
Py_XDECREF(f);
@@ -1708,8 +1708,10 @@ slp_eval_frame_value(PyFrameObject *f, int throwflag, PyObject *retval)
17081708

17091709
why = WHY_NOT;
17101710

1711-
if (throwflag) /* support for generator.throw() */
1711+
if (throwflag) { /* support for generator.throw() */
1712+
assert(retval == NULL); /* to prevent reference leaks */
17121713
goto error;
1714+
}
17131715

17141716

17151717
#ifdef STACKLESS
@@ -1733,6 +1735,7 @@ slp_eval_frame_value(PyFrameObject *f, int throwflag, PyObject *retval)
17331735
}
17341736
else if (!PyErr_Occurred()) {
17351737
/* iterator ended normally */
1738+
assert(retval == NULL); /* to prevent reference leaks */
17361739
retval = POP();
17371740
Py_DECREF(retval);
17381741
/* perform the delayed block jump */
@@ -1746,6 +1749,7 @@ slp_eval_frame_value(PyFrameObject *f, int throwflag, PyObject *retval)
17461749
if (tstate->c_tracefunc != NULL)
17471750
call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f);
17481751
PyErr_Clear();
1752+
assert(retval == NULL); /* to prevent reference leaks */
17491753
retval = POP();
17501754
Py_DECREF(retval);
17511755
JUMPBY(oparg);

Stackless/changelog.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ What's New in Stackless 3.X.X?
99

1010
*Release date: 20XX-XX-XX*
1111

12+
- https://bitbucket.org/stackless-dev/stackless/issues/117
13+
Fix various reference leaks:
14+
- Leak of a reference to Py_None in generator.throw()
15+
1216
- https://bitbucket.org/stackless-dev/stackless/issues/111
1317
Restore the Python ABI function PyGen_New(). Previously Stackless named this
1418
function PyGenerator_New() and used a macro the redefine PyGen_New as

Stackless/core/stacklesseval.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -923,11 +923,17 @@ slp_gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
923923
Py_INCREF(f);
924924
ts->frame = f;
925925

926-
retval = Py_None;
927-
Py_INCREF(retval);
926+
if (exc)
927+
retval = NULL;
928+
else {
929+
retval = Py_None;
930+
Py_INCREF(retval);
931+
}
928932

929-
if (stackless)
933+
if (stackless) {
934+
assert(exc == 0);
930935
return STACKLESS_PACK(retval);
936+
}
931937
return slp_frame_dispatch(f, stopframe, exc, retval);
932938
}
933939

0 commit comments

Comments
 (0)