summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-11-24 21:33:49 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-11-24 21:33:49 (GMT)
commited6de7345e7bc85e12da6e72f86ab69b2fd8c2dd (patch)
treeee41bc5ae45f5c888a4201f20d7f3a390fb70cfd /Objects
parentfbff9b3f0453c312de1c8aa77324c5b72937f9ec (diff)
parentf7d199ff329f0cb68f367c7aa169e058b2ab50f4 (diff)
downloadcpython-ed6de7345e7bc85e12da6e72f86ab69b2fd8c2dd.zip
cpython-ed6de7345e7bc85e12da6e72f86ab69b2fd8c2dd.tar.gz
cpython-ed6de7345e7bc85e12da6e72f86ab69b2fd8c2dd.tar.bz2
Merge 3.6
Diffstat (limited to 'Objects')
-rw-r--r--Objects/genobject.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 558f809..2680ab0 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -355,6 +355,14 @@ _PyGen_yf(PyGenObject *gen)
PyObject *bytecode = f->f_code->co_code;
unsigned char *code = (unsigned char *)PyBytes_AS_STRING(bytecode);
+ if (f->f_lasti < 0) {
+ /* Return immediately if the frame didn't start yet. YIELD_FROM
+ always come after LOAD_CONST: a code object should not start
+ with YIELD_FROM */
+ assert(code[0] != YIELD_FROM);
+ return NULL;
+ }
+
if (code[f->f_lasti + sizeof(_Py_CODEUNIT)] != YIELD_FROM)
return NULL;
yf = f->f_stacktop[-1];
@@ -463,6 +471,7 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
assert(ret == yf);
Py_DECREF(ret);
/* Termination repetition of YIELD_FROM */
+ assert(gen->gi_frame->f_lasti >= 0);
gen->gi_frame->f_lasti += sizeof(_Py_CODEUNIT);
if (_PyGen_FetchStopIterationValue(&val) == 0) {
ret = gen_send_ex(gen, val, 0, 0);