Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
PyObject *
PyChannel_Receive(PyChannelObject *self)
{
    PyObject *ret = impl_channel_receive(self);
    STACKLESS_ASSERT();
    assert(!STACKLESS_UNWINDING(self));
    return ret;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}