Kaydet (Commit) 8920bf24 authored tarafından Phillip J. Eby's avatar Phillip J. Eby

Don't set gi_frame to Py_None, use NULL instead, eliminating some insane

pointer dereferences.
üst 5f445bf3
...@@ -13,6 +13,7 @@ typedef struct { ...@@ -13,6 +13,7 @@ typedef struct {
PyObject_HEAD PyObject_HEAD
/* The gi_ prefix is intended to remind of generator-iterator. */ /* The gi_ prefix is intended to remind of generator-iterator. */
/* Note: gi_frame can be NULL if the generator is "finished" */
struct _frame *gi_frame; struct _frame *gi_frame;
/* True if generator is being executed. */ /* True if generator is being executed. */
......
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
static int static int
gen_traverse(PyGenObject *gen, visitproc visit, void *arg) gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
{ {
return visit((PyObject *)gen->gi_frame, arg); Py_VISIT(gen->gi_frame);
return 0;
} }
static void static void
...@@ -26,7 +27,7 @@ gen_dealloc(PyGenObject *gen) ...@@ -26,7 +27,7 @@ gen_dealloc(PyGenObject *gen)
_PyObject_GC_TRACK(self); _PyObject_GC_TRACK(self);
if (gen->gi_frame->f_stacktop!=NULL) { if (gen->gi_frame!=NULL && gen->gi_frame->f_stacktop!=NULL) {
/* Generator is paused, so we need to close */ /* Generator is paused, so we need to close */
gen->ob_type->tp_del(self); gen->ob_type->tp_del(self);
if (self->ob_refcnt > 0) if (self->ob_refcnt > 0)
...@@ -51,7 +52,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc) ...@@ -51,7 +52,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
"generator already executing"); "generator already executing");
return NULL; return NULL;
} }
if ((PyObject *)f == Py_None || f->f_stacktop == NULL) { if (f==NULL || f->f_stacktop == NULL) {
/* Only set exception if called from send() */ /* Only set exception if called from send() */
if (arg && !exc) PyErr_SetNone(PyExc_StopIteration); if (arg && !exc) PyErr_SetNone(PyExc_StopIteration);
return NULL; return NULL;
...@@ -98,8 +99,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc) ...@@ -98,8 +99,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
if (!result || f->f_stacktop == NULL) { if (!result || f->f_stacktop == NULL) {
/* generator can't be rerun, so release the frame */ /* generator can't be rerun, so release the frame */
Py_DECREF(f); Py_DECREF(f);
gen->gi_frame = (PyFrameObject *)Py_None; gen->gi_frame = NULL;
Py_INCREF(Py_None);
} }
return result; return result;
...@@ -147,7 +147,7 @@ gen_del(PyObject *self) ...@@ -147,7 +147,7 @@ gen_del(PyObject *self)
PyObject *error_type, *error_value, *error_traceback; PyObject *error_type, *error_value, *error_traceback;
PyGenObject *gen = (PyGenObject *)self; PyGenObject *gen = (PyGenObject *)self;
if ((PyObject *)gen->gi_frame == Py_None || gen->gi_frame->f_stacktop==NULL) if (!gen->gi_frame || gen->gi_frame->f_stacktop==NULL)
/* Generator isn't paused, so no need to close */ /* Generator isn't paused, so no need to close */
return; return;
...@@ -366,7 +366,7 @@ PyGen_NeedsFinalizing(PyGenObject *gen) ...@@ -366,7 +366,7 @@ PyGen_NeedsFinalizing(PyGenObject *gen)
int i; int i;
PyFrameObject *f = gen->gi_frame; PyFrameObject *f = gen->gi_frame;
if ((PyObject *)f == Py_None || f->f_stacktop==NULL || f->f_iblock<=0) if (f == NULL || f->f_stacktop==NULL || f->f_iblock<=0)
return 0; /* no frame or no blockstack == no finalization */ return 0; /* no frame or no blockstack == no finalization */
for (i=f->f_iblock; i>=0; i--) { for (i=f->f_iblock; i>=0; i--) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment