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(enum_new__doc__,
12 "enumerate(iterable, start=0)\n"
13 "--\n"
14 "\n"
15 "Return an enumerate object.\n"
16 "\n"
17 " iterable\n"
18 " an object supporting iteration\n"
19 "\n"
20 "The enumerate object yields pairs containing a count (from start, which\n"
21 "defaults to zero) and a value yielded by the iterable argument.\n"
22 "\n"
23 "enumerate is useful for obtaining an indexed list:\n"
24 " (0, seq[0]), (1, seq[1]), (2, seq[2]), ...");
25
26 static PyObject *
27 enum_new_impl(PyTypeObject *type, PyObject *iterable, PyObject *start);
28
29 static PyObject *
enum_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)30 enum_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
31 {
32 PyObject *return_value = NULL;
33 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
34
35 #define NUM_KEYWORDS 2
36 static struct {
37 PyGC_Head _this_is_not_used;
38 PyObject_VAR_HEAD
39 PyObject *ob_item[NUM_KEYWORDS];
40 } _kwtuple = {
41 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
42 .ob_item = { &_Py_ID(iterable), &_Py_ID(start), },
43 };
44 #undef NUM_KEYWORDS
45 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
46
47 #else // !Py_BUILD_CORE
48 # define KWTUPLE NULL
49 #endif // !Py_BUILD_CORE
50
51 static const char * const _keywords[] = {"iterable", "start", NULL};
52 static _PyArg_Parser _parser = {
53 .keywords = _keywords,
54 .fname = "enumerate",
55 .kwtuple = KWTUPLE,
56 };
57 #undef KWTUPLE
58 PyObject *argsbuf[2];
59 PyObject * const *fastargs;
60 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
61 Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1;
62 PyObject *iterable;
63 PyObject *start = 0;
64
65 fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser, 1, 2, 0, argsbuf);
66 if (!fastargs) {
67 goto exit;
68 }
69 iterable = fastargs[0];
70 if (!noptargs) {
71 goto skip_optional_pos;
72 }
73 start = fastargs[1];
74 skip_optional_pos:
75 return_value = enum_new_impl(type, iterable, start);
76
77 exit:
78 return return_value;
79 }
80
81 PyDoc_STRVAR(reversed_new__doc__,
82 "reversed(sequence, /)\n"
83 "--\n"
84 "\n"
85 "Return a reverse iterator over the values of the given sequence.");
86
87 static PyObject *
88 reversed_new_impl(PyTypeObject *type, PyObject *seq);
89
90 static PyObject *
reversed_new(PyTypeObject * type,PyObject * args,PyObject * kwargs)91 reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
92 {
93 PyObject *return_value = NULL;
94 PyTypeObject *base_tp = &PyReversed_Type;
95 PyObject *seq;
96
97 if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
98 !_PyArg_NoKeywords("reversed", kwargs)) {
99 goto exit;
100 }
101 if (!_PyArg_CheckPositional("reversed", PyTuple_GET_SIZE(args), 1, 1)) {
102 goto exit;
103 }
104 seq = PyTuple_GET_ITEM(args, 0);
105 return_value = reversed_new_impl(type, seq);
106
107 exit:
108 return return_value;
109 }
110 /*[clinic end generated code: output=5c48a9a482a52e91 input=a9049054013a1b77]*/
111