| Index: third_party/cython/src/Cython/Utility/Generator.c
|
| diff --git a/third_party/cython/src/Cython/Utility/Generator.c b/third_party/cython/src/Cython/Utility/Generator.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..82dbb637a1ddb6d0ba5b1387072465c8907fb268
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Cython/Utility/Generator.c
|
| @@ -0,0 +1,664 @@
|
| +//////////////////// YieldFrom.proto ////////////////////
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_GeneratorObject *gen, PyObject *source);
|
| +
|
| +//////////////////// YieldFrom ////////////////////
|
| +//@requires: Generator
|
| +
|
| +static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_GeneratorObject *gen, PyObject *source) {
|
| + PyObject *source_gen, *retval;
|
| + source_gen = PyObject_GetIter(source);
|
| + if (unlikely(!source_gen))
|
| + return NULL;
|
| + /* source_gen is now the iterator, make the first next() call */
|
| + retval = Py_TYPE(source_gen)->tp_iternext(source_gen);
|
| + if (likely(retval)) {
|
| + gen->yieldfrom = source_gen;
|
| + return retval;
|
| + }
|
| + Py_DECREF(source_gen);
|
| + return NULL;
|
| +}
|
| +
|
| +//////////////////// Generator.proto ////////////////////
|
| +#define __Pyx_Generator_USED
|
| +#include <structmember.h>
|
| +#include <frameobject.h>
|
| +
|
| +typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
|
| +
|
| +typedef struct {
|
| + PyObject_HEAD
|
| + __pyx_generator_body_t body;
|
| + PyObject *closure;
|
| + PyObject *exc_type;
|
| + PyObject *exc_value;
|
| + PyObject *exc_traceback;
|
| + PyObject *gi_weakreflist;
|
| + PyObject *classobj;
|
| + PyObject *yieldfrom;
|
| + int resume_label;
|
| + // using T_BOOL for property below requires char value
|
| + char is_running;
|
| +} __pyx_GeneratorObject;
|
| +
|
| +static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
|
| + PyObject *closure);
|
| +static int __pyx_Generator_init(void);
|
| +static int __Pyx_Generator_clear(PyObject* self);
|
| +
|
| +#if 1 || PY_VERSION_HEX < 0x030300B0
|
| +static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
|
| +#else
|
| +#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
|
| +#endif
|
| +
|
| +//////////////////// Generator ////////////////////
|
| +//@requires: Exceptions.c::PyErrFetchRestore
|
| +//@requires: Exceptions.c::SwapException
|
| +//@requires: Exceptions.c::RaiseException
|
| +//@requires: ObjectHandling.c::PyObjectCallMethod
|
| +//@requires: CommonTypes.c::FetchCommonType
|
| +
|
| +static PyObject *__Pyx_Generator_Next(PyObject *self);
|
| +static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
|
| +static PyObject *__Pyx_Generator_Close(PyObject *self);
|
| +static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
|
| +
|
| +static PyTypeObject *__pyx_GeneratorType = 0;
|
| +
|
| +#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
|
| +#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
|
| +
|
| +// If StopIteration exception is set, fetches its 'value'
|
| +// attribute if any, otherwise sets pvalue to None.
|
| +//
|
| +// Returns 0 if no exception or StopIteration is set.
|
| +// If any other exception is set, returns -1 and leaves
|
| +// pvalue unchanged.
|
| +#if 1 || PY_VERSION_HEX < 0x030300B0
|
| +static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
|
| + PyObject *et, *ev, *tb;
|
| + PyObject *value = NULL;
|
| +
|
| + __Pyx_ErrFetch(&et, &ev, &tb);
|
| +
|
| + if (!et) {
|
| + Py_XDECREF(tb);
|
| + Py_XDECREF(ev);
|
| + Py_INCREF(Py_None);
|
| + *pvalue = Py_None;
|
| + return 0;
|
| + }
|
| +
|
| + if (unlikely(et != PyExc_StopIteration) &&
|
| + unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
|
| + __Pyx_ErrRestore(et, ev, tb);
|
| + return -1;
|
| + }
|
| +
|
| + // most common case: plain StopIteration without or with separate argument
|
| + if (likely(et == PyExc_StopIteration)) {
|
| + if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
|
| + // PyErr_SetObject() and friends put the value directly into ev
|
| + if (!ev) {
|
| + Py_INCREF(Py_None);
|
| + ev = Py_None;
|
| + }
|
| + Py_XDECREF(tb);
|
| + Py_DECREF(et);
|
| + *pvalue = ev;
|
| + return 0;
|
| + }
|
| + }
|
| + // otherwise: normalise and check what that gives us
|
| + PyErr_NormalizeException(&et, &ev, &tb);
|
| + if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
|
| + // looks like normalisation failed - raise the new exception
|
| + __Pyx_ErrRestore(et, ev, tb);
|
| + return -1;
|
| + }
|
| + Py_XDECREF(tb);
|
| + Py_DECREF(et);
|
| +#if PY_VERSION_HEX >= 0x030300A0
|
| + value = ((PyStopIterationObject *)ev)->value;
|
| + Py_INCREF(value);
|
| + Py_DECREF(ev);
|
| +#else
|
| + {
|
| + PyObject* args = PyObject_GetAttr(ev, PYIDENT("args"));
|
| + Py_DECREF(ev);
|
| + if (likely(args)) {
|
| + value = PyObject_GetItem(args, 0);
|
| + Py_DECREF(args);
|
| + }
|
| + if (unlikely(!value)) {
|
| + __Pyx_ErrRestore(NULL, NULL, NULL);
|
| + Py_INCREF(Py_None);
|
| + value = Py_None;
|
| + }
|
| + }
|
| +#endif
|
| + *pvalue = value;
|
| + return 0;
|
| +}
|
| +#endif
|
| +
|
| +static CYTHON_INLINE
|
| +void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
|
| + PyObject *exc_type = self->exc_type;
|
| + PyObject *exc_value = self->exc_value;
|
| + PyObject *exc_traceback = self->exc_traceback;
|
| +
|
| + self->exc_type = NULL;
|
| + self->exc_value = NULL;
|
| + self->exc_traceback = NULL;
|
| +
|
| + Py_XDECREF(exc_type);
|
| + Py_XDECREF(exc_value);
|
| + Py_XDECREF(exc_traceback);
|
| +}
|
| +
|
| +static CYTHON_INLINE
|
| +int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
|
| + if (unlikely(gen->is_running)) {
|
| + PyErr_SetString(PyExc_ValueError,
|
| + "generator already executing");
|
| + return 1;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +static CYTHON_INLINE
|
| +PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
|
| + PyObject *retval;
|
| +
|
| + assert(!self->is_running);
|
| +
|
| + if (unlikely(self->resume_label == 0)) {
|
| + if (unlikely(value && value != Py_None)) {
|
| + PyErr_SetString(PyExc_TypeError,
|
| + "can't send non-None value to a "
|
| + "just-started generator");
|
| + return NULL;
|
| + }
|
| + }
|
| +
|
| + if (unlikely(self->resume_label == -1)) {
|
| + PyErr_SetNone(PyExc_StopIteration);
|
| + return NULL;
|
| + }
|
| +
|
| +
|
| + if (value) {
|
| +#if CYTHON_COMPILING_IN_PYPY
|
| + // FIXME: what to do in PyPy?
|
| +#else
|
| + /* Generators always return to their most recent caller, not
|
| + * necessarily their creator. */
|
| + if (self->exc_traceback) {
|
| + PyThreadState *tstate = PyThreadState_GET();
|
| + PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
|
| + PyFrameObject *f = tb->tb_frame;
|
| +
|
| + Py_XINCREF(tstate->frame);
|
| + assert(f->f_back == NULL);
|
| + f->f_back = tstate->frame;
|
| + }
|
| +#endif
|
| + __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
|
| + &self->exc_traceback);
|
| + } else {
|
| + __Pyx_Generator_ExceptionClear(self);
|
| + }
|
| +
|
| + self->is_running = 1;
|
| + retval = self->body((PyObject *) self, value);
|
| + self->is_running = 0;
|
| +
|
| + if (retval) {
|
| + __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
|
| + &self->exc_traceback);
|
| +#if CYTHON_COMPILING_IN_PYPY
|
| + // FIXME: what to do in PyPy?
|
| +#else
|
| + /* Don't keep the reference to f_back any longer than necessary. It
|
| + * may keep a chain of frames alive or it could create a reference
|
| + * cycle. */
|
| + if (self->exc_traceback) {
|
| + PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
|
| + PyFrameObject *f = tb->tb_frame;
|
| + Py_CLEAR(f->f_back);
|
| + }
|
| +#endif
|
| + } else {
|
| + __Pyx_Generator_ExceptionClear(self);
|
| + }
|
| +
|
| + return retval;
|
| +}
|
| +
|
| +static CYTHON_INLINE
|
| +PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
|
| + PyObject *ret;
|
| + PyObject *val = NULL;
|
| + __Pyx_Generator_Undelegate(gen);
|
| + __Pyx_PyGen_FetchStopIterationValue(&val);
|
| + // val == NULL on failure => pass on exception
|
| + ret = __Pyx_Generator_SendEx(gen, val);
|
| + Py_XDECREF(val);
|
| + return ret;
|
| +}
|
| +
|
| +static PyObject *__Pyx_Generator_Next(PyObject *self) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
|
| + PyObject *yf = gen->yieldfrom;
|
| + if (unlikely(__Pyx_Generator_CheckRunning(gen)))
|
| + return NULL;
|
| + if (yf) {
|
| + PyObject *ret;
|
| + // FIXME: does this really need an INCREF() ?
|
| + //Py_INCREF(yf);
|
| + /* YieldFrom code ensures that yf is an iterator */
|
| + gen->is_running = 1;
|
| + ret = Py_TYPE(yf)->tp_iternext(yf);
|
| + gen->is_running = 0;
|
| + //Py_DECREF(yf);
|
| + if (likely(ret)) {
|
| + return ret;
|
| + }
|
| + return __Pyx_Generator_FinishDelegation(gen);
|
| + }
|
| + return __Pyx_Generator_SendEx(gen, Py_None);
|
| +}
|
| +
|
| +static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
|
| + PyObject *yf = gen->yieldfrom;
|
| + if (unlikely(__Pyx_Generator_CheckRunning(gen)))
|
| + return NULL;
|
| + if (yf) {
|
| + PyObject *ret;
|
| + // FIXME: does this really need an INCREF() ?
|
| + //Py_INCREF(yf);
|
| + gen->is_running = 1;
|
| + if (__Pyx_Generator_CheckExact(yf)) {
|
| + ret = __Pyx_Generator_Send(yf, value);
|
| + } else {
|
| + if (value == Py_None)
|
| + ret = PyIter_Next(yf);
|
| + else
|
| + ret = __Pyx_PyObject_CallMethod1(yf, PYIDENT("send"), value);
|
| + }
|
| + gen->is_running = 0;
|
| + //Py_DECREF(yf);
|
| + if (likely(ret)) {
|
| + return ret;
|
| + }
|
| + return __Pyx_Generator_FinishDelegation(gen);
|
| + }
|
| + return __Pyx_Generator_SendEx(gen, value);
|
| +}
|
| +
|
| +// This helper function is used by gen_close and gen_throw to
|
| +// close a subiterator being delegated to by yield-from.
|
| +static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
|
| + PyObject *retval = NULL;
|
| + int err = 0;
|
| +
|
| + if (__Pyx_Generator_CheckExact(yf)) {
|
| + retval = __Pyx_Generator_Close(yf);
|
| + if (!retval)
|
| + return -1;
|
| + } else {
|
| + PyObject *meth;
|
| + gen->is_running = 1;
|
| + meth = PyObject_GetAttr(yf, PYIDENT("close"));
|
| + if (unlikely(!meth)) {
|
| + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
| + PyErr_WriteUnraisable(yf);
|
| + }
|
| + PyErr_Clear();
|
| + } else {
|
| + retval = PyObject_CallFunction(meth, NULL);
|
| + Py_DECREF(meth);
|
| + if (!retval)
|
| + err = -1;
|
| + }
|
| + gen->is_running = 0;
|
| + }
|
| + Py_XDECREF(retval);
|
| + return err;
|
| +}
|
| +
|
| +static PyObject *__Pyx_Generator_Close(PyObject *self) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| + PyObject *retval, *raised_exception;
|
| + PyObject *yf = gen->yieldfrom;
|
| + int err = 0;
|
| +
|
| + if (unlikely(__Pyx_Generator_CheckRunning(gen)))
|
| + return NULL;
|
| +
|
| + if (yf) {
|
| + Py_INCREF(yf);
|
| + err = __Pyx_Generator_CloseIter(gen, yf);
|
| + __Pyx_Generator_Undelegate(gen);
|
| + Py_DECREF(yf);
|
| + }
|
| + if (err == 0)
|
| +#if PY_VERSION_HEX < 0x02050000
|
| + PyErr_SetNone(PyExc_StopIteration);
|
| +#else
|
| + PyErr_SetNone(PyExc_GeneratorExit);
|
| +#endif
|
| + retval = __Pyx_Generator_SendEx(gen, NULL);
|
| + if (retval) {
|
| + Py_DECREF(retval);
|
| + PyErr_SetString(PyExc_RuntimeError,
|
| + "generator ignored GeneratorExit");
|
| + return NULL;
|
| + }
|
| + raised_exception = PyErr_Occurred();
|
| + if (!raised_exception
|
| + || raised_exception == PyExc_StopIteration
|
| +#if PY_VERSION_HEX >= 0x02050000
|
| + || raised_exception == PyExc_GeneratorExit
|
| + || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
|
| +#endif
|
| + || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
|
| + {
|
| + if (raised_exception) PyErr_Clear(); /* ignore these errors */
|
| + Py_INCREF(Py_None);
|
| + return Py_None;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| + PyObject *typ;
|
| + PyObject *tb = NULL;
|
| + PyObject *val = NULL;
|
| + PyObject *yf = gen->yieldfrom;
|
| +
|
| + if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
|
| + return NULL;
|
| +
|
| + if (unlikely(__Pyx_Generator_CheckRunning(gen)))
|
| + return NULL;
|
| +
|
| + if (yf) {
|
| + PyObject *ret;
|
| + Py_INCREF(yf);
|
| +#if PY_VERSION_HEX >= 0x02050000
|
| + if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
|
| + int err = __Pyx_Generator_CloseIter(gen, yf);
|
| + Py_DECREF(yf);
|
| + __Pyx_Generator_Undelegate(gen);
|
| + if (err < 0)
|
| + return __Pyx_Generator_SendEx(gen, NULL);
|
| + goto throw_here;
|
| + }
|
| +#endif
|
| + gen->is_running = 1;
|
| + if (__Pyx_Generator_CheckExact(yf)) {
|
| + ret = __Pyx_Generator_Throw(yf, args);
|
| + } else {
|
| + PyObject *meth = PyObject_GetAttr(yf, PYIDENT("throw"));
|
| + if (unlikely(!meth)) {
|
| + Py_DECREF(yf);
|
| + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
| + gen->is_running = 0;
|
| + return NULL;
|
| + }
|
| + PyErr_Clear();
|
| + __Pyx_Generator_Undelegate(gen);
|
| + gen->is_running = 0;
|
| + goto throw_here;
|
| + }
|
| + ret = PyObject_CallObject(meth, args);
|
| + Py_DECREF(meth);
|
| + }
|
| + gen->is_running = 0;
|
| + Py_DECREF(yf);
|
| + if (!ret) {
|
| + ret = __Pyx_Generator_FinishDelegation(gen);
|
| + }
|
| + return ret;
|
| + }
|
| +throw_here:
|
| + __Pyx_Raise(typ, val, tb, NULL);
|
| + return __Pyx_Generator_SendEx(gen, NULL);
|
| +}
|
| +
|
| +static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| +
|
| + Py_VISIT(gen->closure);
|
| + Py_VISIT(gen->classobj);
|
| + Py_VISIT(gen->yieldfrom);
|
| + Py_VISIT(gen->exc_type);
|
| + Py_VISIT(gen->exc_value);
|
| + Py_VISIT(gen->exc_traceback);
|
| + return 0;
|
| +}
|
| +
|
| +static int __Pyx_Generator_clear(PyObject *self) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| +
|
| + Py_CLEAR(gen->closure);
|
| + Py_CLEAR(gen->classobj);
|
| + Py_CLEAR(gen->yieldfrom);
|
| + Py_CLEAR(gen->exc_type);
|
| + Py_CLEAR(gen->exc_value);
|
| + Py_CLEAR(gen->exc_traceback);
|
| + return 0;
|
| +}
|
| +
|
| +static void __Pyx_Generator_dealloc(PyObject *self) {
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| +
|
| + PyObject_GC_UnTrack(gen);
|
| + if (gen->gi_weakreflist != NULL)
|
| + PyObject_ClearWeakRefs(self);
|
| +
|
| + if (gen->resume_label > 0) {
|
| + /* Generator is paused, so we need to close */
|
| + PyObject_GC_Track(self);
|
| +#if PY_VERSION_HEX >= 0x030400a1
|
| + if (PyObject_CallFinalizerFromDealloc(self))
|
| +#else
|
| + Py_TYPE(gen)->tp_del(self);
|
| + if (self->ob_refcnt > 0)
|
| +#endif
|
| + return; /* resurrected. :( */
|
| + PyObject_GC_UnTrack(self);
|
| + }
|
| +
|
| + __Pyx_Generator_clear(self);
|
| + PyObject_GC_Del(gen);
|
| +}
|
| +
|
| +static void __Pyx_Generator_del(PyObject *self) {
|
| + PyObject *res;
|
| + PyObject *error_type, *error_value, *error_traceback;
|
| + __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
|
| +
|
| + if (gen->resume_label <= 0)
|
| + return ;
|
| +
|
| +#if PY_VERSION_HEX < 0x030400a1
|
| + /* Temporarily resurrect the object. */
|
| + assert(self->ob_refcnt == 0);
|
| + self->ob_refcnt = 1;
|
| +#endif
|
| +
|
| + /* Save the current exception, if any. */
|
| + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
|
| +
|
| + res = __Pyx_Generator_Close(self);
|
| +
|
| + if (res == NULL)
|
| + PyErr_WriteUnraisable(self);
|
| + else
|
| + Py_DECREF(res);
|
| +
|
| + /* Restore the saved exception. */
|
| + __Pyx_ErrRestore(error_type, error_value, error_traceback);
|
| +
|
| +#if PY_VERSION_HEX < 0x030400a1
|
| + /* Undo the temporary resurrection; can't use DECREF here, it would
|
| + * cause a recursive call.
|
| + */
|
| + assert(self->ob_refcnt > 0);
|
| + if (--self->ob_refcnt == 0)
|
| + return; /* this is the normal path out */
|
| +
|
| + /* close() resurrected it! Make it look like the original Py_DECREF
|
| + * never happened.
|
| + */
|
| + {
|
| + Py_ssize_t refcnt = self->ob_refcnt;
|
| + _Py_NewReference(self);
|
| + self->ob_refcnt = refcnt;
|
| + }
|
| +#if CYTHON_COMPILING_IN_CPYTHON
|
| + assert(PyType_IS_GC(self->ob_type) &&
|
| + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
|
| +
|
| + /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
|
| + * we need to undo that. */
|
| + _Py_DEC_REFTOTAL;
|
| +#endif
|
| + /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
|
| + * chain, so no more to do there.
|
| + * If COUNT_ALLOCS, the original decref bumped tp_frees, and
|
| + * _Py_NewReference bumped tp_allocs: both of those need to be
|
| + * undone.
|
| + */
|
| +#ifdef COUNT_ALLOCS
|
| + --Py_TYPE(self)->tp_frees;
|
| + --Py_TYPE(self)->tp_allocs;
|
| +#endif
|
| +#endif
|
| +}
|
| +
|
| +static PyMemberDef __pyx_Generator_memberlist[] = {
|
| + {(char *) "gi_running",
|
| +#if PY_VERSION_HEX >= 0x02060000
|
| + T_BOOL,
|
| +#else
|
| + T_BYTE,
|
| +#endif
|
| + offsetof(__pyx_GeneratorObject, is_running),
|
| + READONLY,
|
| + NULL},
|
| + {0, 0, 0, 0, 0}
|
| +};
|
| +
|
| +static PyMethodDef __pyx_Generator_methods[] = {
|
| + {__Pyx_NAMESTR("send"), (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
|
| + {__Pyx_NAMESTR("throw"), (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
|
| + {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
|
| + {0, 0, 0, 0}
|
| +};
|
| +
|
| +static PyTypeObject __pyx_GeneratorType_type = {
|
| + PyVarObject_HEAD_INIT(0, 0)
|
| + __Pyx_NAMESTR("generator"), /*tp_name*/
|
| + sizeof(__pyx_GeneratorObject), /*tp_basicsize*/
|
| + 0, /*tp_itemsize*/
|
| + (destructor) __Pyx_Generator_dealloc,/*tp_dealloc*/
|
| + 0, /*tp_print*/
|
| + 0, /*tp_getattr*/
|
| + 0, /*tp_setattr*/
|
| +#if PY_MAJOR_VERSION < 3
|
| + 0, /*tp_compare*/
|
| +#else
|
| + 0, /*reserved*/
|
| +#endif
|
| + 0, /*tp_repr*/
|
| + 0, /*tp_as_number*/
|
| + 0, /*tp_as_sequence*/
|
| + 0, /*tp_as_mapping*/
|
| + 0, /*tp_hash*/
|
| + 0, /*tp_call*/
|
| + 0, /*tp_str*/
|
| + 0, /*tp_getattro*/
|
| + 0, /*tp_setattro*/
|
| + 0, /*tp_as_buffer*/
|
| + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags*/
|
| + 0, /*tp_doc*/
|
| + (traverseproc) __Pyx_Generator_traverse, /*tp_traverse*/
|
| + 0, /*tp_clear*/
|
| + 0, /*tp_richcompare*/
|
| + offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
|
| + 0, /*tp_iter*/
|
| + (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
|
| + __pyx_Generator_methods, /*tp_methods*/
|
| + __pyx_Generator_memberlist, /*tp_members*/
|
| + 0, /*tp_getset*/
|
| + 0, /*tp_base*/
|
| + 0, /*tp_dict*/
|
| + 0, /*tp_descr_get*/
|
| + 0, /*tp_descr_set*/
|
| + 0, /*tp_dictoffset*/
|
| + 0, /*tp_init*/
|
| + 0, /*tp_alloc*/
|
| + 0, /*tp_new*/
|
| + 0, /*tp_free*/
|
| + 0, /*tp_is_gc*/
|
| + 0, /*tp_bases*/
|
| + 0, /*tp_mro*/
|
| + 0, /*tp_cache*/
|
| + 0, /*tp_subclasses*/
|
| + 0, /*tp_weaklist*/
|
| +#if PY_VERSION_HEX >= 0x030400a1
|
| + 0, /*tp_del*/
|
| +#else
|
| + __Pyx_Generator_del, /*tp_del*/
|
| +#endif
|
| +#if PY_VERSION_HEX >= 0x02060000
|
| + 0, /*tp_version_tag*/
|
| +#endif
|
| +#if PY_VERSION_HEX >= 0x030400a1
|
| + __Pyx_Generator_del, /*tp_finalize*/
|
| +#endif
|
| +};
|
| +
|
| +static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
|
| + PyObject *closure) {
|
| + __pyx_GeneratorObject *gen =
|
| + PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
|
| +
|
| + if (gen == NULL)
|
| + return NULL;
|
| +
|
| + gen->body = body;
|
| + gen->closure = closure;
|
| + Py_XINCREF(closure);
|
| + gen->is_running = 0;
|
| + gen->resume_label = 0;
|
| + gen->classobj = NULL;
|
| + gen->yieldfrom = NULL;
|
| + gen->exc_type = NULL;
|
| + gen->exc_value = NULL;
|
| + gen->exc_traceback = NULL;
|
| + gen->gi_weakreflist = NULL;
|
| +
|
| + PyObject_GC_Track(gen);
|
| + return gen;
|
| +}
|
| +
|
| +static int __pyx_Generator_init(void) {
|
| + /* on Windows, C-API functions can't be used in slots statically */
|
| + __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
|
| + __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
|
| +
|
| + __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
|
| + if (__pyx_GeneratorType == NULL) {
|
| + return -1;
|
| + }
|
| + return 0;
|
| +}
|
|
|