cpython: f8815001a390 (original) (raw)

--- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -120,6 +120,46 @@ def isfuture(obj): return getattr(obj, '_asyncio_future_blocking', None) is not None +def _format_callbacks(cb):

+

+

+ + +def _future_repr_info(future):

+ + class Future: """This class is almost compatible with concurrent.futures.Future. @@ -172,45 +212,10 @@ class Future: if self._loop.get_debug(): self._source_traceback = traceback.extract_stack(sys._getframe(1))

-

-

-

def repr(self):

# On Python 3.3 and older, objects with a destructor part of a reference # cycle are never destroyed. It's not more the case on Python 3.4 thanks @@ -426,6 +431,21 @@ def _copy_future_state(source, dest): dest.set_result(result) +try:

+except ImportError:

+else:

+

+ + def _chain_future(source, destination): """Chain two futures so that when one completes, so does the other.

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1 Core and Builtins ----------------- +- Issue #26801: Added C implementation of asyncio.Future.

--- a/Modules/Setup.dist +++ b/Modules/Setup.dist @@ -181,6 +181,7 @@ faulthandler faulthandler.c #_datetime _datetimemodule.c # datetime accelerator #_bisect _bisectmodule.c # Bisection algorithms #_heapq _heapqmodule.c # Heap queue algorithm +#_futures _futuresmodule.c # Fast asyncio Future #unicodedata unicodedata.c # static Unicode character database

new file mode 100644 --- /dev/null +++ b/Modules/_futuresmodule.c @@ -0,0 +1,1034 @@ +#include "Python.h" +#include "structmember.h" + + +/* identifiers used from some functions / +_Py_IDENTIFIER(call_soon); + + +/ State of the _futures module */ +static int _futuremod_ready; +static PyObject *traceback_extract_stack; +static PyObject *asyncio_get_event_loop; +static PyObject *asyncio_repr_info_func; +static PyObject *asyncio_InvalidStateError; +static PyObject asyncio_CancelledError; + + +/ Get FutureIter from Future / +static PyObject new_future_iter(PyObject fut); + + +/ make sure module state is initialized and ready to be used. */ +static int +_FuturesMod_EnsureState(void) +{

+} + + +typedef enum {

+} fut_state; + + +typedef struct {

+} FutureObj; + + +static int +_schedule_callbacks(FutureObj *fut) +{

+

+

+

+

+

+

+

+} + +static int +FutureObj_init(FutureObj *fut, PyObject *args, PyObject *kwds) +{

+

+

+

+

+} + +static int +FutureObj_clear(FutureObj *fut) +{

+} + +static int +FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg) +{

+} + +PyDoc_STRVAR(pydoc_result,

+); + +static PyObject * +FutureObj_result(FutureObj *fut, PyObject *arg) +{

+

+

+

+} + +PyDoc_STRVAR(pydoc_exception,

+); + +static PyObject * +FutureObj_exception(FutureObj *fut, PyObject *arg) +{

+

+

+

+

+} + +PyDoc_STRVAR(pydoc_set_result,

+); + +static PyObject * +FutureObj_set_result(FutureObj *fut, PyObject *res) +{

+

+

+

+} + +PyDoc_STRVAR(pydoc_set_exception,

+); + +static PyObject * +FutureObj_set_exception(FutureObj *fut, PyObject *exc) +{

+

+

+

+

+

+

+} + +PyDoc_STRVAR(pydoc_add_done_callback,

+); + +static PyObject * +FutureObj_add_done_callback(FutureObj *fut, PyObject *arg) +{

+

+} + +PyDoc_STRVAR(pydoc_remove_done_callback,

+); + +static PyObject * +FutureObj_remove_done_callback(FutureObj *fut, PyObject *arg) +{

+

+

+

+

+

+ +fail:

+} + +PyDoc_STRVAR(pydoc_cancel,

+); + +static PyObject * +FutureObj_cancel(FutureObj *fut, PyObject *arg) +{

+

+

+} + +PyDoc_STRVAR(pydoc_cancelled, "Return True if the future was cancelled."); + +static PyObject * +FutureObj_cancelled(FutureObj *fut, PyObject *arg) +{

+} + +PyDoc_STRVAR(pydoc_done,

+); + +static PyObject * +FutureObj_done(FutureObj *fut, PyObject *arg) +{

+} + +static PyObject * +FutureObj_get_blocking(FutureObj *fut) +{

+} + +static int +FutureObj_set_blocking(FutureObj *fut, PyObject *val) +{

+} + +static PyObject * +FutureObj_get_log_traceback(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_loop(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_callbacks(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_result(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_exception(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_source_traceback(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_get_state(FutureObj *fut) +{

+

+} + +static PyObject* +FutureObj__repr_info(FutureObj *fut) +{

+} + +static PyObject * +FutureObj_repr(FutureObj *fut) +{

+

+

+

+

+

+} + +static void +FutureObj_finalize(FutureObj *fut) +{

+

+

+

+

+

+

+

+

+ +finally:

+

+} + + +static PyAsyncMethods FutureType_as_async = {

+}; + +static PyMethodDef FutureType_methods[] = {

+}; + +static PyGetSetDef FutureType_getsetlist[] = {

+}; + +static void FutureObj_dealloc(PyObject *self); + +static PyTypeObject FutureType = {

+}; + +static void +FutureObj_dealloc(PyObject *self) +{

+

+

+

+} + + +/*********************** Future Iterator **************************/ + +typedef struct {

+} futureiterobject; + +static void +FutureIter_dealloc(futureiterobject *it) +{

+} + +static PyObject * +FutureIter_iternext(futureiterobject *it) +{

+

+

+

+

+} + +static PyObject * +FutureIter_send(futureiterobject *self, PyObject *arg) +{

+} + +static PyObject * +FutureIter_throw(futureiterobject *self, PyObject *args) +{

+

+

+

+} + +static PyObject * +FutureIter_close(futureiterobject *self, PyObject *arg) +{

+} + +static int +FutureIter_traverse(futureiterobject *it, visitproc visit, void *arg) +{

+} + +static PyMethodDef FutureIter_methods[] = {

+}; + +static PyTypeObject FutureIterType = {

+}; + +static PyObject * +new_future_iter(PyObject *fut) +{

+

+} + +/*********************** Module **************************/ + +PyDoc_STRVAR(module_doc, "Fast asyncio.Future implementation.\n"); + +PyObject * +_init_module(PyObject *self, PyObject *args) +{

+

+

+

+

+

+

+

+

+} + + +static struct PyMethodDef futuresmod_methods[] = {

+}; + + +static struct PyModuleDef _futuresmodule = {

+}; + + +PyMODINIT_FUNC +PyInit__futures(void) +{

+

+

+

+}

--- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -221,6 +221,7 @@

--- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -470,6 +470,9 @@ Modules

--- a/setup.py +++ b/setup.py @@ -657,6 +657,8 @@ class PyBuildExt(build_ext): depends=['unicodedata_db.h', 'unicodename_db.h']) ) # _opcode module exts.append( Extension('_opcode', ['_opcode.c']) )

# Modules with some UNIX dependencies -- on by default: # (If you have a really backward UNIX, select and socket may not be