PyObject * slp_run_tasklet(void) { PyThreadState *ts = PyThreadState_GET(); PyObject *retval; if ( (ts->st.main == NULL) && initialize_main_and_current()) { ts->frame = NULL; return NULL; } retval = ts->st.current->tempval; Py_INCREF(retval); if (PyBomb_Check(retval)) retval = slp_bomb_explode(ts->st.current); while (ts->st.main != NULL) { /* XXX correct condition? or current? */ retval = slp_frame_dispatch_top(retval); retval = tasklet_end(retval); if (STACKLESS_UNWINDING(retval)) STACKLESS_UNPACK(retval); } return retval; }
static PyObject * channel_send_exception(PyObject *myself, PyObject *args) { STACKLESS_GETARG(); PyObject *retval = NULL; PyObject *klass = PySequence_GetItem(args, 0); if (klass == NULL) VALUE_ERROR("channel.send_exception(e, v...)", NULL); args = PySequence_GetSlice(args, 1, PySequence_Size(args)); if (!args) { goto err_exit; } STACKLESS_PROMOTE_ALL(); retval = impl_channel_send_exception((PyChannelObject*)myself, klass, args); STACKLESS_ASSERT(); if (retval == NULL || STACKLESS_UNWINDING(retval)) { goto err_exit; } Py_INCREF(Py_None); retval = Py_None; err_exit: Py_DECREF(klass); Py_XDECREF(args); return retval; }
PyObject * PyChannel_Receive(PyChannelObject *self) { PyObject *ret = impl_channel_receive(self); STACKLESS_ASSERT(); assert(!STACKLESS_UNWINDING(self)); return ret; }
static PyObject * channel_send_throw(PyObject *myself, PyObject *args) { STACKLESS_GETARG(); PyObject *typ; PyObject *tb = Py_None; PyObject *val = Py_None; PyObject *retval; if (!PyArg_UnpackTuple(args, "send_throw", 1, 3, &typ, &val, &tb)) return NULL; STACKLESS_PROMOTE_ALL(); retval = impl_channel_send_throw((PyChannelObject*)myself, typ, val, tb); STACKLESS_ASSERT(); if (retval == NULL || STACKLESS_UNWINDING(retval)) { goto err_exit; } Py_INCREF(Py_None); retval = Py_None; err_exit: return retval; }
static PyObject * run_cframe(PyFrameObject *f, int exc, PyObject *retval) { PyThreadState *ts = PyThreadState_GET(); PyCFrameObject *cf = (PyCFrameObject*) f; PyTaskletObject *task = ts->st.current; int done = cf->i; ts->frame = f; if (retval == NULL || done) goto exit_run_cframe; if (cf->ob2 == NULL) cf->ob2 = PyTuple_New(0); Py_DECREF(retval); STACKLESS_PROPOSE_ALL(); retval = PyObject_Call(cf->ob1, cf->ob2, cf->ob3); STACKLESS_ASSERT(); cf->i = 1; /* mark ourself as done */ if (STACKLESS_UNWINDING(retval)) { /* try to shortcut */ if (ts->st.current == task && ts->frame != NULL && ts->frame->f_back == (PyFrameObject *) cf) { Py_DECREF(ts->frame->f_back); ts->frame->f_back = cf->f_back; Py_DECREF(cf); /* the exec reference */ } return retval; } /* pop frame */ exit_run_cframe: ts->frame = cf->f_back; Py_DECREF(cf); return retval; }
PyObject * channel_seq_callback(PyFrameObject *_f, int exc, PyObject *retval) { PyThreadState *ts; PyCFrameObject *f = (PyCFrameObject *) _f; PyChannelObject *ch; PyChannel_HeapType *t; PyObject *item; int stage = f->n; /* prolog to re-enter the loop */ if (stage == 1) { item = retval; goto back_with_data; } if (retval == NULL) goto exit_frame; Py_DECREF(retval); retval = NULL; if (stage == 2) { goto back_from_send; } /* Run iterator to exhaustion. */ for (; ; f->i++) { /* get the data */ STACKLESS_PROPOSE_ALL(); item = PyIter_Next(f->ob1); if (STACKLESS_UNWINDING(item)) { stage = f->n = 1; return item; } back_with_data: if (item == NULL) { if (PyErr_Occurred()) { if (PyErr_ExceptionMatches( PyExc_StopIteration)) PyErr_Clear(); else goto exit_frame; } break; } /* send the data */ ch = (PyChannelObject *) f->ob2; t = (PyChannel_HeapType *) Py_TYPE(ch); STACKLESS_PROPOSE_ALL(); retval = t->send(ch, item); Py_DECREF(item); if (retval == NULL) goto exit_frame; if (STACKLESS_UNWINDING(retval)) { stage = f->n = 2; return retval; } Py_DECREF(retval); back_from_send: ; } retval = PyLong_FromLong(f->i); exit_frame: /* epilog to return from the frame */ ts = PyThreadState_GET(); ts->frame = f->f_back; Py_DECREF(f); return retval; }