blob: c3f7e39eb63a5f6936083c59e66d5192b0904e3d [file] [log] [blame]
Guido van Rossum3f5da241990-12-20 15:06:42 +00001/* Built-in functions */
2
Guido van Rossum79f25d91997-04-29 20:08:16 +00003#include "Python.h"
Guido van Rossum6bf62da1997-04-11 20:37:35 +00004#include <ctype.h>
Victor Stinnereec8e612021-03-18 14:57:49 +01005#include "pycore_ast.h" // _PyAST_Validate()
Victor Stinner94faa072021-03-23 20:47:40 +01006#undef Yield /* undefine macro conflicting with <winbase.h> */
Victor Stinnerc96d00e2020-06-22 18:02:49 +02007#include "pycore_object.h" // _Py_AddToAllObjects()
Victor Stinner384621c2020-06-22 17:27:35 +02008#include "pycore_pyerrors.h" // _PyErr_NoMemory()
9#include "pycore_pystate.h" // _PyThreadState_GET()
10#include "pycore_tuple.h" // _PyTuple_FromArray()
Mark Shannon0332e562021-02-01 10:42:03 +000011#include "pycore_ceval.h" // _PyEval_Vector()
Guido van Rossum6bf62da1997-04-11 20:37:35 +000012
Victor Stinnerbd303c12013-11-07 23:07:29 +010013_Py_IDENTIFIER(__builtins__);
14_Py_IDENTIFIER(__dict__);
15_Py_IDENTIFIER(__prepare__);
16_Py_IDENTIFIER(__round__);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010017_Py_IDENTIFIER(__mro_entries__);
Victor Stinnerbd303c12013-11-07 23:07:29 +010018_Py_IDENTIFIER(encoding);
19_Py_IDENTIFIER(errors);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020020_Py_IDENTIFIER(fileno);
21_Py_IDENTIFIER(flush);
Victor Stinnerbd303c12013-11-07 23:07:29 +010022_Py_IDENTIFIER(metaclass);
23_Py_IDENTIFIER(sort);
24_Py_IDENTIFIER(stdin);
25_Py_IDENTIFIER(stdout);
26_Py_IDENTIFIER(stderr);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +020027
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030028#include "clinic/bltinmodule.c.h"
29
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010030static PyObject*
Victor Stinner05d68a82018-01-18 11:15:25 +010031update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010032{
Victor Stinner05d68a82018-01-18 11:15:25 +010033 Py_ssize_t i, j;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010034 PyObject *base, *meth, *new_base, *result, *new_bases = NULL;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010035 assert(PyTuple_Check(bases));
36
37 for (i = 0; i < nargs; i++) {
38 base = args[i];
39 if (PyType_Check(base)) {
40 if (new_bases) {
41 /* If we already have made a replacement, then we append every normal base,
42 otherwise just skip it. */
43 if (PyList_Append(new_bases, base) < 0) {
44 goto error;
45 }
46 }
47 continue;
48 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +020049 if (_PyObject_LookupAttrId(base, &PyId___mro_entries__, &meth) < 0) {
50 goto error;
51 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010052 if (!meth) {
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010053 if (new_bases) {
54 if (PyList_Append(new_bases, base) < 0) {
55 goto error;
56 }
57 }
58 continue;
59 }
Petr Viktorinffd97532020-02-11 17:46:57 +010060 new_base = PyObject_CallOneArg(meth, bases);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +010061 Py_DECREF(meth);
62 if (!new_base) {
63 goto error;
64 }
65 if (!PyTuple_Check(new_base)) {
66 PyErr_SetString(PyExc_TypeError,
67 "__mro_entries__ must return a tuple");
68 Py_DECREF(new_base);
69 goto error;
70 }
71 if (!new_bases) {
72 /* If this is a first successful replacement, create new_bases list and
73 copy previously encountered bases. */
74 if (!(new_bases = PyList_New(i))) {
75 goto error;
76 }
77 for (j = 0; j < i; j++) {
78 base = args[j];
79 PyList_SET_ITEM(new_bases, j, base);
80 Py_INCREF(base);
81 }
82 }
83 j = PyList_GET_SIZE(new_bases);
84 if (PyList_SetSlice(new_bases, j, j, new_base) < 0) {
85 goto error;
86 }
87 Py_DECREF(new_base);
88 }
89 if (!new_bases) {
90 return bases;
91 }
92 result = PyList_AsTuple(new_bases);
93 Py_DECREF(new_bases);
94 return result;
95
96error:
97 Py_XDECREF(new_bases);
98 return NULL;
99}
100
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000101/* AC: cannot convert yet, waiting for *args support */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000102static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200103builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
Victor Stinner773dc6d2017-01-16 23:46:26 +0100104 PyObject *kwnames)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000105{
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100106 PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *orig_bases;
Nick Coghlan19d24672016-12-05 16:47:55 +1000107 PyObject *cls = NULL, *cell = NULL;
Victor Stinner0c39b1b2015-03-18 15:02:06 +0100108 int isclass = 0; /* initialize to prevent gcc warning */
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 if (nargs < 2) {
111 PyErr_SetString(PyExc_TypeError,
112 "__build_class__: not enough arguments");
113 return NULL;
114 }
Victor Stinner773dc6d2017-01-16 23:46:26 +0100115 func = args[0]; /* Better be callable */
Benjamin Petersone8e14592013-05-16 14:37:25 -0500116 if (!PyFunction_Check(func)) {
117 PyErr_SetString(PyExc_TypeError,
Zachary Ware9b338722014-08-05 14:01:10 -0500118 "__build_class__: func must be a function");
Benjamin Petersone8e14592013-05-16 14:37:25 -0500119 return NULL;
120 }
Victor Stinner773dc6d2017-01-16 23:46:26 +0100121 name = args[1];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 if (!PyUnicode_Check(name)) {
123 PyErr_SetString(PyExc_TypeError,
124 "__build_class__: name is not a string");
125 return NULL;
126 }
Sergey Fedoseevf1b9abe2019-02-26 02:37:26 +0500127 orig_bases = _PyTuple_FromArray(args + 2, nargs - 2);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100128 if (orig_bases == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000130
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100131 bases = update_bases(orig_bases, args + 2, nargs - 2);
132 if (bases == NULL) {
133 Py_DECREF(orig_bases);
134 return NULL;
135 }
136
Victor Stinner773dc6d2017-01-16 23:46:26 +0100137 if (kwnames == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 meta = NULL;
139 mkw = NULL;
140 }
141 else {
Victor Stinner773dc6d2017-01-16 23:46:26 +0100142 mkw = _PyStack_AsDict(args + nargs, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 if (mkw == NULL) {
144 Py_DECREF(bases);
145 return NULL;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000146 }
Victor Stinner773dc6d2017-01-16 23:46:26 +0100147
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200148 meta = _PyDict_GetItemIdWithError(mkw, &PyId_metaclass);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 if (meta != NULL) {
150 Py_INCREF(meta);
Victor Stinnerae9f1612013-11-06 22:46:51 +0100151 if (_PyDict_DelItemId(mkw, &PyId_metaclass) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 Py_DECREF(meta);
153 Py_DECREF(mkw);
154 Py_DECREF(bases);
155 return NULL;
156 }
Nick Coghlande31b192011-10-23 22:04:16 +1000157 /* metaclass is explicitly given, check if it's indeed a class */
158 isclass = PyType_Check(meta);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200160 else if (PyErr_Occurred()) {
161 Py_DECREF(mkw);
162 Py_DECREF(bases);
163 return NULL;
164 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 }
166 if (meta == NULL) {
Nick Coghlande31b192011-10-23 22:04:16 +1000167 /* if there are no bases, use type: */
168 if (PyTuple_GET_SIZE(bases) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 meta = (PyObject *) (&PyType_Type);
Nick Coghlande31b192011-10-23 22:04:16 +1000170 }
171 /* else get the type of the first base */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 else {
173 PyObject *base0 = PyTuple_GET_ITEM(bases, 0);
Victor Stinnera102ed72020-02-07 02:24:48 +0100174 meta = (PyObject *)Py_TYPE(base0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 }
176 Py_INCREF(meta);
Nick Coghlande31b192011-10-23 22:04:16 +1000177 isclass = 1; /* meta is really a class */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 }
Nick Coghlan9715d262011-10-23 22:36:42 +1000179
Nick Coghlande31b192011-10-23 22:04:16 +1000180 if (isclass) {
181 /* meta is really a class, so check for a more derived
182 metaclass, or possible metaclass conflicts: */
183 winner = (PyObject *)_PyType_CalculateMetaclass((PyTypeObject *)meta,
184 bases);
185 if (winner == NULL) {
186 Py_DECREF(meta);
187 Py_XDECREF(mkw);
188 Py_DECREF(bases);
189 return NULL;
190 }
191 if (winner != meta) {
192 Py_DECREF(meta);
193 meta = winner;
194 Py_INCREF(meta);
195 }
196 }
197 /* else: meta is not a class, so we cannot do the metaclass
198 calculation, so we will use the explicitly given object as it is */
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200199 if (_PyObject_LookupAttrId(meta, &PyId___prepare__, &prep) < 0) {
200 ns = NULL;
201 }
202 else if (prep == NULL) {
203 ns = PyDict_New();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 }
205 else {
Victor Stinner463b86a2016-08-22 23:33:13 +0200206 PyObject *pargs[2] = {name, bases};
Petr Viktorinffd97532020-02-11 17:46:57 +0100207 ns = PyObject_VectorcallDict(prep, pargs, 2, mkw);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 Py_DECREF(prep);
209 }
210 if (ns == NULL) {
211 Py_DECREF(meta);
212 Py_XDECREF(mkw);
213 Py_DECREF(bases);
214 return NULL;
215 }
Oren Milman5837d042017-09-27 17:04:37 +0300216 if (!PyMapping_Check(ns)) {
217 PyErr_Format(PyExc_TypeError,
218 "%.200s.__prepare__() must return a mapping, not %.200s",
219 isclass ? ((PyTypeObject *)meta)->tp_name : "<metaclass>",
220 Py_TYPE(ns)->tp_name);
221 goto error;
222 }
Mark Shannon0332e562021-02-01 10:42:03 +0000223 PyFrameConstructor *f = PyFunction_AS_FRAME_CONSTRUCTOR(func);
224 PyThreadState *tstate = PyThreadState_GET();
225 cell = _PyEval_Vector(tstate, f, ns, NULL, 0, NULL);
Nick Coghlan19d24672016-12-05 16:47:55 +1000226 if (cell != NULL) {
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100227 if (bases != orig_bases) {
228 if (PyMapping_SetItemString(ns, "__orig_bases__", orig_bases) < 0) {
229 goto error;
230 }
231 }
Victor Stinnerd1c2a8e2016-08-23 01:34:35 +0200232 PyObject *margs[3] = {name, bases, ns};
Petr Viktorinffd97532020-02-11 17:46:57 +0100233 cls = PyObject_VectorcallDict(meta, margs, 3, mkw);
Nick Coghlan19d24672016-12-05 16:47:55 +1000234 if (cls != NULL && PyType_Check(cls) && PyCell_Check(cell)) {
235 PyObject *cell_cls = PyCell_GET(cell);
236 if (cell_cls != cls) {
Nick Coghlan19d24672016-12-05 16:47:55 +1000237 if (cell_cls == NULL) {
238 const char *msg =
239 "__class__ not set defining %.200R as %.200R. "
240 "Was __classcell__ propagated to type.__new__?";
Serhiy Storchakaf5e7b192018-05-20 08:48:12 +0300241 PyErr_Format(PyExc_RuntimeError, msg, name, cls);
Nick Coghlan19d24672016-12-05 16:47:55 +1000242 } else {
243 const char *msg =
244 "__class__ set to %.200R defining %.200R as %.200R";
245 PyErr_Format(PyExc_TypeError, msg, cell_cls, name, cls);
Nick Coghlan19d24672016-12-05 16:47:55 +1000246 }
Serhiy Storchakaf5e7b192018-05-20 08:48:12 +0300247 Py_DECREF(cls);
248 cls = NULL;
249 goto error;
Nick Coghlan19d24672016-12-05 16:47:55 +1000250 }
251 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 }
Nick Coghlan19d24672016-12-05 16:47:55 +1000253error:
254 Py_XDECREF(cell);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 Py_DECREF(ns);
256 Py_DECREF(meta);
257 Py_XDECREF(mkw);
258 Py_DECREF(bases);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100259 if (bases != orig_bases) {
260 Py_DECREF(orig_bases);
261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 return cls;
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000263}
264
265PyDoc_STRVAR(build_class_doc,
Pablo Galindoe3babbd2019-10-13 16:35:41 +0100266"__build_class__(func, name, /, *bases, [metaclass], **kwds) -> class\n\
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000267\n\
268Internal helper function used by the class statement.");
269
270static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000271builtin___import__(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 static char *kwlist[] = {"name", "globals", "locals", "fromlist",
274 "level", 0};
Victor Stinnerfe93faf2011-03-14 15:54:52 -0400275 PyObject *name, *globals = NULL, *locals = NULL, *fromlist = NULL;
Brett Cannonfd074152012-04-14 14:10:13 -0400276 int level = 0;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000277
Victor Stinnerfe93faf2011-03-14 15:54:52 -0400278 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|OOOi:__import__",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 kwlist, &name, &globals, &locals, &fromlist, &level))
280 return NULL;
Victor Stinnerfe93faf2011-03-14 15:54:52 -0400281 return PyImport_ImportModuleLevelObject(name, globals, locals,
282 fromlist, level);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000283}
284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000285PyDoc_STRVAR(import_doc,
Brett Cannoncb4996a2012-08-06 16:34:44 -0400286"__import__(name, globals=None, locals=None, fromlist=(), level=0) -> module\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000287\n\
Brett Cannon5305a992010-09-27 21:08:38 +0000288Import a module. Because this function is meant for use by the Python\n\
oldk461d2252018-02-02 12:20:00 +0800289interpreter and not for general use, it is better to use\n\
Brett Cannon5305a992010-09-27 21:08:38 +0000290importlib.import_module() to programmatically import a module.\n\
291\n\
292The globals argument is only used to determine the context;\n\
293they are not modified. The locals argument is unused. The fromlist\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000294should be a list of names to emulate ``from name import ...'', or an\n\
295empty list to emulate ``import name''.\n\
296When importing a module from a package, note that __import__('A.B', ...)\n\
297returns package A when fromlist is empty, but its submodule B when\n\
oldk461d2252018-02-02 12:20:00 +0800298fromlist is not empty. The level argument is used to determine whether to\n\
299perform absolute or relative imports: 0 is absolute, while a positive number\n\
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000300is the number of parent directories to search relative to the current module.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000301
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000302
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000303/*[clinic input]
304abs as builtin_abs
305
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300306 x: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000307 /
308
309Return the absolute value of the argument.
310[clinic start generated code]*/
311
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300313builtin_abs(PyObject *module, PyObject *x)
314/*[clinic end generated code: output=b1b433b9e51356f5 input=bed4ca14e29c20d1]*/
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000315{
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000316 return PyNumber_Absolute(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317}
318
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000319/*[clinic input]
320all as builtin_all
321
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300322 iterable: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000323 /
324
325Return True if bool(x) is True for all values x in the iterable.
326
327If the iterable is empty, return True.
328[clinic start generated code]*/
329
Raymond Hettinger96229b12005-03-11 06:49:40 +0000330static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300331builtin_all(PyObject *module, PyObject *iterable)
332/*[clinic end generated code: output=ca2a7127276f79b3 input=1a7c5d1bc3438a21]*/
Raymond Hettinger96229b12005-03-11 06:49:40 +0000333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 PyObject *it, *item;
335 PyObject *(*iternext)(PyObject *);
336 int cmp;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000337
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000338 it = PyObject_GetIter(iterable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 if (it == NULL)
340 return NULL;
341 iternext = *Py_TYPE(it)->tp_iternext;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 for (;;) {
344 item = iternext(it);
345 if (item == NULL)
346 break;
347 cmp = PyObject_IsTrue(item);
348 Py_DECREF(item);
349 if (cmp < 0) {
350 Py_DECREF(it);
351 return NULL;
352 }
353 if (cmp == 0) {
354 Py_DECREF(it);
355 Py_RETURN_FALSE;
356 }
357 }
358 Py_DECREF(it);
359 if (PyErr_Occurred()) {
360 if (PyErr_ExceptionMatches(PyExc_StopIteration))
361 PyErr_Clear();
362 else
363 return NULL;
364 }
365 Py_RETURN_TRUE;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000366}
367
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000368/*[clinic input]
369any as builtin_any
370
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300371 iterable: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000372 /
373
374Return True if bool(x) is True for any x in the iterable.
375
376If the iterable is empty, return False.
377[clinic start generated code]*/
378
Raymond Hettinger96229b12005-03-11 06:49:40 +0000379static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300380builtin_any(PyObject *module, PyObject *iterable)
381/*[clinic end generated code: output=fa65684748caa60e input=41d7451c23384f24]*/
Raymond Hettinger96229b12005-03-11 06:49:40 +0000382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 PyObject *it, *item;
384 PyObject *(*iternext)(PyObject *);
385 int cmp;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000386
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000387 it = PyObject_GetIter(iterable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 if (it == NULL)
389 return NULL;
390 iternext = *Py_TYPE(it)->tp_iternext;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 for (;;) {
393 item = iternext(it);
394 if (item == NULL)
395 break;
396 cmp = PyObject_IsTrue(item);
397 Py_DECREF(item);
398 if (cmp < 0) {
399 Py_DECREF(it);
400 return NULL;
401 }
Raymond Hettinger5098b582015-10-09 00:42:47 -0400402 if (cmp > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 Py_DECREF(it);
404 Py_RETURN_TRUE;
405 }
406 }
407 Py_DECREF(it);
408 if (PyErr_Occurred()) {
409 if (PyErr_ExceptionMatches(PyExc_StopIteration))
410 PyErr_Clear();
411 else
412 return NULL;
413 }
414 Py_RETURN_FALSE;
Raymond Hettinger96229b12005-03-11 06:49:40 +0000415}
416
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000417/*[clinic input]
418ascii as builtin_ascii
419
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300420 obj: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000421 /
422
423Return an ASCII-only representation of an object.
424
425As repr(), return a string containing a printable representation of an
426object, but escape the non-ASCII characters in the string returned by
427repr() using \\x, \\u or \\U escapes. This generates a string similar
428to that returned by repr() in Python 2.
429[clinic start generated code]*/
430
Georg Brandl559e5d72008-06-11 18:37:52 +0000431static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300432builtin_ascii(PyObject *module, PyObject *obj)
433/*[clinic end generated code: output=6d37b3f0984c7eb9 input=4c62732e1b3a3cc9]*/
Georg Brandl559e5d72008-06-11 18:37:52 +0000434{
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000435 return PyObject_ASCII(obj);
Georg Brandl559e5d72008-06-11 18:37:52 +0000436}
437
Georg Brandl559e5d72008-06-11 18:37:52 +0000438
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000439/*[clinic input]
440bin as builtin_bin
441
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300442 number: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000443 /
444
445Return the binary representation of an integer.
446
447 >>> bin(2796202)
448 '0b1010101010101010101010'
449[clinic start generated code]*/
450
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300452builtin_bin(PyObject *module, PyObject *number)
453/*[clinic end generated code: output=b6fc4ad5e649f4f7 input=53f8a0264bacaf90]*/
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000454{
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000455 return PyNumber_ToBase(number, 2);
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000456}
457
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000458
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000459/*[clinic input]
460callable as builtin_callable
461
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300462 obj: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000463 /
464
465Return whether the object is callable (i.e., some kind of function).
466
467Note that classes are callable, as are instances of classes with a
468__call__() method.
469[clinic start generated code]*/
470
Antoine Pitroue71362d2010-11-27 22:00:11 +0000471static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300472builtin_callable(PyObject *module, PyObject *obj)
473/*[clinic end generated code: output=2b095d59d934cb7e input=1423bab99cc41f58]*/
Antoine Pitroue71362d2010-11-27 22:00:11 +0000474{
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000475 return PyBool_FromLong((long)PyCallable_Check(obj));
Antoine Pitroue71362d2010-11-27 22:00:11 +0000476}
477
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400478static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200479builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400480{
481 PyObject *hook = PySys_GetObject("breakpointhook");
482
483 if (hook == NULL) {
484 PyErr_SetString(PyExc_RuntimeError, "lost sys.breakpointhook");
485 return NULL;
486 }
Steve Dower60419a72019-06-24 08:42:54 -0700487
488 if (PySys_Audit("builtins.breakpoint", "O", hook) < 0) {
489 return NULL;
490 }
491
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400492 Py_INCREF(hook);
Petr Viktorinffd97532020-02-11 17:46:57 +0100493 PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords);
Barry Warsaw36c1d1f2017-10-05 12:11:18 -0400494 Py_DECREF(hook);
495 return retval;
496}
497
498PyDoc_STRVAR(breakpoint_doc,
499"breakpoint(*args, **kws)\n\
500\n\
501Call sys.breakpointhook(*args, **kws). sys.breakpointhook() must accept\n\
502whatever arguments are passed.\n\
503\n\
504By default, this drops you into the pdb debugger.");
Antoine Pitroue71362d2010-11-27 22:00:11 +0000505
Raymond Hettinger17301e92008-03-13 00:19:26 +0000506typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 PyObject_HEAD
508 PyObject *func;
509 PyObject *it;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000510} filterobject;
511
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000512static PyObject *
Raymond Hettinger17301e92008-03-13 00:19:26 +0000513filter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 PyObject *func, *seq;
516 PyObject *it;
517 filterobject *lz;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000518
Serhiy Storchaka6cca5c82017-06-08 14:41:19 +0300519 if (type == &PyFilter_Type && !_PyArg_NoKeywords("filter", kwds))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 return NULL;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (!PyArg_UnpackTuple(args, "filter", 2, 2, &func, &seq))
523 return NULL;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* Get iterator. */
526 it = PyObject_GetIter(seq);
527 if (it == NULL)
528 return NULL;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 /* create filterobject structure */
531 lz = (filterobject *)type->tp_alloc(type, 0);
532 if (lz == NULL) {
533 Py_DECREF(it);
534 return NULL;
535 }
Dong-hee Na9a9c11a2021-03-11 01:39:52 +0900536
537 lz->func = Py_NewRef(func);
538 lz->it = it;
539
540 return (PyObject *)lz;
541}
542
543static PyObject *
544filter_vectorcall(PyObject *type, PyObject * const*args,
545 size_t nargsf, PyObject *kwnames)
546{
547 PyTypeObject *tp = (PyTypeObject *)type;
548 if (tp == &PyFilter_Type && !_PyArg_NoKwnames("filter", kwnames)) {
549 return NULL;
550 }
551
552 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
553 if (!_PyArg_CheckPositional("filter", nargs, 2, 2)) {
554 return NULL;
555 }
556
557 PyObject *it = PyObject_GetIter(args[1]);
558 if (it == NULL) {
559 return NULL;
560 }
561
562 filterobject *lz = (filterobject *)tp->tp_alloc(tp, 0);
563
564 if (lz == NULL) {
565 Py_DECREF(it);
566 return NULL;
567 }
568
569 lz->func = Py_NewRef(args[0]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 lz->it = it;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 return (PyObject *)lz;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000573}
574
575static void
576filter_dealloc(filterobject *lz)
577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 PyObject_GC_UnTrack(lz);
579 Py_XDECREF(lz->func);
580 Py_XDECREF(lz->it);
581 Py_TYPE(lz)->tp_free(lz);
Raymond Hettinger17301e92008-03-13 00:19:26 +0000582}
583
584static int
585filter_traverse(filterobject *lz, visitproc visit, void *arg)
586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 Py_VISIT(lz->it);
588 Py_VISIT(lz->func);
589 return 0;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000590}
591
592static PyObject *
593filter_next(filterobject *lz)
594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 PyObject *item;
596 PyObject *it = lz->it;
597 long ok;
598 PyObject *(*iternext)(PyObject *);
Raymond Hettingerbd5f0e82015-10-09 01:34:08 -0400599 int checktrue = lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 iternext = *Py_TYPE(it)->tp_iternext;
602 for (;;) {
603 item = iternext(it);
604 if (item == NULL)
605 return NULL;
Raymond Hettinger17301e92008-03-13 00:19:26 +0000606
Raymond Hettingerbd5f0e82015-10-09 01:34:08 -0400607 if (checktrue) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 ok = PyObject_IsTrue(item);
609 } else {
610 PyObject *good;
Petr Viktorinffd97532020-02-11 17:46:57 +0100611 good = PyObject_CallOneArg(lz->func, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 if (good == NULL) {
613 Py_DECREF(item);
614 return NULL;
615 }
616 ok = PyObject_IsTrue(good);
617 Py_DECREF(good);
618 }
Antoine Pitrou6f430e42012-08-15 23:18:25 +0200619 if (ok > 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 return item;
621 Py_DECREF(item);
Antoine Pitrou6f430e42012-08-15 23:18:25 +0200622 if (ok < 0)
623 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000625}
626
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000627static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530628filter_reduce(filterobject *lz, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000629{
630 return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->func, lz->it);
631}
632
633PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
634
635static PyMethodDef filter_methods[] = {
636 {"__reduce__", (PyCFunction)filter_reduce, METH_NOARGS, reduce_doc},
637 {NULL, NULL} /* sentinel */
638};
639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000640PyDoc_STRVAR(filter_doc,
Georg Brandld11ae5d2008-05-16 13:27:32 +0000641"filter(function or None, iterable) --> filter object\n\
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000642\n\
Georg Brandld11ae5d2008-05-16 13:27:32 +0000643Return an iterator yielding those items of iterable for which function(item)\n\
Raymond Hettinger17301e92008-03-13 00:19:26 +0000644is true. If function is None, return the items that are true.");
645
646PyTypeObject PyFilter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 PyVarObject_HEAD_INIT(&PyType_Type, 0)
648 "filter", /* tp_name */
649 sizeof(filterobject), /* tp_basicsize */
650 0, /* tp_itemsize */
651 /* methods */
652 (destructor)filter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200653 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 0, /* tp_getattr */
655 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200656 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 0, /* tp_repr */
658 0, /* tp_as_number */
659 0, /* tp_as_sequence */
660 0, /* tp_as_mapping */
661 0, /* tp_hash */
662 0, /* tp_call */
663 0, /* tp_str */
664 PyObject_GenericGetAttr, /* tp_getattro */
665 0, /* tp_setattro */
666 0, /* tp_as_buffer */
667 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
668 Py_TPFLAGS_BASETYPE, /* tp_flags */
669 filter_doc, /* tp_doc */
670 (traverseproc)filter_traverse, /* tp_traverse */
671 0, /* tp_clear */
672 0, /* tp_richcompare */
673 0, /* tp_weaklistoffset */
674 PyObject_SelfIter, /* tp_iter */
675 (iternextfunc)filter_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000676 filter_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 0, /* tp_members */
678 0, /* tp_getset */
679 0, /* tp_base */
680 0, /* tp_dict */
681 0, /* tp_descr_get */
682 0, /* tp_descr_set */
683 0, /* tp_dictoffset */
684 0, /* tp_init */
685 PyType_GenericAlloc, /* tp_alloc */
686 filter_new, /* tp_new */
687 PyObject_GC_Del, /* tp_free */
Dong-hee Na9a9c11a2021-03-11 01:39:52 +0900688 .tp_vectorcall = (vectorcallfunc)filter_vectorcall
Raymond Hettinger17301e92008-03-13 00:19:26 +0000689};
690
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000691
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000692/*[clinic input]
693format as builtin_format
694
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300695 value: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000696 format_spec: unicode(c_default="NULL") = ''
697 /
698
699Return value.__format__(format_spec)
700
Amit Kumar2e6bb442017-05-29 06:32:26 +0530701format_spec defaults to the empty string.
702See the Format Specification Mini-Language section of help('FORMATTING') for
703details.
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000704[clinic start generated code]*/
705
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000706static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300707builtin_format_impl(PyObject *module, PyObject *value, PyObject *format_spec)
Amit Kumar2e6bb442017-05-29 06:32:26 +0530708/*[clinic end generated code: output=2f40bdfa4954b077 input=88339c93ea522b33]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000709{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000710 return PyObject_Format(value, format_spec);
Eric Smith8c663262007-08-25 02:26:07 +0000711}
712
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000713/*[clinic input]
714chr as builtin_chr
715
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300716 i: int
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000717 /
718
719Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.
720[clinic start generated code]*/
721
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000722static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300723builtin_chr_impl(PyObject *module, int i)
724/*[clinic end generated code: output=c733afcd200afcb7 input=3f604ef45a70750d]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000725{
726 return PyUnicode_FromOrdinal(i);
727}
Guido van Rossum09095f32000-03-10 23:00:52 +0000728
729
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000730/*[clinic input]
731compile as builtin_compile
732
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300733 source: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000734 filename: object(converter="PyUnicode_FSDecoder")
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300735 mode: str
736 flags: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200737 dont_inherit: bool(accept={int}) = False
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300738 optimize: int = -1
Victor Stinnerefdf6ca2019-06-12 02:52:16 +0200739 *
740 _feature_version as feature_version: int = -1
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000741
742Compile source into a code object that can be executed by exec() or eval().
743
744The source code may represent a Python module, statement or expression.
745The filename will be used for run-time error messages.
746The mode must be 'exec' to compile a module, 'single' to compile a
747single (interactive) statement, or 'eval' to compile an expression.
748The flags argument, if present, controls which future statements influence
749the compilation of the code.
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +0300750The dont_inherit argument, if true, stops the compilation inheriting
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000751the effects of any future statements in effect in the code calling
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +0300752compile; if absent or false these statements do influence the compilation,
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000753in addition to any features explicitly specified.
754[clinic start generated code]*/
755
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000756static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300757builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
758 const char *mode, int flags, int dont_inherit,
Guido van Rossum495da292019-03-07 12:38:08 -0800759 int optimize, int feature_version)
Victor Stinnerefdf6ca2019-06-12 02:52:16 +0200760/*[clinic end generated code: output=b0c09c84f116d3d7 input=40171fb92c1d580d]*/
Guido van Rossum5b722181993-03-30 17:46:03 +0000761{
Martin Panter61d6e4a2015-11-07 02:56:11 +0000762 PyObject *source_copy;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200763 const char *str;
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000764 int compile_mode = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 int is_ast;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800766 int start[] = {Py_file_input, Py_eval_input, Py_single_input, Py_func_type_input};
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000767 PyObject *result;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768
Victor Stinner37d66d72019-06-13 02:16:41 +0200769 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000770 cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8;
Guido van Rossum495da292019-03-07 12:38:08 -0800771 if (feature_version >= 0 && (flags & PyCF_ONLY_AST)) {
772 cf.cf_feature_version = feature_version;
773 }
Tim Peters6cd6a822001-08-17 22:11:27 +0000774
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000775 if (flags &
Batuhan Taşkaya44540572020-04-22 19:09:03 +0300776 ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_COMPILE_MASK))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 {
778 PyErr_SetString(PyExc_ValueError,
779 "compile(): unrecognised flags");
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000780 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 }
782 /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
Tim Peters6cd6a822001-08-17 22:11:27 +0000783
Georg Brandl8334fd92010-12-04 10:26:46 +0000784 if (optimize < -1 || optimize > 2) {
785 PyErr_SetString(PyExc_ValueError,
786 "compile(): invalid optimize value");
787 goto error;
788 }
789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (!dont_inherit) {
791 PyEval_MergeCompilerFlags(&cf);
792 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000793
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000794 if (strcmp(mode, "exec") == 0)
795 compile_mode = 0;
796 else if (strcmp(mode, "eval") == 0)
797 compile_mode = 1;
798 else if (strcmp(mode, "single") == 0)
799 compile_mode = 2;
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800800 else if (strcmp(mode, "func_type") == 0) {
801 if (!(flags & PyCF_ONLY_AST)) {
802 PyErr_SetString(PyExc_ValueError,
803 "compile() mode 'func_type' requires flag PyCF_ONLY_AST");
804 goto error;
805 }
806 compile_mode = 3;
807 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 else {
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800809 const char *msg;
810 if (flags & PyCF_ONLY_AST)
811 msg = "compile() mode must be 'exec', 'eval', 'single' or 'func_type'";
812 else
813 msg = "compile() mode must be 'exec', 'eval' or 'single'";
814 PyErr_SetString(PyExc_ValueError, msg);
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000815 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 }
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000817
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000818 is_ast = PyAST_Check(source);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 if (is_ast == -1)
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000820 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (is_ast) {
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000822 if (flags & PyCF_ONLY_AST) {
823 Py_INCREF(source);
824 result = source;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 }
826 else {
827 PyArena *arena;
828 mod_ty mod;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 arena = PyArena_New();
Stefan Krah07795df2012-08-20 17:19:50 +0200831 if (arena == NULL)
832 goto error;
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000833 mod = PyAST_obj2mod(source, arena, compile_mode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 if (mod == NULL) {
835 PyArena_Free(arena);
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000836 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 }
Victor Stinnereec8e612021-03-18 14:57:49 +0100838 if (!_PyAST_Validate(mod)) {
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500839 PyArena_Free(arena);
840 goto error;
841 }
Victor Stinner14e461d2013-08-26 22:28:21 +0200842 result = (PyObject*)PyAST_CompileObject(mod, filename,
843 &cf, optimize, arena);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyArena_Free(arena);
845 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000846 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 }
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000848
Dino Viehland41540692019-05-28 16:21:17 -0700849 str = _Py_SourceAsString(source, "compile", "string, bytes or AST", &cf, &source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 if (str == NULL)
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000851 goto error;
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000852
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000853 result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
Guido van Rossumc001c092020-04-30 12:12:19 -0700854
Martin Panter61d6e4a2015-11-07 02:56:11 +0000855 Py_XDECREF(source_copy);
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000856 goto finally;
857
858error:
859 result = NULL;
860finally:
Victor Stinner14e461d2013-08-26 22:28:21 +0200861 Py_DECREF(filename);
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000862 return result;
Guido van Rossum5b722181993-03-30 17:46:03 +0000863}
864
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000865/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000867builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 PyObject *arg = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
872 return NULL;
873 return PyObject_Dir(arg);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000874}
875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000876PyDoc_STRVAR(dir_doc,
Tim Peters5d2b77c2001-09-03 05:47:38 +0000877"dir([object]) -> list of strings\n"
878"\n"
Georg Brandle32b4222007-03-10 22:13:27 +0000879"If called without an argument, return the names in the current scope.\n"
880"Else, return an alphabetized list of names comprising (some of) the attributes\n"
881"of the given object, and of attributes reachable from it.\n"
882"If the object supplies a method named __dir__, it will be used; otherwise\n"
883"the default dir() logic is used and returns:\n"
884" for a module object: the module's attributes.\n"
885" for a class object: its attributes, and recursively the attributes\n"
886" of its bases.\n"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000887" for any other object: its attributes, its class's attributes, and\n"
Georg Brandle32b4222007-03-10 22:13:27 +0000888" recursively the attributes of its class's base classes.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000889
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000890/*[clinic input]
891divmod as builtin_divmod
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000892
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300893 x: object
894 y: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000895 /
896
Zachary Ware7f227d92016-04-28 14:39:50 -0500897Return the tuple (x//y, x%y). Invariant: div*y + mod == x.
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000898[clinic start generated code]*/
899
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000900static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300901builtin_divmod_impl(PyObject *module, PyObject *x, PyObject *y)
902/*[clinic end generated code: output=b06d8a5f6e0c745e input=175ad9c84ff41a85]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000903{
904 return PyNumber_Divmod(x, y);
905}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000906
907
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000908/*[clinic input]
909eval as builtin_eval
910
Serhiy Storchaka7e810a62015-05-30 11:09:35 +0300911 source: object
912 globals: object = None
913 locals: object = None
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000914 /
915
916Evaluate the given source in the context of globals and locals.
917
918The source may be a string representing a Python expression
919or a code object as returned by compile().
920The globals must be a dictionary and locals can be any mapping,
921defaulting to the current globals and locals.
922If only globals is given, locals defaults to it.
923[clinic start generated code]*/
924
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000925static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300926builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals,
Larry Hastings89964c42015-04-14 18:07:59 -0400927 PyObject *locals)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300928/*[clinic end generated code: output=0a0824aa70093116 input=11ee718a8640e527]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000929{
Martin Panter61d6e4a2015-11-07 02:56:11 +0000930 PyObject *result, *source_copy;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200931 const char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 if (locals != Py_None && !PyMapping_Check(locals)) {
934 PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
935 return NULL;
936 }
937 if (globals != Py_None && !PyDict_Check(globals)) {
938 PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ?
939 "globals must be a real dict; try eval(expr, {}, mapping)"
940 : "globals must be a dict");
941 return NULL;
942 }
943 if (globals == Py_None) {
944 globals = PyEval_GetGlobals();
Victor Stinner41bb43a2013-10-29 01:19:37 +0100945 if (locals == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 locals = PyEval_GetLocals();
Victor Stinner41bb43a2013-10-29 01:19:37 +0100947 if (locals == NULL)
948 return NULL;
949 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 }
951 else if (locals == Py_None)
952 locals = globals;
Tim Peters9fa96be2001-08-17 23:04:59 +0000953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 if (globals == NULL || locals == NULL) {
955 PyErr_SetString(PyExc_TypeError,
956 "eval must be given globals and locals "
957 "when called without a frame");
958 return NULL;
959 }
Georg Brandl77c85e62005-09-15 10:46:13 +0000960
Serhiy Storchakab510e102020-10-26 12:47:57 +0200961 int r = _PyDict_ContainsId(globals, &PyId___builtins__);
962 if (r == 0) {
963 r = _PyDict_SetItemId(globals, &PyId___builtins__,
964 PyEval_GetBuiltins());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 }
Serhiy Storchakab510e102020-10-26 12:47:57 +0200966 if (r < 0) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200967 return NULL;
968 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000969
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000970 if (PyCode_Check(source)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700971 if (PySys_Audit("exec", "O", source) < 0) {
972 return NULL;
973 }
974
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000975 if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyErr_SetString(PyExc_TypeError,
Steve Dowerb82e17e2019-05-23 08:45:22 -0700977 "code object passed to eval() may not contain free variables");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 return NULL;
979 }
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000980 return PyEval_EvalCode(source, globals, locals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000982
Victor Stinner37d66d72019-06-13 02:16:41 +0200983 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 cf.cf_flags = PyCF_SOURCE_IS_UTF8;
Dino Viehland41540692019-05-28 16:21:17 -0700985 str = _Py_SourceAsString(source, "eval", "string, bytes or code", &cf, &source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 if (str == NULL)
987 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +0000988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 while (*str == ' ' || *str == '\t')
990 str++;
Tim Peters9fa96be2001-08-17 23:04:59 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 (void)PyEval_MergeCompilerFlags(&cf);
993 result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
Martin Panter61d6e4a2015-11-07 02:56:11 +0000994 Py_XDECREF(source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 return result;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996}
997
Nick Coghlanf9e227e2014-08-17 14:01:19 +1000998/*[clinic input]
999exec as builtin_exec
1000
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001001 source: object
1002 globals: object = None
1003 locals: object = None
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001004 /
1005
1006Execute the given source in the context of globals and locals.
1007
1008The source may be a string representing one or more Python statements
1009or a code object as returned by compile().
1010The globals must be a dictionary and locals can be any mapping,
1011defaulting to the current globals and locals.
1012If only globals is given, locals defaults to it.
1013[clinic start generated code]*/
1014
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001015static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001016builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,
Larry Hastings89964c42015-04-14 18:07:59 -04001017 PyObject *locals)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001018/*[clinic end generated code: output=3c90efc6ab68ef5d input=01ca3e1c01692829]*/
Georg Brandl7cae87c2006-09-06 06:51:57 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 PyObject *v;
Georg Brandl2cabc562008-08-28 07:57:16 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 if (globals == Py_None) {
1023 globals = PyEval_GetGlobals();
1024 if (locals == Py_None) {
1025 locals = PyEval_GetLocals();
Victor Stinner41bb43a2013-10-29 01:19:37 +01001026 if (locals == NULL)
1027 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 }
1029 if (!globals || !locals) {
1030 PyErr_SetString(PyExc_SystemError,
1031 "globals and locals cannot be NULL");
1032 return NULL;
1033 }
1034 }
1035 else if (locals == Py_None)
1036 locals = globals;
Georg Brandl7cae87c2006-09-06 06:51:57 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 if (!PyDict_Check(globals)) {
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001039 PyErr_Format(PyExc_TypeError, "exec() globals must be a dict, not %.100s",
Victor Stinnera102ed72020-02-07 02:24:48 +01001040 Py_TYPE(globals)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 return NULL;
1042 }
1043 if (!PyMapping_Check(locals)) {
1044 PyErr_Format(PyExc_TypeError,
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001045 "locals must be a mapping or None, not %.100s",
Victor Stinnera102ed72020-02-07 02:24:48 +01001046 Py_TYPE(locals)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 return NULL;
1048 }
Serhiy Storchakab510e102020-10-26 12:47:57 +02001049 int r = _PyDict_ContainsId(globals, &PyId___builtins__);
1050 if (r == 0) {
1051 r = _PyDict_SetItemId(globals, &PyId___builtins__,
1052 PyEval_GetBuiltins());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 }
Serhiy Storchakab510e102020-10-26 12:47:57 +02001054 if (r < 0) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +02001055 return NULL;
1056 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001058 if (PyCode_Check(source)) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001059 if (PySys_Audit("exec", "O", source) < 0) {
1060 return NULL;
1061 }
1062
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001063 if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 PyErr_SetString(PyExc_TypeError,
1065 "code object passed to exec() may not "
1066 "contain free variables");
1067 return NULL;
1068 }
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001069 v = PyEval_EvalCode(source, globals, locals);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 }
1071 else {
Martin Panter61d6e4a2015-11-07 02:56:11 +00001072 PyObject *source_copy;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001073 const char *str;
Victor Stinner37d66d72019-06-13 02:16:41 +02001074 PyCompilerFlags cf = _PyCompilerFlags_INIT;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 cf.cf_flags = PyCF_SOURCE_IS_UTF8;
Dino Viehland41540692019-05-28 16:21:17 -07001076 str = _Py_SourceAsString(source, "exec",
Martin Panter61d6e4a2015-11-07 02:56:11 +00001077 "string, bytes or code", &cf,
1078 &source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 if (str == NULL)
1080 return NULL;
1081 if (PyEval_MergeCompilerFlags(&cf))
1082 v = PyRun_StringFlags(str, Py_file_input, globals,
1083 locals, &cf);
1084 else
1085 v = PyRun_String(str, Py_file_input, globals, locals);
Martin Panter61d6e4a2015-11-07 02:56:11 +00001086 Py_XDECREF(source_copy);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 }
1088 if (v == NULL)
1089 return NULL;
1090 Py_DECREF(v);
1091 Py_RETURN_NONE;
Georg Brandl7cae87c2006-09-06 06:51:57 +00001092}
1093
Georg Brandl7cae87c2006-09-06 06:51:57 +00001094
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001095/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001097builtin_getattr(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
Guido van Rossum33894be1992-01-27 16:53:09 +00001098{
Serhiy Storchaka79342662019-01-12 08:25:41 +02001099 PyObject *v, *name, *result;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001100
Serhiy Storchaka79342662019-01-12 08:25:41 +02001101 if (!_PyArg_CheckPositional("getattr", nargs, 2, 3))
Sylvain96c7c062017-06-15 17:05:23 +02001102 return NULL;
1103
Serhiy Storchaka79342662019-01-12 08:25:41 +02001104 v = args[0];
1105 name = args[1];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 if (!PyUnicode_Check(name)) {
1107 PyErr_SetString(PyExc_TypeError,
1108 "getattr(): attribute name must be string");
1109 return NULL;
1110 }
Serhiy Storchaka79342662019-01-12 08:25:41 +02001111 if (nargs > 2) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001112 if (_PyObject_LookupAttr(v, name, &result) == 0) {
Serhiy Storchaka79342662019-01-12 08:25:41 +02001113 PyObject *dflt = args[2];
INADA Naoki378edee2018-01-16 20:52:41 +09001114 Py_INCREF(dflt);
1115 return dflt;
1116 }
1117 }
1118 else {
1119 result = PyObject_GetAttr(v, name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 }
1121 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122}
1123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001124PyDoc_STRVAR(getattr_doc,
Guido van Rossum950ff291998-06-29 13:38:57 +00001125"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001126\n\
Guido van Rossum950ff291998-06-29 13:38:57 +00001127Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
1128When a default argument is given, it is returned when the attribute doesn't\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001129exist; without it, an exception is raised in that case.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001130
1131
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001132/*[clinic input]
1133globals as builtin_globals
1134
1135Return the dictionary containing the current scope's global variables.
1136
1137NOTE: Updates to this dictionary *will* affect name lookups in the current
1138global scope and vice-versa.
1139[clinic start generated code]*/
1140
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001141static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001142builtin_globals_impl(PyObject *module)
1143/*[clinic end generated code: output=e5dd1527067b94d2 input=9327576f92bb48ba]*/
Guido van Rossum872537c1995-07-07 22:43:42 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 d = PyEval_GetGlobals();
1148 Py_XINCREF(d);
1149 return d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001150}
1151
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001152
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001153/*[clinic input]
1154hasattr as builtin_hasattr
1155
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001156 obj: object
1157 name: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001158 /
1159
1160Return whether the object has an attribute with the given name.
1161
1162This is done by calling getattr(obj, name) and catching AttributeError.
1163[clinic start generated code]*/
1164
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001165static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001166builtin_hasattr_impl(PyObject *module, PyObject *obj, PyObject *name)
1167/*[clinic end generated code: output=a7aff2090a4151e5 input=0faec9787d979542]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001168{
1169 PyObject *v;
1170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 if (!PyUnicode_Check(name)) {
1172 PyErr_SetString(PyExc_TypeError,
1173 "hasattr(): attribute name must be string");
1174 return NULL;
1175 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001176 if (_PyObject_LookupAttr(obj, name, &v) < 0) {
Benjamin Peterson17689992010-08-24 03:26:23 +00001177 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 }
Serhiy Storchakaf320be72018-01-25 10:49:40 +02001179 if (v == NULL) {
1180 Py_RETURN_FALSE;
1181 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 Py_DECREF(v);
Benjamin Peterson17689992010-08-24 03:26:23 +00001183 Py_RETURN_TRUE;
Guido van Rossum33894be1992-01-27 16:53:09 +00001184}
1185
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001186
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001187/* AC: gdb's integration with CPython relies on builtin_id having
1188 * the *exact* parameter names of "self" and "v", so we ensure we
1189 * preserve those name rather than using the AC defaults.
1190 */
1191/*[clinic input]
1192id as builtin_id
1193
Serhiy Storchaka24182a32016-05-05 16:21:35 +03001194 self: self(type="PyModuleDef *")
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001195 obj as v: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001196 /
1197
1198Return the identity of an object.
1199
1200This is guaranteed to be unique among simultaneously existing objects.
1201(CPython uses the object's memory address.)
1202[clinic start generated code]*/
1203
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204static PyObject *
Serhiy Storchaka24182a32016-05-05 16:21:35 +03001205builtin_id(PyModuleDef *self, PyObject *v)
1206/*[clinic end generated code: output=0aa640785f697f65 input=5a534136419631f4]*/
Guido van Rossum5b722181993-03-30 17:46:03 +00001207{
Steve Dowerb82e17e2019-05-23 08:45:22 -07001208 PyObject *id = PyLong_FromVoidPtr(v);
1209
1210 if (id && PySys_Audit("builtins.id", "O", id) < 0) {
1211 Py_DECREF(id);
1212 return NULL;
1213 }
1214
1215 return id;
Guido van Rossum5b722181993-03-30 17:46:03 +00001216}
1217
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001218
Raymond Hettingera6c60372008-03-13 01:26:19 +00001219/* map object ************************************************************/
1220
1221typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 PyObject_HEAD
1223 PyObject *iters;
1224 PyObject *func;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001225} mapobject;
1226
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227static PyObject *
Raymond Hettingera6c60372008-03-13 01:26:19 +00001228map_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 PyObject *it, *iters, *func;
1231 mapobject *lz;
1232 Py_ssize_t numargs, i;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001233
Serhiy Storchaka6cca5c82017-06-08 14:41:19 +03001234 if (type == &PyMap_Type && !_PyArg_NoKeywords("map", kwds))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return NULL;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 numargs = PyTuple_Size(args);
1238 if (numargs < 2) {
1239 PyErr_SetString(PyExc_TypeError,
1240 "map() must have at least two arguments.");
1241 return NULL;
1242 }
Raymond Hettingera6c60372008-03-13 01:26:19 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 iters = PyTuple_New(numargs-1);
1245 if (iters == NULL)
1246 return NULL;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 for (i=1 ; i<numargs ; i++) {
1249 /* Get iterator. */
1250 it = PyObject_GetIter(PyTuple_GET_ITEM(args, i));
1251 if (it == NULL) {
1252 Py_DECREF(iters);
1253 return NULL;
1254 }
1255 PyTuple_SET_ITEM(iters, i-1, it);
1256 }
Raymond Hettingera6c60372008-03-13 01:26:19 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 /* create mapobject structure */
1259 lz = (mapobject *)type->tp_alloc(type, 0);
1260 if (lz == NULL) {
1261 Py_DECREF(iters);
1262 return NULL;
1263 }
1264 lz->iters = iters;
1265 func = PyTuple_GET_ITEM(args, 0);
Dong-hee Na86883d42021-03-22 19:01:14 +09001266 lz->func = Py_NewRef(func);
1267
1268 return (PyObject *)lz;
1269}
1270
1271static PyObject *
1272map_vectorcall(PyObject *type, PyObject * const*args,
1273 size_t nargsf, PyObject *kwnames)
1274{
1275 PyTypeObject *tp = (PyTypeObject *)type;
1276 if (tp == &PyMap_Type && !_PyArg_NoKwnames("map", kwnames)) {
1277 return NULL;
1278 }
1279
1280 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
1281 if (nargs < 2) {
1282 PyErr_SetString(PyExc_TypeError,
1283 "map() must have at least two arguments.");
1284 return NULL;
1285 }
1286
1287 PyObject *iters = PyTuple_New(nargs-1);
1288 if (iters == NULL) {
1289 return NULL;
1290 }
1291
1292 for (int i=1; i<nargs; i++) {
1293 PyObject *it = PyObject_GetIter(args[i]);
1294 if (it == NULL) {
1295 Py_DECREF(iters);
1296 return NULL;
1297 }
1298 PyTuple_SET_ITEM(iters, i-1, it);
1299 }
1300
1301 mapobject *lz = (mapobject *)tp->tp_alloc(tp, 0);
1302 if (lz == NULL) {
1303 Py_DECREF(iters);
1304 return NULL;
1305 }
1306 lz->iters = iters;
1307 lz->func = Py_NewRef(args[0]);
Raymond Hettingera6c60372008-03-13 01:26:19 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 return (PyObject *)lz;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001310}
1311
1312static void
1313map_dealloc(mapobject *lz)
1314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 PyObject_GC_UnTrack(lz);
1316 Py_XDECREF(lz->iters);
1317 Py_XDECREF(lz->func);
1318 Py_TYPE(lz)->tp_free(lz);
Raymond Hettingera6c60372008-03-13 01:26:19 +00001319}
1320
1321static int
1322map_traverse(mapobject *lz, visitproc visit, void *arg)
1323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 Py_VISIT(lz->iters);
1325 Py_VISIT(lz->func);
1326 return 0;
Raymond Hettingera6c60372008-03-13 01:26:19 +00001327}
1328
1329static PyObject *
1330map_next(mapobject *lz)
1331{
Victor Stinnerbc08ab42016-12-15 12:40:53 +01001332 PyObject *small_stack[_PY_FASTCALL_SMALL_STACK];
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001333 PyObject **stack;
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001334 PyObject *result = NULL;
Victor Stinner4d231bc2019-11-14 13:36:21 +01001335 PyThreadState *tstate = _PyThreadState_GET();
Raymond Hettingera6c60372008-03-13 01:26:19 +00001336
Victor Stinner4d231bc2019-11-14 13:36:21 +01001337 const Py_ssize_t niters = PyTuple_GET_SIZE(lz->iters);
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001338 if (niters <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
1339 stack = small_stack;
1340 }
1341 else {
1342 stack = PyMem_Malloc(niters * sizeof(stack[0]));
1343 if (stack == NULL) {
Victor Stinner4d231bc2019-11-14 13:36:21 +01001344 _PyErr_NoMemory(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 return NULL;
1346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 }
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001348
Victor Stinner4d231bc2019-11-14 13:36:21 +01001349 Py_ssize_t nargs = 0;
1350 for (Py_ssize_t i=0; i < niters; i++) {
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001351 PyObject *it = PyTuple_GET_ITEM(lz->iters, i);
1352 PyObject *val = Py_TYPE(it)->tp_iternext(it);
1353 if (val == NULL) {
1354 goto exit;
1355 }
1356 stack[i] = val;
1357 nargs++;
1358 }
1359
Victor Stinner4d231bc2019-11-14 13:36:21 +01001360 result = _PyObject_VectorcallTstate(tstate, lz->func, stack, nargs, NULL);
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001361
1362exit:
Victor Stinner4d231bc2019-11-14 13:36:21 +01001363 for (Py_ssize_t i=0; i < nargs; i++) {
Victor Stinnercdb5cee2016-08-24 01:45:13 +02001364 Py_DECREF(stack[i]);
1365 }
1366 if (stack != small_stack) {
1367 PyMem_Free(stack);
1368 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001370}
1371
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001372static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301373map_reduce(mapobject *lz, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001374{
1375 Py_ssize_t numargs = PyTuple_GET_SIZE(lz->iters);
1376 PyObject *args = PyTuple_New(numargs+1);
1377 Py_ssize_t i;
1378 if (args == NULL)
1379 return NULL;
1380 Py_INCREF(lz->func);
1381 PyTuple_SET_ITEM(args, 0, lz->func);
1382 for (i = 0; i<numargs; i++){
1383 PyObject *it = PyTuple_GET_ITEM(lz->iters, i);
1384 Py_INCREF(it);
1385 PyTuple_SET_ITEM(args, i+1, it);
1386 }
1387
1388 return Py_BuildValue("ON", Py_TYPE(lz), args);
1389}
1390
1391static PyMethodDef map_methods[] = {
1392 {"__reduce__", (PyCFunction)map_reduce, METH_NOARGS, reduce_doc},
1393 {NULL, NULL} /* sentinel */
1394};
1395
1396
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001397PyDoc_STRVAR(map_doc,
Raymond Hettingera6c60372008-03-13 01:26:19 +00001398"map(func, *iterables) --> map object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001399\n\
Raymond Hettingera6c60372008-03-13 01:26:19 +00001400Make an iterator that computes the function using arguments from\n\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401each of the iterables. Stops when the shortest iterable is exhausted.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001402
Raymond Hettingera6c60372008-03-13 01:26:19 +00001403PyTypeObject PyMap_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1405 "map", /* tp_name */
1406 sizeof(mapobject), /* tp_basicsize */
1407 0, /* tp_itemsize */
1408 /* methods */
1409 (destructor)map_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001410 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 0, /* tp_getattr */
1412 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001413 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 0, /* tp_repr */
1415 0, /* tp_as_number */
1416 0, /* tp_as_sequence */
1417 0, /* tp_as_mapping */
1418 0, /* tp_hash */
1419 0, /* tp_call */
1420 0, /* tp_str */
1421 PyObject_GenericGetAttr, /* tp_getattro */
1422 0, /* tp_setattro */
1423 0, /* tp_as_buffer */
1424 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1425 Py_TPFLAGS_BASETYPE, /* tp_flags */
1426 map_doc, /* tp_doc */
1427 (traverseproc)map_traverse, /* tp_traverse */
1428 0, /* tp_clear */
1429 0, /* tp_richcompare */
1430 0, /* tp_weaklistoffset */
1431 PyObject_SelfIter, /* tp_iter */
1432 (iternextfunc)map_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001433 map_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 0, /* tp_members */
1435 0, /* tp_getset */
1436 0, /* tp_base */
1437 0, /* tp_dict */
1438 0, /* tp_descr_get */
1439 0, /* tp_descr_set */
1440 0, /* tp_dictoffset */
1441 0, /* tp_init */
1442 PyType_GenericAlloc, /* tp_alloc */
1443 map_new, /* tp_new */
1444 PyObject_GC_Del, /* tp_free */
Dong-hee Na86883d42021-03-22 19:01:14 +09001445 .tp_vectorcall = (vectorcallfunc)map_vectorcall
Raymond Hettingera6c60372008-03-13 01:26:19 +00001446};
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001447
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001448
1449/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001451builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
Georg Brandla18af4e2007-04-21 15:47:16 +00001452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyObject *it, *res;
Georg Brandla18af4e2007-04-21 15:47:16 +00001454
Serhiy Storchaka79342662019-01-12 08:25:41 +02001455 if (!_PyArg_CheckPositional("next", nargs, 1, 2))
Sylvain96c7c062017-06-15 17:05:23 +02001456 return NULL;
1457
Serhiy Storchaka79342662019-01-12 08:25:41 +02001458 it = args[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 if (!PyIter_Check(it)) {
1460 PyErr_Format(PyExc_TypeError,
Philip Jenvey50add042011-11-06 16:37:52 -08001461 "'%.200s' object is not an iterator",
Victor Stinnera102ed72020-02-07 02:24:48 +01001462 Py_TYPE(it)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 return NULL;
1464 }
1465
Victor Stinnera102ed72020-02-07 02:24:48 +01001466 res = (*Py_TYPE(it)->tp_iternext)(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 if (res != NULL) {
1468 return res;
Serhiy Storchaka79342662019-01-12 08:25:41 +02001469 } else if (nargs > 1) {
1470 PyObject *def = args[1];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 if (PyErr_Occurred()) {
1472 if(!PyErr_ExceptionMatches(PyExc_StopIteration))
1473 return NULL;
1474 PyErr_Clear();
1475 }
1476 Py_INCREF(def);
1477 return def;
1478 } else if (PyErr_Occurred()) {
1479 return NULL;
1480 } else {
1481 PyErr_SetNone(PyExc_StopIteration);
1482 return NULL;
1483 }
Georg Brandla18af4e2007-04-21 15:47:16 +00001484}
1485
1486PyDoc_STRVAR(next_doc,
1487"next(iterator[, default])\n\
1488\n\
1489Return the next item from the iterator. If default is given and the iterator\n\
1490is exhausted, it is returned instead of raising StopIteration.");
1491
1492
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001493/*[clinic input]
1494setattr as builtin_setattr
1495
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001496 obj: object
1497 name: object
1498 value: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001499 /
1500
1501Sets the named attribute on the given object to the specified value.
1502
1503setattr(x, 'y', v) is equivalent to ``x.y = v''
1504[clinic start generated code]*/
1505
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001506static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001507builtin_setattr_impl(PyObject *module, PyObject *obj, PyObject *name,
Larry Hastings89964c42015-04-14 18:07:59 -04001508 PyObject *value)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001509/*[clinic end generated code: output=dc2ce1d1add9acb4 input=bd2b7ca6875a1899]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001510{
1511 if (PyObject_SetAttr(obj, name, value) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001513 Py_RETURN_NONE;
Guido van Rossum33894be1992-01-27 16:53:09 +00001514}
1515
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001516
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001517/*[clinic input]
1518delattr as builtin_delattr
1519
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001520 obj: object
1521 name: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001522 /
1523
1524Deletes the named attribute from the given object.
1525
1526delattr(x, 'y') is equivalent to ``del x.y''
1527[clinic start generated code]*/
1528
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001529static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001530builtin_delattr_impl(PyObject *module, PyObject *obj, PyObject *name)
1531/*[clinic end generated code: output=85134bc58dff79fa input=db16685d6b4b9410]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001532{
1533 if (PyObject_SetAttr(obj, name, (PyObject *)NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001535 Py_RETURN_NONE;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001536}
1537
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001538
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001539/*[clinic input]
1540hash as builtin_hash
1541
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001542 obj: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001543 /
1544
1545Return the hash value for the given object.
1546
1547Two objects that compare equal must also have the same hash value, but the
1548reverse is not necessarily true.
1549[clinic start generated code]*/
1550
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001552builtin_hash(PyObject *module, PyObject *obj)
1553/*[clinic end generated code: output=237668e9d7688db7 input=58c48be822bf9c54]*/
Guido van Rossum9bfef441993-03-29 10:43:31 +00001554{
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001555 Py_hash_t x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001556
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001557 x = PyObject_Hash(obj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 if (x == -1)
1559 return NULL;
Benjamin Peterson8f67d082010-10-17 20:54:53 +00001560 return PyLong_FromSsize_t(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001561}
1562
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001563
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001564/*[clinic input]
1565hex as builtin_hex
1566
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001567 number: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001568 /
1569
1570Return the hexadecimal representation of an integer.
1571
1572 >>> hex(12648430)
1573 '0xc0ffee'
1574[clinic start generated code]*/
1575
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001577builtin_hex(PyObject *module, PyObject *number)
1578/*[clinic end generated code: output=e46b612169099408 input=e645aff5fc7d540e]*/
Guido van Rossum006bcd41991-10-24 14:54:44 +00001579{
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001580 return PyNumber_ToBase(number, 16);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001581}
1582
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001583
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001584/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585static PyObject *
Serhiy Storchaka79342662019-01-12 08:25:41 +02001586builtin_iter(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001587{
Serhiy Storchaka79342662019-01-12 08:25:41 +02001588 PyObject *v;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001589
Serhiy Storchaka79342662019-01-12 08:25:41 +02001590 if (!_PyArg_CheckPositional("iter", nargs, 1, 2))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 return NULL;
Serhiy Storchaka79342662019-01-12 08:25:41 +02001592 v = args[0];
1593 if (nargs == 1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 return PyObject_GetIter(v);
1595 if (!PyCallable_Check(v)) {
1596 PyErr_SetString(PyExc_TypeError,
1597 "iter(v, w): v must be callable");
1598 return NULL;
1599 }
Serhiy Storchaka79342662019-01-12 08:25:41 +02001600 PyObject *sentinel = args[1];
1601 return PyCallIter_New(v, sentinel);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001602}
1603
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001604PyDoc_STRVAR(iter_doc,
Georg Brandld11ae5d2008-05-16 13:27:32 +00001605"iter(iterable) -> iterator\n\
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001606iter(callable, sentinel) -> iterator\n\
1607\n\
1608Get an iterator from an object. In the first form, the argument must\n\
1609supply its own iterator, or be a sequence.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001610In the second form, the callable is called until it returns the sentinel.");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001611
1612
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001613/*[clinic input]
1614len as builtin_len
1615
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001616 obj: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001617 /
1618
1619Return the number of items in a container.
1620[clinic start generated code]*/
1621
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001622static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001623builtin_len(PyObject *module, PyObject *obj)
1624/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 Py_ssize_t res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001628 res = PyObject_Size(obj);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001629 if (res < 0) {
1630 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 return NULL;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001632 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 return PyLong_FromSsize_t(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634}
1635
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001636
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001637/*[clinic input]
1638locals as builtin_locals
1639
1640Return a dictionary containing the current scope's local variables.
1641
1642NOTE: Whether or not updates to this dictionary will affect name lookups in
1643the local scope and vice-versa is *implementation dependent* and not
1644covered by any backwards compatibility guarantees.
1645[clinic start generated code]*/
1646
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001647static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001648builtin_locals_impl(PyObject *module)
1649/*[clinic end generated code: output=b46c94015ce11448 input=7874018d478d5c4b]*/
Guido van Rossum872537c1995-07-07 22:43:42 +00001650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 d = PyEval_GetLocals();
1654 Py_XINCREF(d);
1655 return d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001656}
1657
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001658
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659static PyObject *
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001660min_max(PyObject *args, PyObject *kwds, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 PyObject *v, *it, *item, *val, *maxitem, *maxval, *keyfunc=NULL;
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001663 PyObject *emptytuple, *defaultval = NULL;
1664 static char *kwlist[] = {"key", "default", NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 const char *name = op == Py_LT ? "min" : "max";
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001666 const int positional = PyTuple_Size(args) > 1;
1667 int ret;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001668
Dong-hee Naabdc6342020-01-11 01:31:43 +09001669 if (positional) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 v = args;
Dong-hee Naabdc6342020-01-11 01:31:43 +09001671 }
1672 else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) {
1673 if (PyExceptionClass_Check(PyExc_TypeError)) {
1674 PyErr_Format(PyExc_TypeError, "%s expected at least 1 argument, got 0", name);
1675 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 return NULL;
Dong-hee Naabdc6342020-01-11 01:31:43 +09001677 }
Tim Peters67d687a2002-04-29 21:27:32 +00001678
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001679 emptytuple = PyTuple_New(0);
1680 if (emptytuple == NULL)
1681 return NULL;
Oren Milman58cf7482017-08-21 20:19:07 +03001682 ret = PyArg_ParseTupleAndKeywords(emptytuple, kwds,
1683 (op == Py_LT) ? "|$OO:min" : "|$OO:max",
1684 kwlist, &keyfunc, &defaultval);
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001685 Py_DECREF(emptytuple);
1686 if (!ret)
1687 return NULL;
1688
1689 if (positional && defaultval != NULL) {
1690 PyErr_Format(PyExc_TypeError,
1691 "Cannot specify a default for %s() with multiple "
1692 "positional arguments", name);
1693 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 }
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 it = PyObject_GetIter(v);
1697 if (it == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 return NULL;
1699 }
Tim Petersc3074532001-05-03 07:00:32 +00001700
Alexander Marshalove22072f2018-07-24 10:58:21 +07001701 if (keyfunc == Py_None) {
1702 keyfunc = NULL;
1703 }
1704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 maxitem = NULL; /* the result */
1706 maxval = NULL; /* the value associated with the result */
1707 while (( item = PyIter_Next(it) )) {
1708 /* get the value from the key function */
1709 if (keyfunc != NULL) {
Petr Viktorinffd97532020-02-11 17:46:57 +01001710 val = PyObject_CallOneArg(keyfunc, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (val == NULL)
1712 goto Fail_it_item;
1713 }
1714 /* no key function; the value is the item */
1715 else {
1716 val = item;
1717 Py_INCREF(val);
1718 }
Tim Petersc3074532001-05-03 07:00:32 +00001719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 /* maximum value and item are unset; set them */
1721 if (maxval == NULL) {
1722 maxitem = item;
1723 maxval = val;
1724 }
1725 /* maximum value and item are set; update them as necessary */
1726 else {
1727 int cmp = PyObject_RichCompareBool(val, maxval, op);
1728 if (cmp < 0)
1729 goto Fail_it_item_and_val;
1730 else if (cmp > 0) {
1731 Py_DECREF(maxval);
1732 Py_DECREF(maxitem);
1733 maxval = val;
1734 maxitem = item;
1735 }
1736 else {
1737 Py_DECREF(item);
1738 Py_DECREF(val);
1739 }
1740 }
1741 }
1742 if (PyErr_Occurred())
1743 goto Fail_it;
1744 if (maxval == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 assert(maxitem == NULL);
Raymond Hettinger4d6018f2013-06-24 22:43:02 -07001746 if (defaultval != NULL) {
1747 Py_INCREF(defaultval);
1748 maxitem = defaultval;
1749 } else {
1750 PyErr_Format(PyExc_ValueError,
1751 "%s() arg is an empty sequence", name);
1752 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 }
1754 else
1755 Py_DECREF(maxval);
1756 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 return maxitem;
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001758
1759Fail_it_item_and_val:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 Py_DECREF(val);
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001761Fail_it_item:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 Py_DECREF(item);
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001763Fail_it:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 Py_XDECREF(maxval);
1765 Py_XDECREF(maxitem);
1766 Py_DECREF(it);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001768}
1769
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001770/* AC: cannot convert yet, waiting for *args support */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771static PyObject *
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001772builtin_min(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 return min_max(args, kwds, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775}
1776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001777PyDoc_STRVAR(min_doc,
Raymond Hettinger2a545822014-05-19 22:20:52 +01001778"min(iterable, *[, default=obj, key=func]) -> value\n\
1779min(arg1, arg2, *args, *[, key=func]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001780\n\
Raymond Hettinger2a545822014-05-19 22:20:52 +01001781With a single iterable argument, return its smallest item. The\n\
1782default keyword-only argument specifies an object to return if\n\
1783the provided iterable is empty.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001784With two or more arguments, return the smallest argument.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001785
1786
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001787/* AC: cannot convert yet, waiting for *args support */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788static PyObject *
Raymond Hettinger3b0c7c22004-12-03 08:30:39 +00001789builtin_max(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return min_max(args, kwds, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001792}
1793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001794PyDoc_STRVAR(max_doc,
Raymond Hettinger2a545822014-05-19 22:20:52 +01001795"max(iterable, *[, default=obj, key=func]) -> value\n\
1796max(arg1, arg2, *args, *[, key=func]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001797\n\
Raymond Hettinger2a545822014-05-19 22:20:52 +01001798With a single iterable argument, return its biggest item. The\n\
1799default keyword-only argument specifies an object to return if\n\
1800the provided iterable is empty.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001801With two or more arguments, return the largest argument.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001802
1803
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001804/*[clinic input]
1805oct as builtin_oct
1806
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001807 number: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001808 /
1809
1810Return the octal representation of an integer.
1811
1812 >>> oct(342391)
1813 '0o1234567'
1814[clinic start generated code]*/
1815
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001817builtin_oct(PyObject *module, PyObject *number)
1818/*[clinic end generated code: output=40a34656b6875352 input=ad6b274af4016c72]*/
Guido van Rossum006bcd41991-10-24 14:54:44 +00001819{
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001820 return PyNumber_ToBase(number, 8);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001821}
1822
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001823
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001824/*[clinic input]
1825ord as builtin_ord
1826
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03001827 c: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001828 /
1829
1830Return the Unicode code point for a one-character string.
1831[clinic start generated code]*/
1832
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001834builtin_ord(PyObject *module, PyObject *c)
1835/*[clinic end generated code: output=4fa5e87a323bae71 input=3064e5d6203ad012]*/
Guido van Rossum3f5da241990-12-20 15:06:42 +00001836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 long ord;
1838 Py_ssize_t size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001839
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001840 if (PyBytes_Check(c)) {
1841 size = PyBytes_GET_SIZE(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 if (size == 1) {
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001843 ord = (long)((unsigned char)*PyBytes_AS_STRING(c));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return PyLong_FromLong(ord);
1845 }
1846 }
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001847 else if (PyUnicode_Check(c)) {
1848 if (PyUnicode_READY(c) == -1)
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001849 return NULL;
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001850 size = PyUnicode_GET_LENGTH(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 if (size == 1) {
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001852 ord = (long)PyUnicode_READ_CHAR(c, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 return PyLong_FromLong(ord);
1854 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 }
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001856 else if (PyByteArray_Check(c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 /* XXX Hopefully this is temporary */
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001858 size = PyByteArray_GET_SIZE(c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 if (size == 1) {
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001860 ord = (long)((unsigned char)*PyByteArray_AS_STRING(c));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 return PyLong_FromLong(ord);
1862 }
1863 }
1864 else {
1865 PyErr_Format(PyExc_TypeError,
1866 "ord() expected string of length 1, but " \
Victor Stinnera102ed72020-02-07 02:24:48 +01001867 "%.200s found", Py_TYPE(c)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return NULL;
1869 }
Guido van Rossum09095f32000-03-10 23:00:52 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 PyErr_Format(PyExc_TypeError,
1872 "ord() expected a character, "
1873 "but string of length %zd found",
1874 size);
1875 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876}
1877
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001878
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001879/*[clinic input]
1880pow as builtin_pow
1881
Ammar Askar87d6cd32019-09-21 00:28:49 -04001882 base: object
1883 exp: object
1884 mod: object = None
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001885
Raymond Hettingerb104ecb2019-09-21 12:57:44 -07001886Equivalent to base**exp with 2 arguments or base**exp % mod with 3 arguments
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001887
1888Some types, such as ints, are able to use a more efficient algorithm when
1889invoked using the three argument form.
1890[clinic start generated code]*/
1891
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001892static PyObject *
Ammar Askar87d6cd32019-09-21 00:28:49 -04001893builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp,
1894 PyObject *mod)
Raymond Hettingerb104ecb2019-09-21 12:57:44 -07001895/*[clinic end generated code: output=3ca1538221bbf15f input=435dbd48a12efb23]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001896{
Ammar Askar87d6cd32019-09-21 00:28:49 -04001897 return PyNumber_Power(base, exp, mod);
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001898}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001899
1900
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001901/* AC: cannot convert yet, waiting for *args support */
Guido van Rossum34343512006-11-30 22:13:52 +00001902static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02001903builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Guido van Rossum34343512006-11-30 22:13:52 +00001904{
INADA Naokibd584f12017-01-19 12:50:34 +01001905 static const char * const _keywords[] = {"sep", "end", "file", "flush", 0};
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001906 static struct _PyArg_Parser _parser = {"|OOOp:print", _keywords, 0};
1907 PyObject *sep = NULL, *end = NULL, *file = NULL;
1908 int flush = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 int i, err;
Guido van Rossum34343512006-11-30 22:13:52 +00001910
INADA Naokibd584f12017-01-19 12:50:34 +01001911 if (kwnames != NULL &&
1912 !_PyArg_ParseStackAndKeywords(args + nargs, 0, kwnames, &_parser,
1913 &sep, &end, &file, &flush)) {
Georg Brandlbc3b6822012-01-13 19:41:25 +01001914 return NULL;
INADA Naokibd584f12017-01-19 12:50:34 +01001915 }
1916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 if (file == NULL || file == Py_None) {
Victor Stinnerbd303c12013-11-07 23:07:29 +01001918 file = _PySys_GetObjectId(&PyId_stdout);
Victor Stinner1e53bba2013-07-16 22:26:05 +02001919 if (file == NULL) {
1920 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
1921 return NULL;
1922 }
1923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 /* sys.stdout may be None when FILE* stdout isn't connected */
1925 if (file == Py_None)
1926 Py_RETURN_NONE;
1927 }
Guido van Rossum34343512006-11-30 22:13:52 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 if (sep == Py_None) {
1930 sep = NULL;
1931 }
1932 else if (sep && !PyUnicode_Check(sep)) {
1933 PyErr_Format(PyExc_TypeError,
1934 "sep must be None or a string, not %.200s",
Victor Stinnera102ed72020-02-07 02:24:48 +01001935 Py_TYPE(sep)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 return NULL;
1937 }
1938 if (end == Py_None) {
1939 end = NULL;
1940 }
1941 else if (end && !PyUnicode_Check(end)) {
1942 PyErr_Format(PyExc_TypeError,
1943 "end must be None or a string, not %.200s",
Victor Stinnera102ed72020-02-07 02:24:48 +01001944 Py_TYPE(end)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 return NULL;
1946 }
Guido van Rossum34343512006-11-30 22:13:52 +00001947
INADA Naokibd584f12017-01-19 12:50:34 +01001948 for (i = 0; i < nargs; i++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 if (i > 0) {
1950 if (sep == NULL)
1951 err = PyFile_WriteString(" ", file);
1952 else
1953 err = PyFile_WriteObject(sep, file,
1954 Py_PRINT_RAW);
1955 if (err)
1956 return NULL;
1957 }
INADA Naokibd584f12017-01-19 12:50:34 +01001958 err = PyFile_WriteObject(args[i], file, Py_PRINT_RAW);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 if (err)
1960 return NULL;
1961 }
Guido van Rossum34343512006-11-30 22:13:52 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 if (end == NULL)
1964 err = PyFile_WriteString("\n", file);
1965 else
1966 err = PyFile_WriteObject(end, file, Py_PRINT_RAW);
1967 if (err)
1968 return NULL;
Guido van Rossum34343512006-11-30 22:13:52 +00001969
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001970 if (flush) {
1971 PyObject *tmp = _PyObject_CallMethodIdNoArgs(file, &PyId_flush);
1972 if (tmp == NULL)
Georg Brandlbc3b6822012-01-13 19:41:25 +01001973 return NULL;
Serhiy Storchaka1f21eaa2019-09-01 12:16:51 +03001974 Py_DECREF(tmp);
Georg Brandlbc3b6822012-01-13 19:41:25 +01001975 }
1976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 Py_RETURN_NONE;
Guido van Rossum34343512006-11-30 22:13:52 +00001978}
1979
1980PyDoc_STRVAR(print_doc,
Senthil Kumarane9175bd2012-08-10 13:53:45 -07001981"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\
Guido van Rossum34343512006-11-30 22:13:52 +00001982\n\
1983Prints the values to a stream, or to sys.stdout by default.\n\
1984Optional keyword arguments:\n\
Senthil Kumarane9175bd2012-08-10 13:53:45 -07001985file: a file-like object (stream); defaults to the current sys.stdout.\n\
1986sep: string inserted between values, default a space.\n\
1987end: string appended after the last value, default a newline.\n\
1988flush: whether to forcibly flush the stream.");
Guido van Rossum34343512006-11-30 22:13:52 +00001989
1990
Nick Coghlanf9e227e2014-08-17 14:01:19 +10001991/*[clinic input]
1992input as builtin_input
1993
1994 prompt: object(c_default="NULL") = None
1995 /
1996
1997Read a string from standard input. The trailing newline is stripped.
1998
1999The prompt string, if given, is printed to standard output without a
2000trailing newline before reading input.
2001
2002If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
2003On *nix systems, readline is used if available.
2004[clinic start generated code]*/
2005
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002006static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002007builtin_input_impl(PyObject *module, PyObject *prompt)
2008/*[clinic end generated code: output=83db5a191e7a0d60 input=5e8bb70c2908fe3c]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002009{
Victor Stinnerbd303c12013-11-07 23:07:29 +01002010 PyObject *fin = _PySys_GetObjectId(&PyId_stdin);
2011 PyObject *fout = _PySys_GetObjectId(&PyId_stdout);
2012 PyObject *ferr = _PySys_GetObjectId(&PyId_stderr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 PyObject *tmp;
2014 long fd;
2015 int tty;
Guido van Rossuma88a0332007-02-26 16:59:55 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 /* Check that stdin/out/err are intact */
2018 if (fin == NULL || fin == Py_None) {
2019 PyErr_SetString(PyExc_RuntimeError,
2020 "input(): lost sys.stdin");
2021 return NULL;
2022 }
2023 if (fout == NULL || fout == Py_None) {
2024 PyErr_SetString(PyExc_RuntimeError,
2025 "input(): lost sys.stdout");
2026 return NULL;
2027 }
2028 if (ferr == NULL || ferr == Py_None) {
2029 PyErr_SetString(PyExc_RuntimeError,
2030 "input(): lost sys.stderr");
2031 return NULL;
2032 }
Guido van Rossumeba76962007-05-27 09:13:28 +00002033
Steve Dowerb82e17e2019-05-23 08:45:22 -07002034 if (PySys_Audit("builtins.input", "O", prompt ? prompt : Py_None) < 0) {
2035 return NULL;
2036 }
2037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 /* First of all, flush stderr */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002039 tmp = _PyObject_CallMethodIdNoArgs(ferr, &PyId_flush);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 if (tmp == NULL)
2041 PyErr_Clear();
2042 else
2043 Py_DECREF(tmp);
Guido van Rossumeba76962007-05-27 09:13:28 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 /* We should only use (GNU) readline if Python's sys.stdin and
2046 sys.stdout are the same as C's stdin and stdout, because we
2047 need to pass it those. */
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002048 tmp = _PyObject_CallMethodIdNoArgs(fin, &PyId_fileno);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 if (tmp == NULL) {
2050 PyErr_Clear();
2051 tty = 0;
2052 }
2053 else {
2054 fd = PyLong_AsLong(tmp);
2055 Py_DECREF(tmp);
2056 if (fd < 0 && PyErr_Occurred())
2057 return NULL;
2058 tty = fd == fileno(stdin) && isatty(fd);
2059 }
2060 if (tty) {
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002061 tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_fileno);
Martin Panterc9a6ab52015-10-10 01:25:38 +00002062 if (tmp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 PyErr_Clear();
Martin Panterc9a6ab52015-10-10 01:25:38 +00002064 tty = 0;
2065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 else {
2067 fd = PyLong_AsLong(tmp);
2068 Py_DECREF(tmp);
2069 if (fd < 0 && PyErr_Occurred())
2070 return NULL;
2071 tty = fd == fileno(stdout) && isatty(fd);
2072 }
2073 }
Guido van Rossumeba76962007-05-27 09:13:28 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 /* If we're interactive, use (GNU) readline */
2076 if (tty) {
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002077 PyObject *po = NULL;
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02002078 const char *promptstr;
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002079 char *s = NULL;
2080 PyObject *stdin_encoding = NULL, *stdin_errors = NULL;
2081 PyObject *stdout_encoding = NULL, *stdout_errors = NULL;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002082 const char *stdin_encoding_str, *stdin_errors_str;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 PyObject *result;
Victor Stinnerc0f1a1a2011-02-23 12:07:37 +00002084 size_t len;
Martin v. Löwis4a7b5d52007-09-04 05:24:49 +00002085
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002086 /* stdin is a text stream, so it must have an encoding. */
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002087 stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding);
Antoine Pitrou5ee9d8a2011-11-06 00:38:45 +01002088 stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors);
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002089 if (!stdin_encoding || !stdin_errors ||
2090 !PyUnicode_Check(stdin_encoding) ||
2091 !PyUnicode_Check(stdin_errors)) {
2092 tty = 0;
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002093 goto _readline_errors;
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002094 }
Serhiy Storchaka06515832016-11-20 09:13:07 +02002095 stdin_encoding_str = PyUnicode_AsUTF8(stdin_encoding);
2096 stdin_errors_str = PyUnicode_AsUTF8(stdin_errors);
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002097 if (!stdin_encoding_str || !stdin_errors_str)
2098 goto _readline_errors;
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002099 tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 if (tmp == NULL)
2101 PyErr_Clear();
2102 else
2103 Py_DECREF(tmp);
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002104 if (prompt != NULL) {
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002105 /* We have a prompt, encode it as stdout would */
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02002106 const char *stdout_encoding_str, *stdout_errors_str;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 PyObject *stringpo;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002108 stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding);
Antoine Pitrou5ee9d8a2011-11-06 00:38:45 +01002109 stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors);
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002110 if (!stdout_encoding || !stdout_errors ||
2111 !PyUnicode_Check(stdout_encoding) ||
2112 !PyUnicode_Check(stdout_errors)) {
2113 tty = 0;
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002114 goto _readline_errors;
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002115 }
Serhiy Storchaka06515832016-11-20 09:13:07 +02002116 stdout_encoding_str = PyUnicode_AsUTF8(stdout_encoding);
2117 stdout_errors_str = PyUnicode_AsUTF8(stdout_errors);
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002118 if (!stdout_encoding_str || !stdout_errors_str)
2119 goto _readline_errors;
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002120 stringpo = PyObject_Str(prompt);
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002121 if (stringpo == NULL)
2122 goto _readline_errors;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 po = PyUnicode_AsEncodedString(stringpo,
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002124 stdout_encoding_str, stdout_errors_str);
2125 Py_CLEAR(stdout_encoding);
2126 Py_CLEAR(stdout_errors);
2127 Py_CLEAR(stringpo);
2128 if (po == NULL)
2129 goto _readline_errors;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03002130 assert(PyBytes_Check(po));
2131 promptstr = PyBytes_AS_STRING(po);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 }
2133 else {
2134 po = NULL;
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002135 promptstr = "";
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 }
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002137 s = PyOS_Readline(stdin, stdout, promptstr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 if (s == NULL) {
Richard Oudkerk614c5782013-04-03 13:44:50 +01002139 PyErr_CheckSignals();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 if (!PyErr_Occurred())
2141 PyErr_SetNone(PyExc_KeyboardInterrupt);
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002142 goto _readline_errors;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 }
Victor Stinnerc0f1a1a2011-02-23 12:07:37 +00002144
2145 len = strlen(s);
2146 if (len == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 PyErr_SetNone(PyExc_EOFError);
2148 result = NULL;
2149 }
Victor Stinnerc0f1a1a2011-02-23 12:07:37 +00002150 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 if (len > PY_SSIZE_T_MAX) {
2152 PyErr_SetString(PyExc_OverflowError,
2153 "input: input too long");
2154 result = NULL;
2155 }
2156 else {
Victor Stinnerc0f1a1a2011-02-23 12:07:37 +00002157 len--; /* strip trailing '\n' */
2158 if (len != 0 && s[len-1] == '\r')
2159 len--; /* strip trailing '\r' */
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002160 result = PyUnicode_Decode(s, len, stdin_encoding_str,
2161 stdin_errors_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002162 }
2163 }
2164 Py_DECREF(stdin_encoding);
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002165 Py_DECREF(stdin_errors);
2166 Py_XDECREF(po);
Victor Stinner00d7abd2020-12-01 09:56:42 +01002167 PyMem_Free(s);
Steve Dowerb82e17e2019-05-23 08:45:22 -07002168
2169 if (result != NULL) {
2170 if (PySys_Audit("builtins.input/result", "O", result) < 0) {
2171 return NULL;
2172 }
2173 }
2174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 return result;
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002176
Antoine Pitrou0d776b12011-11-06 00:34:26 +01002177 _readline_errors:
2178 Py_XDECREF(stdin_encoding);
2179 Py_XDECREF(stdout_encoding);
2180 Py_XDECREF(stdin_errors);
2181 Py_XDECREF(stdout_errors);
2182 Py_XDECREF(po);
Serhiy Storchakac2cf1282017-03-12 13:50:36 +02002183 if (tty)
2184 return NULL;
2185
2186 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 }
Guido van Rossumeba76962007-05-27 09:13:28 +00002188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 /* Fallback if we're not interactive */
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002190 if (prompt != NULL) {
2191 if (PyFile_WriteObject(prompt, fout, Py_PRINT_RAW) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 return NULL;
2193 }
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002194 tmp = _PyObject_CallMethodIdNoArgs(fout, &PyId_flush);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 if (tmp == NULL)
2196 PyErr_Clear();
2197 else
2198 Py_DECREF(tmp);
2199 return PyFile_GetLine(fin, -1);
Guido van Rossuma88a0332007-02-26 16:59:55 +00002200}
2201
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002202
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002203/*[clinic input]
2204repr as builtin_repr
2205
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03002206 obj: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002207 /
2208
2209Return the canonical string representation of the object.
2210
2211For many object types, including most builtins, eval(repr(obj)) == obj.
2212[clinic start generated code]*/
2213
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002215builtin_repr(PyObject *module, PyObject *obj)
2216/*[clinic end generated code: output=7ed3778c44fd0194 input=1c9e6d66d3e3be04]*/
Guido van Rossumc89705d1992-11-26 08:54:07 +00002217{
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002218 return PyObject_Repr(obj);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002219}
2220
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002221
Serhiy Storchakaaca7f572017-11-15 17:51:14 +02002222/*[clinic input]
2223round as builtin_round
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002224
Serhiy Storchakaaca7f572017-11-15 17:51:14 +02002225 number: object
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002226 ndigits: object = None
Serhiy Storchakaaca7f572017-11-15 17:51:14 +02002227
2228Round a number to a given precision in decimal digits.
2229
2230The return value is an integer if ndigits is omitted or None. Otherwise
2231the return value has the same type as the number. ndigits may be negative.
2232[clinic start generated code]*/
2233
2234static PyObject *
2235builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002236/*[clinic end generated code: output=ff0d9dd176c02ede input=275678471d7aca15]*/
Serhiy Storchakaaca7f572017-11-15 17:51:14 +02002237{
2238 PyObject *round, *result;
Alex Martelliae211f92007-08-22 23:21:33 +00002239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 if (Py_TYPE(number)->tp_dict == NULL) {
2241 if (PyType_Ready(Py_TYPE(number)) < 0)
2242 return NULL;
2243 }
Guido van Rossum15d3d042007-08-24 02:02:45 +00002244
Benjamin Peterson214a7d22013-04-13 17:19:01 -04002245 round = _PyObject_LookupSpecial(number, &PyId___round__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 if (round == NULL) {
Benjamin Peterson214a7d22013-04-13 17:19:01 -04002247 if (!PyErr_Occurred())
2248 PyErr_Format(PyExc_TypeError,
2249 "type %.100s doesn't define __round__ method",
2250 Py_TYPE(number)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 return NULL;
2252 }
Alex Martelliae211f92007-08-22 23:21:33 +00002253
Serhiy Storchaka279f4462019-09-14 12:24:05 +03002254 if (ndigits == Py_None)
Victor Stinnerf17c3de2016-12-06 18:46:19 +01002255 result = _PyObject_CallNoArg(round);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 else
Petr Viktorinffd97532020-02-11 17:46:57 +01002257 result = PyObject_CallOneArg(round, ndigits);
Benjamin Peterson214a7d22013-04-13 17:19:01 -04002258 Py_DECREF(round);
2259 return result;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00002260}
2261
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002262
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002263/*AC: we need to keep the kwds dict intact to easily call into the
2264 * list.sort method, which isn't currently supported in AC. So we just use
2265 * the initially generated signature with a custom implementation.
2266 */
2267/* [disabled clinic input]
2268sorted as builtin_sorted
2269
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03002270 iterable as seq: object
2271 key as keyfunc: object = None
2272 reverse: object = False
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002273
2274Return a new list containing all items from the iterable in ascending order.
2275
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07002276A custom key function can be supplied to customize the sort order, and the
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002277reverse flag can be set to request the result in descending order.
2278[end disabled clinic input]*/
2279
2280PyDoc_STRVAR(builtin_sorted__doc__,
Serhiy Storchaka3a104252017-01-23 12:29:47 +02002281"sorted($module, iterable, /, *, key=None, reverse=False)\n"
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002282"--\n"
2283"\n"
2284"Return a new list containing all items from the iterable in ascending order.\n"
2285"\n"
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07002286"A custom key function can be supplied to customize the sort order, and the\n"
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002287"reverse flag can be set to request the result in descending order.");
2288
2289#define BUILTIN_SORTED_METHODDEF \
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002290 {"sorted", (PyCFunction)(void(*)(void))builtin_sorted, METH_FASTCALL | METH_KEYWORDS, builtin_sorted__doc__},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002291
Raymond Hettinger64958a12003-12-17 20:43:33 +00002292static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +02002293builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Raymond Hettinger64958a12003-12-17 20:43:33 +00002294{
Serhiy Storchaka7cf8beb2017-01-21 23:05:00 +02002295 PyObject *newlist, *v, *seq, *callable;
Victor Stinner5a60eca2017-01-17 15:17:49 +01002296
Serhiy Storchaka7cf8beb2017-01-21 23:05:00 +02002297 /* Keyword arguments are passed through list.sort() which will check
2298 them. */
2299 if (!_PyArg_UnpackStack(args, nargs, "sorted", 1, 1, &seq))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 return NULL;
Raymond Hettinger64958a12003-12-17 20:43:33 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 newlist = PySequence_List(seq);
2303 if (newlist == NULL)
2304 return NULL;
Raymond Hettinger64958a12003-12-17 20:43:33 +00002305
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002306 callable = _PyObject_GetAttrId(newlist, &PyId_sort);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (callable == NULL) {
2308 Py_DECREF(newlist);
2309 return NULL;
2310 }
Georg Brandl99d7e4e2005-08-31 22:21:15 +00002311
Serhiy Storchaka299dc232017-01-20 08:35:18 +02002312 assert(nargs >= 1);
Petr Viktorinffd97532020-02-11 17:46:57 +01002313 v = PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 Py_DECREF(callable);
2315 if (v == NULL) {
2316 Py_DECREF(newlist);
2317 return NULL;
2318 }
2319 Py_DECREF(v);
2320 return newlist;
Raymond Hettinger64958a12003-12-17 20:43:33 +00002321}
2322
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002323
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002324/* AC: cannot convert yet, as needs PEP 457 group support in inspect */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002326builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00002327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 PyObject *v = NULL;
2329 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v))
2332 return NULL;
2333 if (v == NULL) {
2334 d = PyEval_GetLocals();
Serhiy Storchaka41c57b32019-09-01 12:03:39 +03002335 Py_XINCREF(d);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 }
2337 else {
Serhiy Storchaka41c57b32019-09-01 12:03:39 +03002338 if (_PyObject_LookupAttrId(v, &PyId___dict__, &d) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 PyErr_SetString(PyExc_TypeError,
2340 "vars() argument must have __dict__ attribute");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 }
2342 }
2343 return d;
Guido van Rossum2d951851994-08-29 12:52:16 +00002344}
2345
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346PyDoc_STRVAR(vars_doc,
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002347"vars([object]) -> dictionary\n\
2348\n\
2349Without arguments, equivalent to locals().\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002350With an argument, equivalent to object.__dict__.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002351
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002352
2353/*[clinic input]
2354sum as builtin_sum
2355
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03002356 iterable: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002357 /
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07002358 start: object(c_default="NULL") = 0
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002359
2360Return the sum of a 'start' value (default: 0) plus an iterable of numbers
2361
2362When the iterable is empty, return the start value.
2363This function is intended specifically for use with numeric values and may
2364reject non-numeric types.
2365[clinic start generated code]*/
2366
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002367static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002368builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start)
Raymond Hettinger9dfa0fe2018-09-12 10:54:06 -07002369/*[clinic end generated code: output=df758cec7d1d302f input=162b50765250d222]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002370{
2371 PyObject *result = start;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 PyObject *temp, *item, *iter;
Alex Martellia70b1912003-04-22 08:12:33 +00002373
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002374 iter = PyObject_GetIter(iterable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 if (iter == NULL)
2376 return NULL;
Alex Martellia70b1912003-04-22 08:12:33 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 if (result == NULL) {
2379 result = PyLong_FromLong(0);
2380 if (result == NULL) {
2381 Py_DECREF(iter);
2382 return NULL;
2383 }
2384 } else {
2385 /* reject string values for 'start' parameter */
2386 if (PyUnicode_Check(result)) {
2387 PyErr_SetString(PyExc_TypeError,
2388 "sum() can't sum strings [use ''.join(seq) instead]");
2389 Py_DECREF(iter);
2390 return NULL;
2391 }
Benjamin Petersonce071ca2011-07-29 14:23:47 -05002392 if (PyBytes_Check(result)) {
2393 PyErr_SetString(PyExc_TypeError,
2394 "sum() can't sum bytes [use b''.join(seq) instead]");
Benjamin Peterson405f32c2011-07-29 22:43:45 -05002395 Py_DECREF(iter);
Benjamin Petersonce071ca2011-07-29 14:23:47 -05002396 return NULL;
2397 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 if (PyByteArray_Check(result)) {
2399 PyErr_SetString(PyExc_TypeError,
Benjamin Peterson4f921c22011-07-29 14:24:29 -05002400 "sum() can't sum bytearray [use b''.join(seq) instead]");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 Py_DECREF(iter);
2402 return NULL;
2403 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 Py_INCREF(result);
2405 }
Alex Martellia70b1912003-04-22 08:12:33 +00002406
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002407#ifndef SLOW_SUM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 /* Fast addition by keeping temporary sums in C instead of new Python objects.
2409 Assumes all inputs are the same type. If the assumption fails, default
2410 to the more general routine.
2411 */
2412 if (PyLong_CheckExact(result)) {
2413 int overflow;
2414 long i_result = PyLong_AsLongAndOverflow(result, &overflow);
2415 /* If this already overflowed, don't even enter the loop. */
2416 if (overflow == 0) {
2417 Py_DECREF(result);
2418 result = NULL;
2419 }
2420 while(result == NULL) {
2421 item = PyIter_Next(iter);
2422 if (item == NULL) {
2423 Py_DECREF(iter);
2424 if (PyErr_Occurred())
2425 return NULL;
2426 return PyLong_FromLong(i_result);
2427 }
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03002428 if (PyLong_CheckExact(item) || PyBool_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 long b = PyLong_AsLongAndOverflow(item, &overflow);
Serhiy Storchaka29500732019-05-05 14:26:23 +03002430 if (overflow == 0 &&
2431 (i_result >= 0 ? (b <= LONG_MAX - i_result)
2432 : (b >= LONG_MIN - i_result)))
2433 {
2434 i_result += b;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 Py_DECREF(item);
2436 continue;
2437 }
2438 }
2439 /* Either overflowed or is not an int. Restore real objects and process normally */
2440 result = PyLong_FromLong(i_result);
Christian Heimes704e2d32013-07-26 22:49:26 +02002441 if (result == NULL) {
2442 Py_DECREF(item);
2443 Py_DECREF(iter);
2444 return NULL;
2445 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 temp = PyNumber_Add(result, item);
2447 Py_DECREF(result);
2448 Py_DECREF(item);
2449 result = temp;
2450 if (result == NULL) {
2451 Py_DECREF(iter);
2452 return NULL;
2453 }
2454 }
2455 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 if (PyFloat_CheckExact(result)) {
2458 double f_result = PyFloat_AS_DOUBLE(result);
2459 Py_DECREF(result);
2460 result = NULL;
2461 while(result == NULL) {
2462 item = PyIter_Next(iter);
2463 if (item == NULL) {
2464 Py_DECREF(iter);
2465 if (PyErr_Occurred())
2466 return NULL;
2467 return PyFloat_FromDouble(f_result);
2468 }
2469 if (PyFloat_CheckExact(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 f_result += PyFloat_AS_DOUBLE(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 Py_DECREF(item);
2472 continue;
2473 }
Serhiy Storchaka88bdb922019-09-10 16:31:01 +03002474 if (PyLong_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 long value;
2476 int overflow;
2477 value = PyLong_AsLongAndOverflow(item, &overflow);
2478 if (!overflow) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 f_result += (double)value;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 Py_DECREF(item);
2481 continue;
2482 }
2483 }
2484 result = PyFloat_FromDouble(f_result);
Alexey Izbyshev2b824b22018-08-24 07:27:52 +03002485 if (result == NULL) {
2486 Py_DECREF(item);
2487 Py_DECREF(iter);
2488 return NULL;
2489 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 temp = PyNumber_Add(result, item);
2491 Py_DECREF(result);
2492 Py_DECREF(item);
2493 result = temp;
2494 if (result == NULL) {
2495 Py_DECREF(iter);
2496 return NULL;
2497 }
2498 }
2499 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +00002500#endif
2501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 for(;;) {
2503 item = PyIter_Next(iter);
2504 if (item == NULL) {
2505 /* error, or end-of-sequence */
2506 if (PyErr_Occurred()) {
2507 Py_DECREF(result);
2508 result = NULL;
2509 }
2510 break;
2511 }
2512 /* It's tempting to use PyNumber_InPlaceAdd instead of
2513 PyNumber_Add here, to avoid quadratic running time
2514 when doing 'sum(list_of_lists, [])'. However, this
2515 would produce a change in behaviour: a snippet like
Mark Dickinson9acadc52009-10-26 14:19:42 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 empty = []
2518 sum([[x] for x in range(10)], empty)
Mark Dickinson9acadc52009-10-26 14:19:42 +00002519
Brandt Bucherabb9a442020-02-01 03:08:34 -08002520 would change the value of empty. In fact, using
2521 in-place addition rather that binary addition for
2522 any of the steps introduces subtle behavior changes:
Victor Stinner58f4e1a2020-02-05 18:24:33 +01002523
Brandt Bucherabb9a442020-02-01 03:08:34 -08002524 https://bugs.python.org/issue18305 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 temp = PyNumber_Add(result, item);
2526 Py_DECREF(result);
2527 Py_DECREF(item);
2528 result = temp;
2529 if (result == NULL)
2530 break;
2531 }
2532 Py_DECREF(iter);
2533 return result;
Alex Martellia70b1912003-04-22 08:12:33 +00002534}
2535
Alex Martellia70b1912003-04-22 08:12:33 +00002536
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002537/*[clinic input]
2538isinstance as builtin_isinstance
2539
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03002540 obj: object
2541 class_or_tuple: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002542 /
2543
2544Return whether an object is an instance of a class or of a subclass thereof.
2545
2546A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
2547check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
2548or ...`` etc.
2549[clinic start generated code]*/
2550
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002551static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002552builtin_isinstance_impl(PyObject *module, PyObject *obj,
Larry Hastings89964c42015-04-14 18:07:59 -04002553 PyObject *class_or_tuple)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002554/*[clinic end generated code: output=6faf01472c13b003 input=ffa743db1daf7549]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002557
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002558 retval = PyObject_IsInstance(obj, class_or_tuple);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (retval < 0)
2560 return NULL;
2561 return PyBool_FromLong(retval);
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002562}
2563
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002564
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002565/*[clinic input]
2566issubclass as builtin_issubclass
2567
Serhiy Storchaka7e810a62015-05-30 11:09:35 +03002568 cls: object
2569 class_or_tuple: object
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002570 /
2571
Alex Poveldf773f82020-06-03 15:19:45 +02002572Return whether 'cls' is derived from another class or is the same class.
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002573
2574A tuple, as in ``issubclass(x, (A, B, ...))``, may be given as the target to
2575check against. This is equivalent to ``issubclass(x, A) or issubclass(x, B)
Alex Poveldf773f82020-06-03 15:19:45 +02002576or ...``.
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002577[clinic start generated code]*/
2578
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002579static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03002580builtin_issubclass_impl(PyObject *module, PyObject *cls,
Larry Hastings89964c42015-04-14 18:07:59 -04002581 PyObject *class_or_tuple)
Alex Poveldf773f82020-06-03 15:19:45 +02002582/*[clinic end generated code: output=358412410cd7a250 input=a24b9f3d58c370d6]*/
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002585
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002586 retval = PyObject_IsSubclass(cls, class_or_tuple);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 if (retval < 0)
2588 return NULL;
2589 return PyBool_FromLong(retval);
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002590}
2591
2592
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002593typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 PyObject_HEAD
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002595 Py_ssize_t tuplesize;
2596 PyObject *ittuple; /* tuple of iterators */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 PyObject *result;
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002598 int strict;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002599} zipobject;
2600
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002601static PyObject *
2602zip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Barry Warsawbd599b52000-08-03 15:45:29 +00002603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002604 zipobject *lz;
2605 Py_ssize_t i;
2606 PyObject *ittuple; /* tuple of iterators */
2607 PyObject *result;
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002608 Py_ssize_t tuplesize;
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002609 int strict = 0;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002610
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002611 if (kwds) {
2612 PyObject *empty = PyTuple_New(0);
2613 if (empty == NULL) {
2614 return NULL;
2615 }
2616 static char *kwlist[] = {"strict", NULL};
2617 int parsed = PyArg_ParseTupleAndKeywords(
2618 empty, kwds, "|$p:zip", kwlist, &strict);
2619 Py_DECREF(empty);
2620 if (!parsed) {
2621 return NULL;
2622 }
2623 }
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 /* args must be a tuple */
2626 assert(PyTuple_Check(args));
Serhiy Storchakabf623ae2017-04-19 20:03:52 +03002627 tuplesize = PyTuple_GET_SIZE(args);
Barry Warsawbd599b52000-08-03 15:45:29 +00002628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 /* obtain iterators */
2630 ittuple = PyTuple_New(tuplesize);
2631 if (ittuple == NULL)
2632 return NULL;
2633 for (i=0; i < tuplesize; ++i) {
2634 PyObject *item = PyTuple_GET_ITEM(args, i);
2635 PyObject *it = PyObject_GetIter(item);
2636 if (it == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002637 Py_DECREF(ittuple);
2638 return NULL;
2639 }
2640 PyTuple_SET_ITEM(ittuple, i, it);
2641 }
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 /* create a result holder */
2644 result = PyTuple_New(tuplesize);
2645 if (result == NULL) {
2646 Py_DECREF(ittuple);
2647 return NULL;
2648 }
2649 for (i=0 ; i < tuplesize ; i++) {
2650 Py_INCREF(Py_None);
2651 PyTuple_SET_ITEM(result, i, Py_None);
2652 }
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 /* create zipobject structure */
2655 lz = (zipobject *)type->tp_alloc(type, 0);
2656 if (lz == NULL) {
2657 Py_DECREF(ittuple);
2658 Py_DECREF(result);
2659 return NULL;
2660 }
2661 lz->ittuple = ittuple;
2662 lz->tuplesize = tuplesize;
2663 lz->result = result;
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002664 lz->strict = strict;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002665
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 return (PyObject *)lz;
Barry Warsawbd599b52000-08-03 15:45:29 +00002667}
2668
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002669static void
2670zip_dealloc(zipobject *lz)
2671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 PyObject_GC_UnTrack(lz);
2673 Py_XDECREF(lz->ittuple);
2674 Py_XDECREF(lz->result);
2675 Py_TYPE(lz)->tp_free(lz);
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002676}
2677
2678static int
2679zip_traverse(zipobject *lz, visitproc visit, void *arg)
2680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 Py_VISIT(lz->ittuple);
2682 Py_VISIT(lz->result);
2683 return 0;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002684}
2685
2686static PyObject *
2687zip_next(zipobject *lz)
2688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002689 Py_ssize_t i;
2690 Py_ssize_t tuplesize = lz->tuplesize;
2691 PyObject *result = lz->result;
2692 PyObject *it;
2693 PyObject *item;
2694 PyObject *olditem;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 if (tuplesize == 0)
2697 return NULL;
2698 if (Py_REFCNT(result) == 1) {
2699 Py_INCREF(result);
2700 for (i=0 ; i < tuplesize ; i++) {
2701 it = PyTuple_GET_ITEM(lz->ittuple, i);
2702 item = (*Py_TYPE(it)->tp_iternext)(it);
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002703 if (item == NULL) {
2704 Py_DECREF(result);
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002705 if (lz->strict) {
2706 goto check;
2707 }
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002708 return NULL;
2709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 olditem = PyTuple_GET_ITEM(result, i);
2711 PyTuple_SET_ITEM(result, i, item);
2712 Py_DECREF(olditem);
2713 }
Brandt Bucher226a0122020-12-04 19:45:57 -08002714 // bpo-42536: The GC may have untracked this result tuple. Since we're
2715 // recycling it, make sure it's tracked again:
2716 if (!_PyObject_GC_IS_TRACKED(result)) {
2717 _PyObject_GC_TRACK(result);
2718 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 } else {
2720 result = PyTuple_New(tuplesize);
2721 if (result == NULL)
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002722 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 for (i=0 ; i < tuplesize ; i++) {
2724 it = PyTuple_GET_ITEM(lz->ittuple, i);
2725 item = (*Py_TYPE(it)->tp_iternext)(it);
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002726 if (item == NULL) {
2727 Py_DECREF(result);
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002728 if (lz->strict) {
2729 goto check;
2730 }
Serhiy Storchaka278d03b2013-04-06 22:52:34 +03002731 return NULL;
2732 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 PyTuple_SET_ITEM(result, i, item);
2734 }
2735 }
2736 return result;
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002737check:
2738 if (PyErr_Occurred()) {
2739 if (!PyErr_ExceptionMatches(PyExc_StopIteration)) {
2740 // next() on argument i raised an exception (not StopIteration)
2741 return NULL;
2742 }
2743 PyErr_Clear();
2744 }
2745 if (i) {
2746 // ValueError: zip() argument 2 is shorter than argument 1
2747 // ValueError: zip() argument 3 is shorter than arguments 1-2
2748 const char* plural = i == 1 ? " " : "s 1-";
2749 return PyErr_Format(PyExc_ValueError,
2750 "zip() argument %d is shorter than argument%s%d",
2751 i + 1, plural, i);
2752 }
2753 for (i = 1; i < tuplesize; i++) {
2754 it = PyTuple_GET_ITEM(lz->ittuple, i);
2755 item = (*Py_TYPE(it)->tp_iternext)(it);
2756 if (item) {
2757 Py_DECREF(item);
2758 const char* plural = i == 1 ? " " : "s 1-";
2759 return PyErr_Format(PyExc_ValueError,
2760 "zip() argument %d is longer than argument%s%d",
2761 i + 1, plural, i);
2762 }
2763 if (PyErr_Occurred()) {
2764 if (!PyErr_ExceptionMatches(PyExc_StopIteration)) {
2765 // next() on argument i raised an exception (not StopIteration)
2766 return NULL;
2767 }
2768 PyErr_Clear();
2769 }
2770 // Argument i is exhausted. So far so good...
2771 }
2772 // All arguments are exhausted. Success!
2773 return NULL;
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002774}
Barry Warsawbd599b52000-08-03 15:45:29 +00002775
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002776static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05302777zip_reduce(zipobject *lz, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002778{
2779 /* Just recreate the zip with the internal iterator tuple */
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002780 if (lz->strict) {
2781 return PyTuple_Pack(3, Py_TYPE(lz), lz->ittuple, Py_True);
2782 }
2783 return PyTuple_Pack(2, Py_TYPE(lz), lz->ittuple);
2784}
2785
2786PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2787
2788static PyObject *
2789zip_setstate(zipobject *lz, PyObject *state)
2790{
2791 int strict = PyObject_IsTrue(state);
2792 if (strict < 0) {
2793 return NULL;
2794 }
2795 lz->strict = strict;
2796 Py_RETURN_NONE;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002797}
2798
2799static PyMethodDef zip_methods[] = {
2800 {"__reduce__", (PyCFunction)zip_reduce, METH_NOARGS, reduce_doc},
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002801 {"__setstate__", (PyCFunction)zip_setstate, METH_O, setstate_doc},
2802 {NULL} /* sentinel */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002803};
2804
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002805PyDoc_STRVAR(zip_doc,
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002806"zip(*iterables, strict=False) --> Yield tuples until an input is exhausted.\n\
Barry Warsawbd599b52000-08-03 15:45:29 +00002807\n\
Gregory P. Smith6a5d3ff2020-05-15 14:26:00 -07002808 >>> list(zip('abcdefg', range(3), range(4)))\n\
2809 [('a', 0, 0), ('b', 1, 1), ('c', 2, 2)]\n\
2810\n\
2811The zip object yields n-length tuples, where n is the number of iterables\n\
2812passed as positional arguments to zip(). The i-th element in every tuple\n\
2813comes from the i-th iterable argument to zip(). This continues until the\n\
Guido van Rossum310f6aa2020-06-19 03:16:57 -07002814shortest argument is exhausted.\n\
2815\n\
2816If strict is true and one of the arguments is exhausted before the others,\n\
2817raise a ValueError.");
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002818
2819PyTypeObject PyZip_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002820 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2821 "zip", /* tp_name */
2822 sizeof(zipobject), /* tp_basicsize */
2823 0, /* tp_itemsize */
2824 /* methods */
2825 (destructor)zip_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002826 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 0, /* tp_getattr */
2828 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002829 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 0, /* tp_repr */
2831 0, /* tp_as_number */
2832 0, /* tp_as_sequence */
2833 0, /* tp_as_mapping */
2834 0, /* tp_hash */
2835 0, /* tp_call */
2836 0, /* tp_str */
2837 PyObject_GenericGetAttr, /* tp_getattro */
2838 0, /* tp_setattro */
2839 0, /* tp_as_buffer */
2840 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2841 Py_TPFLAGS_BASETYPE, /* tp_flags */
2842 zip_doc, /* tp_doc */
2843 (traverseproc)zip_traverse, /* tp_traverse */
2844 0, /* tp_clear */
2845 0, /* tp_richcompare */
2846 0, /* tp_weaklistoffset */
2847 PyObject_SelfIter, /* tp_iter */
2848 (iternextfunc)zip_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002849 zip_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 0, /* tp_members */
2851 0, /* tp_getset */
2852 0, /* tp_base */
2853 0, /* tp_dict */
2854 0, /* tp_descr_get */
2855 0, /* tp_descr_set */
2856 0, /* tp_dictoffset */
2857 0, /* tp_init */
2858 PyType_GenericAlloc, /* tp_alloc */
2859 zip_new, /* tp_new */
2860 PyObject_GC_Del, /* tp_free */
Raymond Hettinger736c0ab2008-03-13 02:09:15 +00002861};
Barry Warsawbd599b52000-08-03 15:45:29 +00002862
2863
Guido van Rossum79f25d91997-04-29 20:08:16 +00002864static PyMethodDef builtin_methods[] = {
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002865 {"__build_class__", (PyCFunction)(void(*)(void))builtin___build_class__,
Serhiy Storchaka6969eaf2017-07-03 21:20:15 +03002866 METH_FASTCALL | METH_KEYWORDS, build_class_doc},
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002867 {"__import__", (PyCFunction)(void(*)(void))builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002868 BUILTIN_ABS_METHODDEF
2869 BUILTIN_ALL_METHODDEF
2870 BUILTIN_ANY_METHODDEF
2871 BUILTIN_ASCII_METHODDEF
2872 BUILTIN_BIN_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002873 {"breakpoint", (PyCFunction)(void(*)(void))builtin_breakpoint, METH_FASTCALL | METH_KEYWORDS, breakpoint_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002874 BUILTIN_CALLABLE_METHODDEF
2875 BUILTIN_CHR_METHODDEF
2876 BUILTIN_COMPILE_METHODDEF
2877 BUILTIN_DELATTR_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 {"dir", builtin_dir, METH_VARARGS, dir_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002879 BUILTIN_DIVMOD_METHODDEF
2880 BUILTIN_EVAL_METHODDEF
2881 BUILTIN_EXEC_METHODDEF
2882 BUILTIN_FORMAT_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002883 {"getattr", (PyCFunction)(void(*)(void))builtin_getattr, METH_FASTCALL, getattr_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002884 BUILTIN_GLOBALS_METHODDEF
2885 BUILTIN_HASATTR_METHODDEF
2886 BUILTIN_HASH_METHODDEF
2887 BUILTIN_HEX_METHODDEF
2888 BUILTIN_ID_METHODDEF
2889 BUILTIN_INPUT_METHODDEF
2890 BUILTIN_ISINSTANCE_METHODDEF
2891 BUILTIN_ISSUBCLASS_METHODDEF
Serhiy Storchaka79342662019-01-12 08:25:41 +02002892 {"iter", (PyCFunction)(void(*)(void))builtin_iter, METH_FASTCALL, iter_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002893 BUILTIN_LEN_METHODDEF
2894 BUILTIN_LOCALS_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002895 {"max", (PyCFunction)(void(*)(void))builtin_max, METH_VARARGS | METH_KEYWORDS, max_doc},
2896 {"min", (PyCFunction)(void(*)(void))builtin_min, METH_VARARGS | METH_KEYWORDS, min_doc},
2897 {"next", (PyCFunction)(void(*)(void))builtin_next, METH_FASTCALL, next_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002898 BUILTIN_OCT_METHODDEF
2899 BUILTIN_ORD_METHODDEF
2900 BUILTIN_POW_METHODDEF
Serhiy Storchaka62be7422018-11-27 13:27:31 +02002901 {"print", (PyCFunction)(void(*)(void))builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc},
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002902 BUILTIN_REPR_METHODDEF
Serhiy Storchakaaca7f572017-11-15 17:51:14 +02002903 BUILTIN_ROUND_METHODDEF
Nick Coghlanf9e227e2014-08-17 14:01:19 +10002904 BUILTIN_SETATTR_METHODDEF
2905 BUILTIN_SORTED_METHODDEF
2906 BUILTIN_SUM_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 {"vars", builtin_vars, METH_VARARGS, vars_doc},
2908 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002909};
2910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911PyDoc_STRVAR(builtin_doc,
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002912"Built-in functions, exceptions, and other objects.\n\
2913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.");
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002915
Martin v. Löwis1a214512008-06-11 05:26:20 +00002916static struct PyModuleDef builtinsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 PyModuleDef_HEAD_INIT,
2918 "builtins",
2919 builtin_doc,
2920 -1, /* multiple "initialization" just copies the module dict. */
2921 builtin_methods,
2922 NULL,
2923 NULL,
2924 NULL,
2925 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002926};
2927
2928
Guido van Rossum25ce5661997-08-02 03:10:38 +00002929PyObject *
Victor Stinnerbcb094b2021-02-19 15:10:45 +01002930_PyBuiltin_Init(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002931{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 PyObject *mod, *dict, *debug;
Benjamin Peterson42124a72012-10-30 23:41:54 -04002933
Victor Stinnerbcb094b2021-02-19 15:10:45 +01002934 const PyConfig *config = _PyInterpreterState_GetConfig(interp);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002935
Benjamin Peterson42124a72012-10-30 23:41:54 -04002936 if (PyType_Ready(&PyFilter_Type) < 0 ||
2937 PyType_Ready(&PyMap_Type) < 0 ||
2938 PyType_Ready(&PyZip_Type) < 0)
2939 return NULL;
2940
Eric Snowd393c1b2017-09-14 12:18:12 -06002941 mod = _PyModule_CreateInitialized(&builtinsmodule, PYTHON_API_VERSION);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 if (mod == NULL)
2943 return NULL;
2944 dict = PyModule_GetDict(mod);
Tim Peters4b7625e2001-09-13 21:37:17 +00002945
Tim Peters7571a0f2003-03-23 17:52:28 +00002946#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 /* "builtins" exposes a number of statically allocated objects
2948 * that, before this code was added in 2.3, never showed up in
2949 * the list of "all objects" maintained by Py_TRACE_REFS. As a
2950 * result, programs leaking references to None and False (etc)
2951 * couldn't be diagnosed by examining sys.getobjects(0).
2952 */
Tim Peters7571a0f2003-03-23 17:52:28 +00002953#define ADD_TO_ALL(OBJECT) _Py_AddToAllObjects((PyObject *)(OBJECT), 0)
2954#else
2955#define ADD_TO_ALL(OBJECT) (void)0
2956#endif
2957
Tim Peters4b7625e2001-09-13 21:37:17 +00002958#define SETBUILTIN(NAME, OBJECT) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0) \
2960 return NULL; \
2961 ADD_TO_ALL(OBJECT)
Tim Peters4b7625e2001-09-13 21:37:17 +00002962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 SETBUILTIN("None", Py_None);
2964 SETBUILTIN("Ellipsis", Py_Ellipsis);
2965 SETBUILTIN("NotImplemented", Py_NotImplemented);
2966 SETBUILTIN("False", Py_False);
2967 SETBUILTIN("True", Py_True);
2968 SETBUILTIN("bool", &PyBool_Type);
2969 SETBUILTIN("memoryview", &PyMemoryView_Type);
2970 SETBUILTIN("bytearray", &PyByteArray_Type);
2971 SETBUILTIN("bytes", &PyBytes_Type);
2972 SETBUILTIN("classmethod", &PyClassMethod_Type);
2973 SETBUILTIN("complex", &PyComplex_Type);
2974 SETBUILTIN("dict", &PyDict_Type);
2975 SETBUILTIN("enumerate", &PyEnum_Type);
2976 SETBUILTIN("filter", &PyFilter_Type);
2977 SETBUILTIN("float", &PyFloat_Type);
2978 SETBUILTIN("frozenset", &PyFrozenSet_Type);
2979 SETBUILTIN("property", &PyProperty_Type);
2980 SETBUILTIN("int", &PyLong_Type);
2981 SETBUILTIN("list", &PyList_Type);
2982 SETBUILTIN("map", &PyMap_Type);
2983 SETBUILTIN("object", &PyBaseObject_Type);
2984 SETBUILTIN("range", &PyRange_Type);
2985 SETBUILTIN("reversed", &PyReversed_Type);
2986 SETBUILTIN("set", &PySet_Type);
2987 SETBUILTIN("slice", &PySlice_Type);
2988 SETBUILTIN("staticmethod", &PyStaticMethod_Type);
2989 SETBUILTIN("str", &PyUnicode_Type);
2990 SETBUILTIN("super", &PySuper_Type);
2991 SETBUILTIN("tuple", &PyTuple_Type);
2992 SETBUILTIN("type", &PyType_Type);
2993 SETBUILTIN("zip", &PyZip_Type);
Victor Stinnerfbca9082018-08-30 00:50:45 +02002994 debug = PyBool_FromLong(config->optimization_level == 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002995 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
Serhiy Storchakacfdfbb42016-06-18 09:44:03 +03002996 Py_DECREF(debug);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 return NULL;
2998 }
Serhiy Storchakacfdfbb42016-06-18 09:44:03 +03002999 Py_DECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00003000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 return mod;
Tim Peters7571a0f2003-03-23 17:52:28 +00003002#undef ADD_TO_ALL
Tim Peters4b7625e2001-09-13 21:37:17 +00003003#undef SETBUILTIN
Guido van Rossum3f5da241990-12-20 15:06:42 +00003004}