1 /*[clinic input]
2 preserve
3 [clinic start generated code]*/
4
5 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
6 # include "pycore_gc.h" // PyGC_Head
7 # include "pycore_runtime.h" // _Py_ID()
8 #endif
9 #include "pycore_modsupport.h" // _PyArg_UnpackKeywords()
10
11 PyDoc_STRVAR(_asyncio_Future___init____doc__,
12 "Future(*, loop=None)\n"
13 "--\n"
14 "\n"
15 "This class is *almost* compatible with concurrent.futures.Future.\n"
16 "\n"
17 " Differences:\n"
18 "\n"
19 " - result() and exception() do not take a timeout argument and\n"
20 " raise an exception when the future isn\'t done yet.\n"
21 "\n"
22 " - Callbacks registered with add_done_callback() are always called\n"
23 " via the event loop\'s call_soon_threadsafe().\n"
24 "\n"
25 " - This class is not compatible with the wait() and as_completed()\n"
26 " methods in the concurrent.futures package.");
27
28 static int
29 _asyncio_Future___init___impl(FutureObj *self, PyObject *loop);
30
31 static int
_asyncio_Future___init__(PyObject * self,PyObject * args,PyObject * kwargs)32 _asyncio_Future___init__(PyObject *self, PyObject *args, PyObject *kwargs)
33 {
34 int return_value = -1;
35 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
36
37 #define NUM_KEYWORDS 1
38 static struct {
39 PyGC_Head _this_is_not_used;
40 PyObject_VAR_HEAD
41 PyObject *ob_item[NUM_KEYWORDS];
42 } _kwtuple = {
43 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
44 .ob_item = { &_Py_ID(loop), },
45 };
46 #undef NUM_KEYWORDS
47 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
48
49 #else // !Py_BUILD_CORE
50 # define KWTUPLE NULL
51 #endif // !Py_BUILD_CORE
52
53 static const char * const _keywords[] = {"loop", NULL};
54 static _PyArg_Parser _parser = {
55 .keywords = _keywords,
56 .fname = "Future",
57 .kwtuple = KWTUPLE,
58 };
59 #undef KWTUPLE
60 PyObject *argsbuf[1];
61 PyObject * const *fastargs;
62 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
63 Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
64 PyObject *loop = Py_None;
65
66 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 0, 0, 0, argsbuf);
67 if (!fastargs) {
68 goto exit;
69 }
70 if (!noptargs) {
71 goto skip_optional_kwonly;
72 }
73 loop = fastargs[0];
74 skip_optional_kwonly:
75 return_value = _asyncio_Future___init___impl((FutureObj *)self, loop);
76
77 exit:
78 return return_value;
79 }
80
81 PyDoc_STRVAR(_asyncio_Future_result__doc__,
82 "result($self, /)\n"
83 "--\n"
84 "\n"
85 "Return the result this future represents.\n"
86 "\n"
87 "If the future has been cancelled, raises CancelledError. If the\n"
88 "future\'s result isn\'t yet available, raises InvalidStateError. If\n"
89 "the future is done and has an exception set, this exception is raised.");
90
91 #define _ASYNCIO_FUTURE_RESULT_METHODDEF \
92 {"result", (PyCFunction)_asyncio_Future_result, METH_NOARGS, _asyncio_Future_result__doc__},
93
94 static PyObject *
95 _asyncio_Future_result_impl(FutureObj *self);
96
97 static PyObject *
_asyncio_Future_result(FutureObj * self,PyObject * Py_UNUSED (ignored))98 _asyncio_Future_result(FutureObj *self, PyObject *Py_UNUSED(ignored))
99 {
100 return _asyncio_Future_result_impl(self);
101 }
102
103 PyDoc_STRVAR(_asyncio_Future_exception__doc__,
104 "exception($self, /)\n"
105 "--\n"
106 "\n"
107 "Return the exception that was set on this future.\n"
108 "\n"
109 "The exception (or None if no exception was set) is returned only if\n"
110 "the future is done. If the future has been cancelled, raises\n"
111 "CancelledError. If the future isn\'t done yet, raises\n"
112 "InvalidStateError.");
113
114 #define _ASYNCIO_FUTURE_EXCEPTION_METHODDEF \
115 {"exception", _PyCFunction_CAST(_asyncio_Future_exception), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_exception__doc__},
116
117 static PyObject *
118 _asyncio_Future_exception_impl(FutureObj *self, PyTypeObject *cls);
119
120 static PyObject *
_asyncio_Future_exception(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)121 _asyncio_Future_exception(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
122 {
123 if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) {
124 PyErr_SetString(PyExc_TypeError, "exception() takes no arguments");
125 return NULL;
126 }
127 return _asyncio_Future_exception_impl(self, cls);
128 }
129
130 PyDoc_STRVAR(_asyncio_Future_set_result__doc__,
131 "set_result($self, result, /)\n"
132 "--\n"
133 "\n"
134 "Mark the future done and set its result.\n"
135 "\n"
136 "If the future is already done when this method is called, raises\n"
137 "InvalidStateError.");
138
139 #define _ASYNCIO_FUTURE_SET_RESULT_METHODDEF \
140 {"set_result", _PyCFunction_CAST(_asyncio_Future_set_result), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_set_result__doc__},
141
142 static PyObject *
143 _asyncio_Future_set_result_impl(FutureObj *self, PyTypeObject *cls,
144 PyObject *result);
145
146 static PyObject *
_asyncio_Future_set_result(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)147 _asyncio_Future_set_result(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
148 {
149 PyObject *return_value = NULL;
150 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
151 # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
152 #else
153 # define KWTUPLE NULL
154 #endif
155
156 static const char * const _keywords[] = {"", NULL};
157 static _PyArg_Parser _parser = {
158 .keywords = _keywords,
159 .fname = "set_result",
160 .kwtuple = KWTUPLE,
161 };
162 #undef KWTUPLE
163 PyObject *argsbuf[1];
164 PyObject *result;
165
166 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
167 if (!args) {
168 goto exit;
169 }
170 result = args[0];
171 return_value = _asyncio_Future_set_result_impl(self, cls, result);
172
173 exit:
174 return return_value;
175 }
176
177 PyDoc_STRVAR(_asyncio_Future_set_exception__doc__,
178 "set_exception($self, exception, /)\n"
179 "--\n"
180 "\n"
181 "Mark the future done and set an exception.\n"
182 "\n"
183 "If the future is already done when this method is called, raises\n"
184 "InvalidStateError.");
185
186 #define _ASYNCIO_FUTURE_SET_EXCEPTION_METHODDEF \
187 {"set_exception", _PyCFunction_CAST(_asyncio_Future_set_exception), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_set_exception__doc__},
188
189 static PyObject *
190 _asyncio_Future_set_exception_impl(FutureObj *self, PyTypeObject *cls,
191 PyObject *exception);
192
193 static PyObject *
_asyncio_Future_set_exception(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)194 _asyncio_Future_set_exception(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
195 {
196 PyObject *return_value = NULL;
197 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
198 # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
199 #else
200 # define KWTUPLE NULL
201 #endif
202
203 static const char * const _keywords[] = {"", NULL};
204 static _PyArg_Parser _parser = {
205 .keywords = _keywords,
206 .fname = "set_exception",
207 .kwtuple = KWTUPLE,
208 };
209 #undef KWTUPLE
210 PyObject *argsbuf[1];
211 PyObject *exception;
212
213 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
214 if (!args) {
215 goto exit;
216 }
217 exception = args[0];
218 return_value = _asyncio_Future_set_exception_impl(self, cls, exception);
219
220 exit:
221 return return_value;
222 }
223
224 PyDoc_STRVAR(_asyncio_Future_add_done_callback__doc__,
225 "add_done_callback($self, fn, /, *, context=<unrepresentable>)\n"
226 "--\n"
227 "\n"
228 "Add a callback to be run when the future becomes done.\n"
229 "\n"
230 "The callback is called with a single argument - the future object. If\n"
231 "the future is already done when this is called, the callback is\n"
232 "scheduled with call_soon.");
233
234 #define _ASYNCIO_FUTURE_ADD_DONE_CALLBACK_METHODDEF \
235 {"add_done_callback", _PyCFunction_CAST(_asyncio_Future_add_done_callback), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_add_done_callback__doc__},
236
237 static PyObject *
238 _asyncio_Future_add_done_callback_impl(FutureObj *self, PyTypeObject *cls,
239 PyObject *fn, PyObject *context);
240
241 static PyObject *
_asyncio_Future_add_done_callback(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)242 _asyncio_Future_add_done_callback(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
243 {
244 PyObject *return_value = NULL;
245 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
246
247 #define NUM_KEYWORDS 1
248 static struct {
249 PyGC_Head _this_is_not_used;
250 PyObject_VAR_HEAD
251 PyObject *ob_item[NUM_KEYWORDS];
252 } _kwtuple = {
253 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
254 .ob_item = { &_Py_ID(context), },
255 };
256 #undef NUM_KEYWORDS
257 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
258
259 #else // !Py_BUILD_CORE
260 # define KWTUPLE NULL
261 #endif // !Py_BUILD_CORE
262
263 static const char * const _keywords[] = {"", "context", NULL};
264 static _PyArg_Parser _parser = {
265 .keywords = _keywords,
266 .fname = "add_done_callback",
267 .kwtuple = KWTUPLE,
268 };
269 #undef KWTUPLE
270 PyObject *argsbuf[2];
271 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
272 PyObject *fn;
273 PyObject *context = NULL;
274
275 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
276 if (!args) {
277 goto exit;
278 }
279 fn = args[0];
280 if (!noptargs) {
281 goto skip_optional_kwonly;
282 }
283 context = args[1];
284 skip_optional_kwonly:
285 return_value = _asyncio_Future_add_done_callback_impl(self, cls, fn, context);
286
287 exit:
288 return return_value;
289 }
290
291 PyDoc_STRVAR(_asyncio_Future_remove_done_callback__doc__,
292 "remove_done_callback($self, fn, /)\n"
293 "--\n"
294 "\n"
295 "Remove all instances of a callback from the \"call when done\" list.\n"
296 "\n"
297 "Returns the number of callbacks removed.");
298
299 #define _ASYNCIO_FUTURE_REMOVE_DONE_CALLBACK_METHODDEF \
300 {"remove_done_callback", _PyCFunction_CAST(_asyncio_Future_remove_done_callback), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_remove_done_callback__doc__},
301
302 static PyObject *
303 _asyncio_Future_remove_done_callback_impl(FutureObj *self, PyTypeObject *cls,
304 PyObject *fn);
305
306 static PyObject *
_asyncio_Future_remove_done_callback(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)307 _asyncio_Future_remove_done_callback(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
308 {
309 PyObject *return_value = NULL;
310 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
311 # define KWTUPLE (PyObject *)&_Py_SINGLETON(tuple_empty)
312 #else
313 # define KWTUPLE NULL
314 #endif
315
316 static const char * const _keywords[] = {"", NULL};
317 static _PyArg_Parser _parser = {
318 .keywords = _keywords,
319 .fname = "remove_done_callback",
320 .kwtuple = KWTUPLE,
321 };
322 #undef KWTUPLE
323 PyObject *argsbuf[1];
324 PyObject *fn;
325
326 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
327 if (!args) {
328 goto exit;
329 }
330 fn = args[0];
331 return_value = _asyncio_Future_remove_done_callback_impl(self, cls, fn);
332
333 exit:
334 return return_value;
335 }
336
337 PyDoc_STRVAR(_asyncio_Future_cancel__doc__,
338 "cancel($self, /, msg=None)\n"
339 "--\n"
340 "\n"
341 "Cancel the future and schedule callbacks.\n"
342 "\n"
343 "If the future is already done or cancelled, return False. Otherwise,\n"
344 "change the future\'s state to cancelled, schedule the callbacks and\n"
345 "return True.");
346
347 #define _ASYNCIO_FUTURE_CANCEL_METHODDEF \
348 {"cancel", _PyCFunction_CAST(_asyncio_Future_cancel), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_cancel__doc__},
349
350 static PyObject *
351 _asyncio_Future_cancel_impl(FutureObj *self, PyTypeObject *cls,
352 PyObject *msg);
353
354 static PyObject *
_asyncio_Future_cancel(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)355 _asyncio_Future_cancel(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
356 {
357 PyObject *return_value = NULL;
358 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
359
360 #define NUM_KEYWORDS 1
361 static struct {
362 PyGC_Head _this_is_not_used;
363 PyObject_VAR_HEAD
364 PyObject *ob_item[NUM_KEYWORDS];
365 } _kwtuple = {
366 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
367 .ob_item = { &_Py_ID(msg), },
368 };
369 #undef NUM_KEYWORDS
370 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
371
372 #else // !Py_BUILD_CORE
373 # define KWTUPLE NULL
374 #endif // !Py_BUILD_CORE
375
376 static const char * const _keywords[] = {"msg", NULL};
377 static _PyArg_Parser _parser = {
378 .keywords = _keywords,
379 .fname = "cancel",
380 .kwtuple = KWTUPLE,
381 };
382 #undef KWTUPLE
383 PyObject *argsbuf[1];
384 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
385 PyObject *msg = Py_None;
386
387 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
388 if (!args) {
389 goto exit;
390 }
391 if (!noptargs) {
392 goto skip_optional_pos;
393 }
394 msg = args[0];
395 skip_optional_pos:
396 return_value = _asyncio_Future_cancel_impl(self, cls, msg);
397
398 exit:
399 return return_value;
400 }
401
402 PyDoc_STRVAR(_asyncio_Future_cancelled__doc__,
403 "cancelled($self, /)\n"
404 "--\n"
405 "\n"
406 "Return True if the future was cancelled.");
407
408 #define _ASYNCIO_FUTURE_CANCELLED_METHODDEF \
409 {"cancelled", (PyCFunction)_asyncio_Future_cancelled, METH_NOARGS, _asyncio_Future_cancelled__doc__},
410
411 static PyObject *
412 _asyncio_Future_cancelled_impl(FutureObj *self);
413
414 static PyObject *
_asyncio_Future_cancelled(FutureObj * self,PyObject * Py_UNUSED (ignored))415 _asyncio_Future_cancelled(FutureObj *self, PyObject *Py_UNUSED(ignored))
416 {
417 return _asyncio_Future_cancelled_impl(self);
418 }
419
420 PyDoc_STRVAR(_asyncio_Future_done__doc__,
421 "done($self, /)\n"
422 "--\n"
423 "\n"
424 "Return True if the future is done.\n"
425 "\n"
426 "Done means either that a result / exception are available, or that the\n"
427 "future was cancelled.");
428
429 #define _ASYNCIO_FUTURE_DONE_METHODDEF \
430 {"done", (PyCFunction)_asyncio_Future_done, METH_NOARGS, _asyncio_Future_done__doc__},
431
432 static PyObject *
433 _asyncio_Future_done_impl(FutureObj *self);
434
435 static PyObject *
_asyncio_Future_done(FutureObj * self,PyObject * Py_UNUSED (ignored))436 _asyncio_Future_done(FutureObj *self, PyObject *Py_UNUSED(ignored))
437 {
438 return _asyncio_Future_done_impl(self);
439 }
440
441 PyDoc_STRVAR(_asyncio_Future_get_loop__doc__,
442 "get_loop($self, /)\n"
443 "--\n"
444 "\n"
445 "Return the event loop the Future is bound to.");
446
447 #define _ASYNCIO_FUTURE_GET_LOOP_METHODDEF \
448 {"get_loop", _PyCFunction_CAST(_asyncio_Future_get_loop), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Future_get_loop__doc__},
449
450 static PyObject *
451 _asyncio_Future_get_loop_impl(FutureObj *self, PyTypeObject *cls);
452
453 static PyObject *
_asyncio_Future_get_loop(FutureObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)454 _asyncio_Future_get_loop(FutureObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
455 {
456 if (nargs || (kwnames && PyTuple_GET_SIZE(kwnames))) {
457 PyErr_SetString(PyExc_TypeError, "get_loop() takes no arguments");
458 return NULL;
459 }
460 return _asyncio_Future_get_loop_impl(self, cls);
461 }
462
463 PyDoc_STRVAR(_asyncio_Future__make_cancelled_error__doc__,
464 "_make_cancelled_error($self, /)\n"
465 "--\n"
466 "\n"
467 "Create the CancelledError to raise if the Future is cancelled.\n"
468 "\n"
469 "This should only be called once when handling a cancellation since\n"
470 "it erases the context exception value.");
471
472 #define _ASYNCIO_FUTURE__MAKE_CANCELLED_ERROR_METHODDEF \
473 {"_make_cancelled_error", (PyCFunction)_asyncio_Future__make_cancelled_error, METH_NOARGS, _asyncio_Future__make_cancelled_error__doc__},
474
475 static PyObject *
476 _asyncio_Future__make_cancelled_error_impl(FutureObj *self);
477
478 static PyObject *
_asyncio_Future__make_cancelled_error(FutureObj * self,PyObject * Py_UNUSED (ignored))479 _asyncio_Future__make_cancelled_error(FutureObj *self, PyObject *Py_UNUSED(ignored))
480 {
481 return _asyncio_Future__make_cancelled_error_impl(self);
482 }
483
484 PyDoc_STRVAR(_asyncio_Task___init____doc__,
485 "Task(coro, *, loop=None, name=None, context=None, eager_start=False)\n"
486 "--\n"
487 "\n"
488 "A coroutine wrapped in a Future.");
489
490 static int
491 _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop,
492 PyObject *name, PyObject *context,
493 int eager_start);
494
495 static int
_asyncio_Task___init__(PyObject * self,PyObject * args,PyObject * kwargs)496 _asyncio_Task___init__(PyObject *self, PyObject *args, PyObject *kwargs)
497 {
498 int return_value = -1;
499 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
500
501 #define NUM_KEYWORDS 5
502 static struct {
503 PyGC_Head _this_is_not_used;
504 PyObject_VAR_HEAD
505 PyObject *ob_item[NUM_KEYWORDS];
506 } _kwtuple = {
507 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
508 .ob_item = { &_Py_ID(coro), &_Py_ID(loop), &_Py_ID(name), &_Py_ID(context), &_Py_ID(eager_start), },
509 };
510 #undef NUM_KEYWORDS
511 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
512
513 #else // !Py_BUILD_CORE
514 # define KWTUPLE NULL
515 #endif // !Py_BUILD_CORE
516
517 static const char * const _keywords[] = {"coro", "loop", "name", "context", "eager_start", NULL};
518 static _PyArg_Parser _parser = {
519 .keywords = _keywords,
520 .fname = "Task",
521 .kwtuple = KWTUPLE,
522 };
523 #undef KWTUPLE
524 PyObject *argsbuf[5];
525 PyObject * const *fastargs;
526 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
527 Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1;
528 PyObject *coro;
529 PyObject *loop = Py_None;
530 PyObject *name = Py_None;
531 PyObject *context = Py_None;
532 int eager_start = 0;
533
534 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 1, 0, argsbuf);
535 if (!fastargs) {
536 goto exit;
537 }
538 coro = fastargs[0];
539 if (!noptargs) {
540 goto skip_optional_kwonly;
541 }
542 if (fastargs[1]) {
543 loop = fastargs[1];
544 if (!--noptargs) {
545 goto skip_optional_kwonly;
546 }
547 }
548 if (fastargs[2]) {
549 name = fastargs[2];
550 if (!--noptargs) {
551 goto skip_optional_kwonly;
552 }
553 }
554 if (fastargs[3]) {
555 context = fastargs[3];
556 if (!--noptargs) {
557 goto skip_optional_kwonly;
558 }
559 }
560 eager_start = PyObject_IsTrue(fastargs[4]);
561 if (eager_start < 0) {
562 goto exit;
563 }
564 skip_optional_kwonly:
565 return_value = _asyncio_Task___init___impl((TaskObj *)self, coro, loop, name, context, eager_start);
566
567 exit:
568 return return_value;
569 }
570
571 PyDoc_STRVAR(_asyncio_Task__make_cancelled_error__doc__,
572 "_make_cancelled_error($self, /)\n"
573 "--\n"
574 "\n"
575 "Create the CancelledError to raise if the Task is cancelled.\n"
576 "\n"
577 "This should only be called once when handling a cancellation since\n"
578 "it erases the context exception value.");
579
580 #define _ASYNCIO_TASK__MAKE_CANCELLED_ERROR_METHODDEF \
581 {"_make_cancelled_error", (PyCFunction)_asyncio_Task__make_cancelled_error, METH_NOARGS, _asyncio_Task__make_cancelled_error__doc__},
582
583 static PyObject *
584 _asyncio_Task__make_cancelled_error_impl(TaskObj *self);
585
586 static PyObject *
_asyncio_Task__make_cancelled_error(TaskObj * self,PyObject * Py_UNUSED (ignored))587 _asyncio_Task__make_cancelled_error(TaskObj *self, PyObject *Py_UNUSED(ignored))
588 {
589 return _asyncio_Task__make_cancelled_error_impl(self);
590 }
591
592 PyDoc_STRVAR(_asyncio_Task_cancel__doc__,
593 "cancel($self, /, msg=None)\n"
594 "--\n"
595 "\n"
596 "Request that this task cancel itself.\n"
597 "\n"
598 "This arranges for a CancelledError to be thrown into the\n"
599 "wrapped coroutine on the next cycle through the event loop.\n"
600 "The coroutine then has a chance to clean up or even deny\n"
601 "the request using try/except/finally.\n"
602 "\n"
603 "Unlike Future.cancel, this does not guarantee that the\n"
604 "task will be cancelled: the exception might be caught and\n"
605 "acted upon, delaying cancellation of the task or preventing\n"
606 "cancellation completely. The task may also return a value or\n"
607 "raise a different exception.\n"
608 "\n"
609 "Immediately after this method is called, Task.cancelled() will\n"
610 "not return True (unless the task was already cancelled). A\n"
611 "task will be marked as cancelled when the wrapped coroutine\n"
612 "terminates with a CancelledError exception (even if cancel()\n"
613 "was not called).\n"
614 "\n"
615 "This also increases the task\'s count of cancellation requests.");
616
617 #define _ASYNCIO_TASK_CANCEL_METHODDEF \
618 {"cancel", _PyCFunction_CAST(_asyncio_Task_cancel), METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_cancel__doc__},
619
620 static PyObject *
621 _asyncio_Task_cancel_impl(TaskObj *self, PyObject *msg);
622
623 static PyObject *
_asyncio_Task_cancel(TaskObj * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)624 _asyncio_Task_cancel(TaskObj *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
625 {
626 PyObject *return_value = NULL;
627 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
628
629 #define NUM_KEYWORDS 1
630 static struct {
631 PyGC_Head _this_is_not_used;
632 PyObject_VAR_HEAD
633 PyObject *ob_item[NUM_KEYWORDS];
634 } _kwtuple = {
635 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
636 .ob_item = { &_Py_ID(msg), },
637 };
638 #undef NUM_KEYWORDS
639 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
640
641 #else // !Py_BUILD_CORE
642 # define KWTUPLE NULL
643 #endif // !Py_BUILD_CORE
644
645 static const char * const _keywords[] = {"msg", NULL};
646 static _PyArg_Parser _parser = {
647 .keywords = _keywords,
648 .fname = "cancel",
649 .kwtuple = KWTUPLE,
650 };
651 #undef KWTUPLE
652 PyObject *argsbuf[1];
653 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
654 PyObject *msg = Py_None;
655
656 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
657 if (!args) {
658 goto exit;
659 }
660 if (!noptargs) {
661 goto skip_optional_pos;
662 }
663 msg = args[0];
664 skip_optional_pos:
665 return_value = _asyncio_Task_cancel_impl(self, msg);
666
667 exit:
668 return return_value;
669 }
670
671 PyDoc_STRVAR(_asyncio_Task_cancelling__doc__,
672 "cancelling($self, /)\n"
673 "--\n"
674 "\n"
675 "Return the count of the task\'s cancellation requests.\n"
676 "\n"
677 "This count is incremented when .cancel() is called\n"
678 "and may be decremented using .uncancel().");
679
680 #define _ASYNCIO_TASK_CANCELLING_METHODDEF \
681 {"cancelling", (PyCFunction)_asyncio_Task_cancelling, METH_NOARGS, _asyncio_Task_cancelling__doc__},
682
683 static PyObject *
684 _asyncio_Task_cancelling_impl(TaskObj *self);
685
686 static PyObject *
_asyncio_Task_cancelling(TaskObj * self,PyObject * Py_UNUSED (ignored))687 _asyncio_Task_cancelling(TaskObj *self, PyObject *Py_UNUSED(ignored))
688 {
689 return _asyncio_Task_cancelling_impl(self);
690 }
691
692 PyDoc_STRVAR(_asyncio_Task_uncancel__doc__,
693 "uncancel($self, /)\n"
694 "--\n"
695 "\n"
696 "Decrement the task\'s count of cancellation requests.\n"
697 "\n"
698 "This should be used by tasks that catch CancelledError\n"
699 "and wish to continue indefinitely until they are cancelled again.\n"
700 "\n"
701 "Returns the remaining number of cancellation requests.");
702
703 #define _ASYNCIO_TASK_UNCANCEL_METHODDEF \
704 {"uncancel", (PyCFunction)_asyncio_Task_uncancel, METH_NOARGS, _asyncio_Task_uncancel__doc__},
705
706 static PyObject *
707 _asyncio_Task_uncancel_impl(TaskObj *self);
708
709 static PyObject *
_asyncio_Task_uncancel(TaskObj * self,PyObject * Py_UNUSED (ignored))710 _asyncio_Task_uncancel(TaskObj *self, PyObject *Py_UNUSED(ignored))
711 {
712 return _asyncio_Task_uncancel_impl(self);
713 }
714
715 PyDoc_STRVAR(_asyncio_Task_get_stack__doc__,
716 "get_stack($self, /, *, limit=None)\n"
717 "--\n"
718 "\n"
719 "Return the list of stack frames for this task\'s coroutine.\n"
720 "\n"
721 "If the coroutine is not done, this returns the stack where it is\n"
722 "suspended. If the coroutine has completed successfully or was\n"
723 "cancelled, this returns an empty list. If the coroutine was\n"
724 "terminated by an exception, this returns the list of traceback\n"
725 "frames.\n"
726 "\n"
727 "The frames are always ordered from oldest to newest.\n"
728 "\n"
729 "The optional limit gives the maximum number of frames to\n"
730 "return; by default all available frames are returned. Its\n"
731 "meaning differs depending on whether a stack or a traceback is\n"
732 "returned: the newest frames of a stack are returned, but the\n"
733 "oldest frames of a traceback are returned. (This matches the\n"
734 "behavior of the traceback module.)\n"
735 "\n"
736 "For reasons beyond our control, only one stack frame is\n"
737 "returned for a suspended coroutine.");
738
739 #define _ASYNCIO_TASK_GET_STACK_METHODDEF \
740 {"get_stack", _PyCFunction_CAST(_asyncio_Task_get_stack), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_get_stack__doc__},
741
742 static PyObject *
743 _asyncio_Task_get_stack_impl(TaskObj *self, PyTypeObject *cls,
744 PyObject *limit);
745
746 static PyObject *
_asyncio_Task_get_stack(TaskObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)747 _asyncio_Task_get_stack(TaskObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
748 {
749 PyObject *return_value = NULL;
750 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
751
752 #define NUM_KEYWORDS 1
753 static struct {
754 PyGC_Head _this_is_not_used;
755 PyObject_VAR_HEAD
756 PyObject *ob_item[NUM_KEYWORDS];
757 } _kwtuple = {
758 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
759 .ob_item = { &_Py_ID(limit), },
760 };
761 #undef NUM_KEYWORDS
762 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
763
764 #else // !Py_BUILD_CORE
765 # define KWTUPLE NULL
766 #endif // !Py_BUILD_CORE
767
768 static const char * const _keywords[] = {"limit", NULL};
769 static _PyArg_Parser _parser = {
770 .keywords = _keywords,
771 .fname = "get_stack",
772 .kwtuple = KWTUPLE,
773 };
774 #undef KWTUPLE
775 PyObject *argsbuf[1];
776 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
777 PyObject *limit = Py_None;
778
779 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
780 if (!args) {
781 goto exit;
782 }
783 if (!noptargs) {
784 goto skip_optional_kwonly;
785 }
786 limit = args[0];
787 skip_optional_kwonly:
788 return_value = _asyncio_Task_get_stack_impl(self, cls, limit);
789
790 exit:
791 return return_value;
792 }
793
794 PyDoc_STRVAR(_asyncio_Task_print_stack__doc__,
795 "print_stack($self, /, *, limit=None, file=None)\n"
796 "--\n"
797 "\n"
798 "Print the stack or traceback for this task\'s coroutine.\n"
799 "\n"
800 "This produces output similar to that of the traceback module,\n"
801 "for the frames retrieved by get_stack(). The limit argument\n"
802 "is passed to get_stack(). The file argument is an I/O stream\n"
803 "to which the output is written; by default output is written\n"
804 "to sys.stderr.");
805
806 #define _ASYNCIO_TASK_PRINT_STACK_METHODDEF \
807 {"print_stack", _PyCFunction_CAST(_asyncio_Task_print_stack), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _asyncio_Task_print_stack__doc__},
808
809 static PyObject *
810 _asyncio_Task_print_stack_impl(TaskObj *self, PyTypeObject *cls,
811 PyObject *limit, PyObject *file);
812
813 static PyObject *
_asyncio_Task_print_stack(TaskObj * self,PyTypeObject * cls,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)814 _asyncio_Task_print_stack(TaskObj *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
815 {
816 PyObject *return_value = NULL;
817 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
818
819 #define NUM_KEYWORDS 2
820 static struct {
821 PyGC_Head _this_is_not_used;
822 PyObject_VAR_HEAD
823 PyObject *ob_item[NUM_KEYWORDS];
824 } _kwtuple = {
825 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
826 .ob_item = { &_Py_ID(limit), &_Py_ID(file), },
827 };
828 #undef NUM_KEYWORDS
829 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
830
831 #else // !Py_BUILD_CORE
832 # define KWTUPLE NULL
833 #endif // !Py_BUILD_CORE
834
835 static const char * const _keywords[] = {"limit", "file", NULL};
836 static _PyArg_Parser _parser = {
837 .keywords = _keywords,
838 .fname = "print_stack",
839 .kwtuple = KWTUPLE,
840 };
841 #undef KWTUPLE
842 PyObject *argsbuf[2];
843 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
844 PyObject *limit = Py_None;
845 PyObject *file = Py_None;
846
847 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 0, 0, argsbuf);
848 if (!args) {
849 goto exit;
850 }
851 if (!noptargs) {
852 goto skip_optional_kwonly;
853 }
854 if (args[0]) {
855 limit = args[0];
856 if (!--noptargs) {
857 goto skip_optional_kwonly;
858 }
859 }
860 file = args[1];
861 skip_optional_kwonly:
862 return_value = _asyncio_Task_print_stack_impl(self, cls, limit, file);
863
864 exit:
865 return return_value;
866 }
867
868 PyDoc_STRVAR(_asyncio_Task_set_result__doc__,
869 "set_result($self, result, /)\n"
870 "--\n"
871 "\n");
872
873 #define _ASYNCIO_TASK_SET_RESULT_METHODDEF \
874 {"set_result", (PyCFunction)_asyncio_Task_set_result, METH_O, _asyncio_Task_set_result__doc__},
875
876 PyDoc_STRVAR(_asyncio_Task_set_exception__doc__,
877 "set_exception($self, exception, /)\n"
878 "--\n"
879 "\n");
880
881 #define _ASYNCIO_TASK_SET_EXCEPTION_METHODDEF \
882 {"set_exception", (PyCFunction)_asyncio_Task_set_exception, METH_O, _asyncio_Task_set_exception__doc__},
883
884 PyDoc_STRVAR(_asyncio_Task_get_coro__doc__,
885 "get_coro($self, /)\n"
886 "--\n"
887 "\n");
888
889 #define _ASYNCIO_TASK_GET_CORO_METHODDEF \
890 {"get_coro", (PyCFunction)_asyncio_Task_get_coro, METH_NOARGS, _asyncio_Task_get_coro__doc__},
891
892 static PyObject *
893 _asyncio_Task_get_coro_impl(TaskObj *self);
894
895 static PyObject *
_asyncio_Task_get_coro(TaskObj * self,PyObject * Py_UNUSED (ignored))896 _asyncio_Task_get_coro(TaskObj *self, PyObject *Py_UNUSED(ignored))
897 {
898 return _asyncio_Task_get_coro_impl(self);
899 }
900
901 PyDoc_STRVAR(_asyncio_Task_get_context__doc__,
902 "get_context($self, /)\n"
903 "--\n"
904 "\n");
905
906 #define _ASYNCIO_TASK_GET_CONTEXT_METHODDEF \
907 {"get_context", (PyCFunction)_asyncio_Task_get_context, METH_NOARGS, _asyncio_Task_get_context__doc__},
908
909 static PyObject *
910 _asyncio_Task_get_context_impl(TaskObj *self);
911
912 static PyObject *
_asyncio_Task_get_context(TaskObj * self,PyObject * Py_UNUSED (ignored))913 _asyncio_Task_get_context(TaskObj *self, PyObject *Py_UNUSED(ignored))
914 {
915 return _asyncio_Task_get_context_impl(self);
916 }
917
918 PyDoc_STRVAR(_asyncio_Task_get_name__doc__,
919 "get_name($self, /)\n"
920 "--\n"
921 "\n");
922
923 #define _ASYNCIO_TASK_GET_NAME_METHODDEF \
924 {"get_name", (PyCFunction)_asyncio_Task_get_name, METH_NOARGS, _asyncio_Task_get_name__doc__},
925
926 static PyObject *
927 _asyncio_Task_get_name_impl(TaskObj *self);
928
929 static PyObject *
_asyncio_Task_get_name(TaskObj * self,PyObject * Py_UNUSED (ignored))930 _asyncio_Task_get_name(TaskObj *self, PyObject *Py_UNUSED(ignored))
931 {
932 return _asyncio_Task_get_name_impl(self);
933 }
934
935 PyDoc_STRVAR(_asyncio_Task_set_name__doc__,
936 "set_name($self, value, /)\n"
937 "--\n"
938 "\n");
939
940 #define _ASYNCIO_TASK_SET_NAME_METHODDEF \
941 {"set_name", (PyCFunction)_asyncio_Task_set_name, METH_O, _asyncio_Task_set_name__doc__},
942
943 PyDoc_STRVAR(_asyncio__get_running_loop__doc__,
944 "_get_running_loop($module, /)\n"
945 "--\n"
946 "\n"
947 "Return the running event loop or None.\n"
948 "\n"
949 "This is a low-level function intended to be used by event loops.\n"
950 "This function is thread-specific.");
951
952 #define _ASYNCIO__GET_RUNNING_LOOP_METHODDEF \
953 {"_get_running_loop", (PyCFunction)_asyncio__get_running_loop, METH_NOARGS, _asyncio__get_running_loop__doc__},
954
955 static PyObject *
956 _asyncio__get_running_loop_impl(PyObject *module);
957
958 static PyObject *
_asyncio__get_running_loop(PyObject * module,PyObject * Py_UNUSED (ignored))959 _asyncio__get_running_loop(PyObject *module, PyObject *Py_UNUSED(ignored))
960 {
961 return _asyncio__get_running_loop_impl(module);
962 }
963
964 PyDoc_STRVAR(_asyncio__set_running_loop__doc__,
965 "_set_running_loop($module, loop, /)\n"
966 "--\n"
967 "\n"
968 "Set the running event loop.\n"
969 "\n"
970 "This is a low-level function intended to be used by event loops.\n"
971 "This function is thread-specific.");
972
973 #define _ASYNCIO__SET_RUNNING_LOOP_METHODDEF \
974 {"_set_running_loop", (PyCFunction)_asyncio__set_running_loop, METH_O, _asyncio__set_running_loop__doc__},
975
976 PyDoc_STRVAR(_asyncio_get_event_loop__doc__,
977 "get_event_loop($module, /)\n"
978 "--\n"
979 "\n"
980 "Return an asyncio event loop.\n"
981 "\n"
982 "When called from a coroutine or a callback (e.g. scheduled with\n"
983 "call_soon or similar API), this function will always return the\n"
984 "running event loop.\n"
985 "\n"
986 "If there is no running event loop set, the function will return\n"
987 "the result of `get_event_loop_policy().get_event_loop()` call.");
988
989 #define _ASYNCIO_GET_EVENT_LOOP_METHODDEF \
990 {"get_event_loop", (PyCFunction)_asyncio_get_event_loop, METH_NOARGS, _asyncio_get_event_loop__doc__},
991
992 static PyObject *
993 _asyncio_get_event_loop_impl(PyObject *module);
994
995 static PyObject *
_asyncio_get_event_loop(PyObject * module,PyObject * Py_UNUSED (ignored))996 _asyncio_get_event_loop(PyObject *module, PyObject *Py_UNUSED(ignored))
997 {
998 return _asyncio_get_event_loop_impl(module);
999 }
1000
1001 PyDoc_STRVAR(_asyncio_get_running_loop__doc__,
1002 "get_running_loop($module, /)\n"
1003 "--\n"
1004 "\n"
1005 "Return the running event loop. Raise a RuntimeError if there is none.\n"
1006 "\n"
1007 "This function is thread-specific.");
1008
1009 #define _ASYNCIO_GET_RUNNING_LOOP_METHODDEF \
1010 {"get_running_loop", (PyCFunction)_asyncio_get_running_loop, METH_NOARGS, _asyncio_get_running_loop__doc__},
1011
1012 static PyObject *
1013 _asyncio_get_running_loop_impl(PyObject *module);
1014
1015 static PyObject *
_asyncio_get_running_loop(PyObject * module,PyObject * Py_UNUSED (ignored))1016 _asyncio_get_running_loop(PyObject *module, PyObject *Py_UNUSED(ignored))
1017 {
1018 return _asyncio_get_running_loop_impl(module);
1019 }
1020
1021 PyDoc_STRVAR(_asyncio__register_task__doc__,
1022 "_register_task($module, /, task)\n"
1023 "--\n"
1024 "\n"
1025 "Register a new task in asyncio as executed by loop.\n"
1026 "\n"
1027 "Returns None.");
1028
1029 #define _ASYNCIO__REGISTER_TASK_METHODDEF \
1030 {"_register_task", _PyCFunction_CAST(_asyncio__register_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__register_task__doc__},
1031
1032 static PyObject *
1033 _asyncio__register_task_impl(PyObject *module, PyObject *task);
1034
1035 static PyObject *
_asyncio__register_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1036 _asyncio__register_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1037 {
1038 PyObject *return_value = NULL;
1039 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1040
1041 #define NUM_KEYWORDS 1
1042 static struct {
1043 PyGC_Head _this_is_not_used;
1044 PyObject_VAR_HEAD
1045 PyObject *ob_item[NUM_KEYWORDS];
1046 } _kwtuple = {
1047 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1048 .ob_item = { &_Py_ID(task), },
1049 };
1050 #undef NUM_KEYWORDS
1051 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1052
1053 #else // !Py_BUILD_CORE
1054 # define KWTUPLE NULL
1055 #endif // !Py_BUILD_CORE
1056
1057 static const char * const _keywords[] = {"task", NULL};
1058 static _PyArg_Parser _parser = {
1059 .keywords = _keywords,
1060 .fname = "_register_task",
1061 .kwtuple = KWTUPLE,
1062 };
1063 #undef KWTUPLE
1064 PyObject *argsbuf[1];
1065 PyObject *task;
1066
1067 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1068 if (!args) {
1069 goto exit;
1070 }
1071 task = args[0];
1072 return_value = _asyncio__register_task_impl(module, task);
1073
1074 exit:
1075 return return_value;
1076 }
1077
1078 PyDoc_STRVAR(_asyncio__register_eager_task__doc__,
1079 "_register_eager_task($module, /, task)\n"
1080 "--\n"
1081 "\n"
1082 "Register a new task in asyncio as executed by loop.\n"
1083 "\n"
1084 "Returns None.");
1085
1086 #define _ASYNCIO__REGISTER_EAGER_TASK_METHODDEF \
1087 {"_register_eager_task", _PyCFunction_CAST(_asyncio__register_eager_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__register_eager_task__doc__},
1088
1089 static PyObject *
1090 _asyncio__register_eager_task_impl(PyObject *module, PyObject *task);
1091
1092 static PyObject *
_asyncio__register_eager_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1093 _asyncio__register_eager_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1094 {
1095 PyObject *return_value = NULL;
1096 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1097
1098 #define NUM_KEYWORDS 1
1099 static struct {
1100 PyGC_Head _this_is_not_used;
1101 PyObject_VAR_HEAD
1102 PyObject *ob_item[NUM_KEYWORDS];
1103 } _kwtuple = {
1104 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1105 .ob_item = { &_Py_ID(task), },
1106 };
1107 #undef NUM_KEYWORDS
1108 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1109
1110 #else // !Py_BUILD_CORE
1111 # define KWTUPLE NULL
1112 #endif // !Py_BUILD_CORE
1113
1114 static const char * const _keywords[] = {"task", NULL};
1115 static _PyArg_Parser _parser = {
1116 .keywords = _keywords,
1117 .fname = "_register_eager_task",
1118 .kwtuple = KWTUPLE,
1119 };
1120 #undef KWTUPLE
1121 PyObject *argsbuf[1];
1122 PyObject *task;
1123
1124 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1125 if (!args) {
1126 goto exit;
1127 }
1128 task = args[0];
1129 return_value = _asyncio__register_eager_task_impl(module, task);
1130
1131 exit:
1132 return return_value;
1133 }
1134
1135 PyDoc_STRVAR(_asyncio__unregister_task__doc__,
1136 "_unregister_task($module, /, task)\n"
1137 "--\n"
1138 "\n"
1139 "Unregister a task.\n"
1140 "\n"
1141 "Returns None.");
1142
1143 #define _ASYNCIO__UNREGISTER_TASK_METHODDEF \
1144 {"_unregister_task", _PyCFunction_CAST(_asyncio__unregister_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__unregister_task__doc__},
1145
1146 static PyObject *
1147 _asyncio__unregister_task_impl(PyObject *module, PyObject *task);
1148
1149 static PyObject *
_asyncio__unregister_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1150 _asyncio__unregister_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1151 {
1152 PyObject *return_value = NULL;
1153 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1154
1155 #define NUM_KEYWORDS 1
1156 static struct {
1157 PyGC_Head _this_is_not_used;
1158 PyObject_VAR_HEAD
1159 PyObject *ob_item[NUM_KEYWORDS];
1160 } _kwtuple = {
1161 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1162 .ob_item = { &_Py_ID(task), },
1163 };
1164 #undef NUM_KEYWORDS
1165 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1166
1167 #else // !Py_BUILD_CORE
1168 # define KWTUPLE NULL
1169 #endif // !Py_BUILD_CORE
1170
1171 static const char * const _keywords[] = {"task", NULL};
1172 static _PyArg_Parser _parser = {
1173 .keywords = _keywords,
1174 .fname = "_unregister_task",
1175 .kwtuple = KWTUPLE,
1176 };
1177 #undef KWTUPLE
1178 PyObject *argsbuf[1];
1179 PyObject *task;
1180
1181 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1182 if (!args) {
1183 goto exit;
1184 }
1185 task = args[0];
1186 return_value = _asyncio__unregister_task_impl(module, task);
1187
1188 exit:
1189 return return_value;
1190 }
1191
1192 PyDoc_STRVAR(_asyncio__unregister_eager_task__doc__,
1193 "_unregister_eager_task($module, /, task)\n"
1194 "--\n"
1195 "\n"
1196 "Unregister a task.\n"
1197 "\n"
1198 "Returns None.");
1199
1200 #define _ASYNCIO__UNREGISTER_EAGER_TASK_METHODDEF \
1201 {"_unregister_eager_task", _PyCFunction_CAST(_asyncio__unregister_eager_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__unregister_eager_task__doc__},
1202
1203 static PyObject *
1204 _asyncio__unregister_eager_task_impl(PyObject *module, PyObject *task);
1205
1206 static PyObject *
_asyncio__unregister_eager_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1207 _asyncio__unregister_eager_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1208 {
1209 PyObject *return_value = NULL;
1210 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1211
1212 #define NUM_KEYWORDS 1
1213 static struct {
1214 PyGC_Head _this_is_not_used;
1215 PyObject_VAR_HEAD
1216 PyObject *ob_item[NUM_KEYWORDS];
1217 } _kwtuple = {
1218 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1219 .ob_item = { &_Py_ID(task), },
1220 };
1221 #undef NUM_KEYWORDS
1222 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1223
1224 #else // !Py_BUILD_CORE
1225 # define KWTUPLE NULL
1226 #endif // !Py_BUILD_CORE
1227
1228 static const char * const _keywords[] = {"task", NULL};
1229 static _PyArg_Parser _parser = {
1230 .keywords = _keywords,
1231 .fname = "_unregister_eager_task",
1232 .kwtuple = KWTUPLE,
1233 };
1234 #undef KWTUPLE
1235 PyObject *argsbuf[1];
1236 PyObject *task;
1237
1238 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1239 if (!args) {
1240 goto exit;
1241 }
1242 task = args[0];
1243 return_value = _asyncio__unregister_eager_task_impl(module, task);
1244
1245 exit:
1246 return return_value;
1247 }
1248
1249 PyDoc_STRVAR(_asyncio__enter_task__doc__,
1250 "_enter_task($module, /, loop, task)\n"
1251 "--\n"
1252 "\n"
1253 "Enter into task execution or resume suspended task.\n"
1254 "\n"
1255 "Task belongs to loop.\n"
1256 "\n"
1257 "Returns None.");
1258
1259 #define _ASYNCIO__ENTER_TASK_METHODDEF \
1260 {"_enter_task", _PyCFunction_CAST(_asyncio__enter_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__enter_task__doc__},
1261
1262 static PyObject *
1263 _asyncio__enter_task_impl(PyObject *module, PyObject *loop, PyObject *task);
1264
1265 static PyObject *
_asyncio__enter_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1266 _asyncio__enter_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1267 {
1268 PyObject *return_value = NULL;
1269 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1270
1271 #define NUM_KEYWORDS 2
1272 static struct {
1273 PyGC_Head _this_is_not_used;
1274 PyObject_VAR_HEAD
1275 PyObject *ob_item[NUM_KEYWORDS];
1276 } _kwtuple = {
1277 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1278 .ob_item = { &_Py_ID(loop), &_Py_ID(task), },
1279 };
1280 #undef NUM_KEYWORDS
1281 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1282
1283 #else // !Py_BUILD_CORE
1284 # define KWTUPLE NULL
1285 #endif // !Py_BUILD_CORE
1286
1287 static const char * const _keywords[] = {"loop", "task", NULL};
1288 static _PyArg_Parser _parser = {
1289 .keywords = _keywords,
1290 .fname = "_enter_task",
1291 .kwtuple = KWTUPLE,
1292 };
1293 #undef KWTUPLE
1294 PyObject *argsbuf[2];
1295 PyObject *loop;
1296 PyObject *task;
1297
1298 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1299 if (!args) {
1300 goto exit;
1301 }
1302 loop = args[0];
1303 task = args[1];
1304 return_value = _asyncio__enter_task_impl(module, loop, task);
1305
1306 exit:
1307 return return_value;
1308 }
1309
1310 PyDoc_STRVAR(_asyncio__leave_task__doc__,
1311 "_leave_task($module, /, loop, task)\n"
1312 "--\n"
1313 "\n"
1314 "Leave task execution or suspend a task.\n"
1315 "\n"
1316 "Task belongs to loop.\n"
1317 "\n"
1318 "Returns None.");
1319
1320 #define _ASYNCIO__LEAVE_TASK_METHODDEF \
1321 {"_leave_task", _PyCFunction_CAST(_asyncio__leave_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__leave_task__doc__},
1322
1323 static PyObject *
1324 _asyncio__leave_task_impl(PyObject *module, PyObject *loop, PyObject *task);
1325
1326 static PyObject *
_asyncio__leave_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1327 _asyncio__leave_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1328 {
1329 PyObject *return_value = NULL;
1330 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1331
1332 #define NUM_KEYWORDS 2
1333 static struct {
1334 PyGC_Head _this_is_not_used;
1335 PyObject_VAR_HEAD
1336 PyObject *ob_item[NUM_KEYWORDS];
1337 } _kwtuple = {
1338 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1339 .ob_item = { &_Py_ID(loop), &_Py_ID(task), },
1340 };
1341 #undef NUM_KEYWORDS
1342 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1343
1344 #else // !Py_BUILD_CORE
1345 # define KWTUPLE NULL
1346 #endif // !Py_BUILD_CORE
1347
1348 static const char * const _keywords[] = {"loop", "task", NULL};
1349 static _PyArg_Parser _parser = {
1350 .keywords = _keywords,
1351 .fname = "_leave_task",
1352 .kwtuple = KWTUPLE,
1353 };
1354 #undef KWTUPLE
1355 PyObject *argsbuf[2];
1356 PyObject *loop;
1357 PyObject *task;
1358
1359 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1360 if (!args) {
1361 goto exit;
1362 }
1363 loop = args[0];
1364 task = args[1];
1365 return_value = _asyncio__leave_task_impl(module, loop, task);
1366
1367 exit:
1368 return return_value;
1369 }
1370
1371 PyDoc_STRVAR(_asyncio__swap_current_task__doc__,
1372 "_swap_current_task($module, /, loop, task)\n"
1373 "--\n"
1374 "\n"
1375 "Temporarily swap in the supplied task and return the original one (or None).\n"
1376 "\n"
1377 "This is intended for use during eager coroutine execution.");
1378
1379 #define _ASYNCIO__SWAP_CURRENT_TASK_METHODDEF \
1380 {"_swap_current_task", _PyCFunction_CAST(_asyncio__swap_current_task), METH_FASTCALL|METH_KEYWORDS, _asyncio__swap_current_task__doc__},
1381
1382 static PyObject *
1383 _asyncio__swap_current_task_impl(PyObject *module, PyObject *loop,
1384 PyObject *task);
1385
1386 static PyObject *
_asyncio__swap_current_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1387 _asyncio__swap_current_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1388 {
1389 PyObject *return_value = NULL;
1390 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1391
1392 #define NUM_KEYWORDS 2
1393 static struct {
1394 PyGC_Head _this_is_not_used;
1395 PyObject_VAR_HEAD
1396 PyObject *ob_item[NUM_KEYWORDS];
1397 } _kwtuple = {
1398 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1399 .ob_item = { &_Py_ID(loop), &_Py_ID(task), },
1400 };
1401 #undef NUM_KEYWORDS
1402 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1403
1404 #else // !Py_BUILD_CORE
1405 # define KWTUPLE NULL
1406 #endif // !Py_BUILD_CORE
1407
1408 static const char * const _keywords[] = {"loop", "task", NULL};
1409 static _PyArg_Parser _parser = {
1410 .keywords = _keywords,
1411 .fname = "_swap_current_task",
1412 .kwtuple = KWTUPLE,
1413 };
1414 #undef KWTUPLE
1415 PyObject *argsbuf[2];
1416 PyObject *loop;
1417 PyObject *task;
1418
1419 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 2, 0, argsbuf);
1420 if (!args) {
1421 goto exit;
1422 }
1423 loop = args[0];
1424 task = args[1];
1425 return_value = _asyncio__swap_current_task_impl(module, loop, task);
1426
1427 exit:
1428 return return_value;
1429 }
1430
1431 PyDoc_STRVAR(_asyncio_current_task__doc__,
1432 "current_task($module, /, loop=None)\n"
1433 "--\n"
1434 "\n"
1435 "Return a currently executed task.");
1436
1437 #define _ASYNCIO_CURRENT_TASK_METHODDEF \
1438 {"current_task", _PyCFunction_CAST(_asyncio_current_task), METH_FASTCALL|METH_KEYWORDS, _asyncio_current_task__doc__},
1439
1440 static PyObject *
1441 _asyncio_current_task_impl(PyObject *module, PyObject *loop);
1442
1443 static PyObject *
_asyncio_current_task(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1444 _asyncio_current_task(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1445 {
1446 PyObject *return_value = NULL;
1447 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
1448
1449 #define NUM_KEYWORDS 1
1450 static struct {
1451 PyGC_Head _this_is_not_used;
1452 PyObject_VAR_HEAD
1453 PyObject *ob_item[NUM_KEYWORDS];
1454 } _kwtuple = {
1455 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
1456 .ob_item = { &_Py_ID(loop), },
1457 };
1458 #undef NUM_KEYWORDS
1459 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
1460
1461 #else // !Py_BUILD_CORE
1462 # define KWTUPLE NULL
1463 #endif // !Py_BUILD_CORE
1464
1465 static const char * const _keywords[] = {"loop", NULL};
1466 static _PyArg_Parser _parser = {
1467 .keywords = _keywords,
1468 .fname = "current_task",
1469 .kwtuple = KWTUPLE,
1470 };
1471 #undef KWTUPLE
1472 PyObject *argsbuf[1];
1473 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
1474 PyObject *loop = Py_None;
1475
1476 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
1477 if (!args) {
1478 goto exit;
1479 }
1480 if (!noptargs) {
1481 goto skip_optional_pos;
1482 }
1483 loop = args[0];
1484 skip_optional_pos:
1485 return_value = _asyncio_current_task_impl(module, loop);
1486
1487 exit:
1488 return return_value;
1489 }
1490 /*[clinic end generated code: output=b26155080c82c472 input=a9049054013a1b77]*/
1491