1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Built-in functions */
2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python.h"
4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "Python-ast.h"
5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "node.h"
7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "code.h"
8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "eval.h"
9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <ctype.h>
11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <float.h> /* for DBL_MANT_DIG and friends */
12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS
14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "unixstuff.h"
15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The default encoding used by the platform file system APIs
18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Can remain NULL for all platforms that don't have such a concept
19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/
20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = "mbcs";
22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(__APPLE__)
23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = "utf-8";
24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielconst char *Py_FileSystemDefaultEncoding = NULL; /* use default */
26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Forward */
29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filterstring(PyObject *, PyObject *);
30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filterunicode(PyObject *, PyObject *);
32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *filtertuple (PyObject *, PyObject *);
34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin___import__(PyObject *self, PyObject *args, PyObject *kwds)
37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static char *kwlist[] = {"name", "globals", "locals", "fromlist",
39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "level", 0};
40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *name;
41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *globals = NULL;
42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *locals = NULL;
43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *fromlist = NULL;
44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int level = -1;
45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__",
47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    kwlist, &name, &globals, &locals, &fromlist, &level))
48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyImport_ImportModuleLevel(name, globals, locals,
50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                      fromlist, level);
51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(import_doc,
54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"__import__(name, globals={}, locals={}, fromlist=[], level=-1) -> module\n\
55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielImport a module. Because this function is meant for use by the Python\n\
57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinterpreter and not for general use it is better to use\n\
58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielimportlib.import_module() to programmatically import a module.\n\
59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals argument is only used to determine the context;\n\
61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthey are not modified.  The locals argument is unused.  The fromlist\n\
62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielshould be a list of names to emulate ``from name import ...'', or an\n\
63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielempty list to emulate ``import name''.\n\
64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen importing a module from a package, note that __import__('A.B', ...)\n\
65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielreturns package A when fromlist is empty, but its submodule B when\n\
66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfromlist is not empty.  Level is used to determine whether to perform \n\
67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielabsolute or relative imports.  -1 is the original strategy of attempting\n\
68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielboth absolute and relative imports, 0 is absolute, a positive number\n\
69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis the number of parent directories to search relative to the current module.");
70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_abs(PyObject *self, PyObject *v)
74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyNumber_Absolute(v);
76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(abs_doc,
79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"abs(number) -> number\n\
80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the absolute value of the argument.");
82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_all(PyObject *self, PyObject *v)
85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *it, *item;
87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *(*iternext)(PyObject *);
88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int cmp;
89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    it = PyObject_GetIter(v);
91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (it == NULL)
92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    iternext = *Py_TYPE(it)->tp_iternext;
94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = iternext(it);
97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL)
98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cmp = PyObject_IsTrue(item);
100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(item);
101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (cmp < 0) {
102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(it);
103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (cmp == 0) {
106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(it);
107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_RETURN_FALSE;
108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_Occurred()) {
112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_ExceptionMatches(PyExc_StopIteration))
113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_RETURN_TRUE;
118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(all_doc,
121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"all(iterable) -> bool\n\
122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn True if bool(x) is True for all values x in the iterable.\n\
124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the iterable is empty, return True.");
125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_any(PyObject *self, PyObject *v)
128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *it, *item;
130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *(*iternext)(PyObject *);
131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int cmp;
132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    it = PyObject_GetIter(v);
134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (it == NULL)
135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    iternext = *Py_TYPE(it)->tp_iternext;
137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = iternext(it);
140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL)
141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cmp = PyObject_IsTrue(item);
143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(item);
144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (cmp < 0) {
145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(it);
146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (cmp == 1) {
149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(it);
150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_RETURN_TRUE;
151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_Occurred()) {
155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_ExceptionMatches(PyExc_StopIteration))
156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_RETURN_FALSE;
161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(any_doc,
164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"any(iterable) -> bool\n\
165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn True if bool(x) is True for any x in the iterable.\n\
167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the iterable is empty, return False.");
168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_apply(PyObject *self, PyObject *args)
171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func, *alist = NULL, *kwdict = NULL;
173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *t = NULL, *retval = NULL;
174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnPy3k("apply() not supported in 3.x; "
176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       "use func(*args, **kwargs)", 1) < 0)
177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "apply", 1, 3, &func, &alist, &kwdict))
180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (alist != NULL) {
182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyTuple_Check(alist)) {
183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PySequence_Check(alist)) {
184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_TypeError,
185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "apply() arg 2 expected sequence, found %s",
186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         alist->ob_type->tp_name);
187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            t = PySequence_Tuple(alist);
190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (t == NULL)
191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            alist = t;
193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (kwdict != NULL && !PyDict_Check(kwdict)) {
196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "apply() arg 3 expected dictionary, found %s",
198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     kwdict->ob_type->tp_name);
199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto finally;
200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  finally:
203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(t);
204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return retval;
205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(apply_doc,
208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"apply(object[, args[, kwargs]]) -> value\n\
209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielCall a callable object with positional arguments taken from the tuple args,\n\
211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieland keyword arguments taken from the optional dictionary kwargs.\n\
212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNote that classes are callable, as are instances with a __call__() method.\n\
213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDeprecated since release 2.3. Instead, use the extended call syntax:\n\
215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    function(*args, **keywords).");
216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_bin(PyObject *self, PyObject *v)
220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyNumber_ToBase(v, 2);
222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(bin_doc,
225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"bin(number) -> string\n\
226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the binary representation of an integer or long integer.");
228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_callable(PyObject *self, PyObject *v)
232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyBool_FromLong((long)PyCallable_Check(v));
234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(callable_doc,
237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"callable(object) -> bool\n\
238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether the object is callable (i.e., some kind of function).\n\
240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNote that classes are callable, as are instances with a __call__() method.");
241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_filter(PyObject *self, PyObject *args)
245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func, *seq, *result, *it, *arg;
247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t len;   /* guess for result list size */
248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register Py_ssize_t j;
249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "filter", 2, 2, &func, &seq))
251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Strings and tuples return a result of the same type. */
254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyString_Check(seq))
255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return filterstring(func, seq);
256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyUnicode_Check(seq))
258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return filterunicode(func, seq);
259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_Check(seq))
261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return filtertuple(func, seq);
262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Pre-allocate argument list tuple. */
264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    arg = PyTuple_New(1);
265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (arg == NULL)
266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Get iterator. */
269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    it = PyObject_GetIter(seq);
270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (it == NULL)
271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_arg;
272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Guess a result list size. */
274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    len = _PyObject_LengthHint(seq, 8);
275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (len == -1)
276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_it;
277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Get a result list. */
279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyList_Check(seq) && seq->ob_refcnt == 1) {
280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Eww - can modify the list in-place. */
281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(seq);
282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = seq;
283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = PyList_New(len);
286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (result == NULL)
287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_it;
288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Build the result list. */
291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    j = 0;
292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (;;) {
293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item;
294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int ok;
295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = PyIter_Next(it);
297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL) {
298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_Occurred())
299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_result_it;
300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == (PyObject *)&PyBool_Type || func == Py_None) {
304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = PyObject_IsTrue(item);
305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *good;
308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTuple_SET_ITEM(arg, 0, item);
309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            good = PyObject_Call(func, arg, NULL);
310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTuple_SET_ITEM(arg, 0, NULL);
311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (good == NULL) {
312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_result_it;
314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = PyObject_IsTrue(good);
316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(good);
317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok > 0) {
319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (j < len)
320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyList_SET_ITEM(result, j, item);
321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                int status = PyList_Append(result, item);
323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (status < 0)
325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto Fail_result_it;
326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ++j;
328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(item);
331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (ok < 0)
332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_result_it;
333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Cut back result list if len is too big. */
338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_result_it;
340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(arg);
343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_result_it:
346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(result);
347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it:
348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_arg:
350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(arg);
351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(filter_doc,
355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"filter(function or None, sequence) -> list, tuple, or string\n"
356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n"
357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Return those items of sequence for which function(item) is true.  If\n"
358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"function is None, return the items that are true.  If sequence is a tuple\n"
359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"or string, return the same type, else return a list.");
360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_format(PyObject *self, PyObject *args)
363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *value;
365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *format_spec = NULL;
366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTuple(args, "O|O:format", &value, &format_spec))
368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyObject_Format(value, format_spec);
371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(format_doc,
374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"format(value[, format_spec]) -> string\n\
375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturns value.__format__(format_spec)\n\
377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielformat_spec defaults to \"\"");
378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_chr(PyObject *self, PyObject *args)
381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long x;
383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char s[1];
384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTuple(args, "l:chr", &x))
386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (x < 0 || x >= 256) {
388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_ValueError,
389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "chr() arg not in range(256)");
390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    s[0] = (char)x;
393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyString_FromStringAndSize(s, 1);
394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(chr_doc,
397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"chr(i) -> character\n\
398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a string of one character with ordinal i; 0 <= i < 256.");
400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_unichr(PyObject *self, PyObject *args)
405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int x;
407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTuple(args, "i:unichr", &x))
409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyUnicode_FromOrdinal(x);
412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(unichr_doc,
415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"unichr(i) -> Unicode character\n\
416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");
418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_cmp(PyObject *self, PyObject *args)
423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *a, *b;
425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int c;
426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "cmp", 2, 2, &a, &b))
428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_Cmp(a, b, &c) < 0)
430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyInt_FromLong((long)c);
432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(cmp_doc,
435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"cmp(x, y) -> integer\n\
436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn negative if x<y, zero if x==y, positive if x>y.");
438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_coerce(PyObject *self, PyObject *args)
442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *w;
444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnPy3k("coerce() not supported in 3.x", 1) < 0)
447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "coerce", 2, 2, &v, &w))
450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyNumber_Coerce(&v, &w) < 0)
452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = PyTuple_Pack(2, v, w);
454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(v);
455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(w);
456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(coerce_doc,
460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"coerce(x, y) -> (x1, y1)\n\
461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a tuple consisting of the two numeric arguments converted to\n\
463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniela common type, using the same rules as used by arithmetic operations.\n\
464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf coercion is not possible, raise TypeError.");
465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_compile(PyObject *self, PyObject *args, PyObject *kwds)
468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *str;
470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *filename;
471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *startstr;
472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int mode = -1;
473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int dont_inherit = 0;
474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int supplied_flags = 0;
475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int is_ast;
476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCompilerFlags cf;
477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result = NULL, *cmd, *tmp = NULL;
478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t length;
479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static char *kwlist[] = {"source", "filename", "mode", "flags",
480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                             "dont_inherit", NULL};
481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int start[] = {Py_file_input, Py_eval_input, Py_single_input};
482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oss|ii:compile",
484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     kwlist, &cmd, &filename, &startstr,
485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     &supplied_flags, &dont_inherit))
486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    cf.cf_flags = supplied_flags;
489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (supplied_flags &
491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST))
492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {
493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_ValueError,
494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "compile(): unrecognised flags");
495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!dont_inherit) {
500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyEval_MergeCompilerFlags(&cf);
501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (strcmp(startstr, "exec") == 0)
504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        mode = 0;
505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (strcmp(startstr, "eval") == 0)
506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        mode = 1;
507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (strcmp(startstr, "single") == 0)
508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        mode = 2;
509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_ValueError,
511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "compile() arg 3 must be 'exec', 'eval' or 'single'");
512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    is_ast = PyAST_Check(cmd);
516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (is_ast == -1)
517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (is_ast) {
519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (supplied_flags & PyCF_ONLY_AST) {
520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(cmd);
521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = cmd;
522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyArena *arena;
525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            mod_ty mod;
526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arena = PyArena_New();
528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (arena == NULL)
529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            mod = PyAST_obj2mod(cmd, arena, mode);
531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (mod == NULL) {
532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyArena_Free(arena);
533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = (PyObject*)PyAST_Compile(mod, filename,
536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                              &cf, arena);
537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyArena_Free(arena);
538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return result;
540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyUnicode_Check(cmd)) {
544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp = PyUnicode_AsUTF8String(cmd);
545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tmp == NULL)
546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cmd = tmp;
548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length))
553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto cleanup;
554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((size_t)length != strlen(str)) {
555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "compile() expected string without null bytes");
557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto cleanup;
558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = Py_CompileStringFlags(str, filename, start[mode], &cf);
560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcleanup:
561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp);
562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(compile_doc,
566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielCompile the source string (a Python module, statement or expression)\n\
569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielinto a code object that can be executed by the exec statement or eval().\n\
570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe filename will be used for run-time error messages.\n\
571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe mode must be 'exec' to compile a module, 'single' to compile a\n\
572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsingle (interactive) statement, or 'eval' to compile an expression.\n\
573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe flags argument, if present, controls which future statements influence\n\
574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe compilation of the code.\n\
575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe dont_inherit argument, if non-zero, stops the compilation inheriting\n\
576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe effects of any future statements in effect in the code calling\n\
577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielcompile; if absent or zero these statements do influence the compilation,\n\
578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin addition to any features explicitly specified.");
579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_dir(PyObject *self, PyObject *args)
582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *arg = NULL;
584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyObject_Dir(arg);
588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(dir_doc,
591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"dir([object]) -> list of strings\n"
592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"\n"
593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"If called without an argument, return the names in the current scope.\n"
594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Else, return an alphabetized list of names comprising (some of) the attributes\n"
595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"of the given object, and of attributes reachable from it.\n"
596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"If the object supplies a method named __dir__, it will be used; otherwise\n"
597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"the default dir() logic is used and returns:\n"
598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"  for a module object: the module's attributes.\n"
599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"  for a class object:  its attributes, and recursively the attributes\n"
600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"    of its bases.\n"
601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"  for any other object: its attributes, its class's attributes, and\n"
602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"    recursively the attributes of its class's base classes.");
603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_divmod(PyObject *self, PyObject *args)
606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *w;
608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "divmod", 2, 2, &v, &w))
610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyNumber_Divmod(v, w);
612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(divmod_doc,
615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"divmod(x, y) -> (quotient, remainder)\n\
616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the tuple ((x-x%y)/y, x%y).  Invariant: div*y + mod == x.");
618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_eval(PyObject *self, PyObject *args)
622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *cmd, *result, *tmp = NULL;
624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *globals = Py_None, *locals = Py_None;
625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *str;
626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCompilerFlags cf;
627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "eval", 1, 3, &cmd, &globals, &locals))
629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (locals != Py_None && !PyMapping_Check(locals)) {
631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals != Py_None && !PyDict_Check(globals)) {
635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError, PyMapping_Check(globals) ?
636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "globals must be a real dict; try eval(expr, {}, mapping)"
637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            : "globals must be a dict");
638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals == Py_None) {
641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = PyEval_GetGlobals();
642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (locals == Py_None)
643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            locals = PyEval_GetLocals();
644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (locals == Py_None)
646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        locals = globals;
647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals == NULL || locals == NULL) {
649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "eval must be given globals and locals "
651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "when called without a frame");
652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyDict_SetItemString(globals, "__builtins__",
657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetBuiltins()) != 0)
658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyCode_Check(cmd)) {
662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyCode_GetNumFree((PyCodeObject *)cmd) > 0) {
663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        "code object passed to eval() may not contain free variables");
665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyString_Check(cmd) &&
671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        !PyUnicode_Check(cmd)) {
672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   "eval() arg 1 must be a string or code object");
674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    cf.cf_flags = 0;
677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyUnicode_Check(cmd)) {
680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp = PyUnicode_AsUTF8String(cmd);
681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tmp == NULL)
682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cmd = tmp;
684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyString_AsStringAndSize(cmd, &str, NULL)) {
688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(tmp);
689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (*str == ' ' || *str == '\t')
692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        str++;
693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    (void)PyEval_MergeCompilerFlags(&cf);
695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp);
697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(eval_doc,
701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"eval(source[, globals[, locals]]) -> value\n\
702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielEvaluate the source in the context of globals and locals.\n\
704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe source may be a string representing a Python expression\n\
705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielor a code object as returned by compile().\n\
706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals must be a dictionary and locals can be any mapping,\n\
707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieldefaulting to the current globals and locals.\n\
708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf only globals is given, locals defaults to it.\n");
709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_execfile(PyObject *self, PyObject *args)
713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *filename;
715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *globals = Py_None, *locals = Py_None;
716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    FILE* fp = NULL;
718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCompilerFlags cf;
719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int exists;
720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnPy3k("execfile() not supported in 3.x; use exec()",
722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       1) < 0)
723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTuple(args, "s|O!O:execfile",
726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    &filename,
727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    &PyDict_Type, &globals,
728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    &locals))
729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (locals != Py_None && !PyMapping_Check(locals)) {
731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError, "locals must be a mapping");
732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (globals == Py_None) {
735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        globals = PyEval_GetGlobals();
736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (locals == Py_None)
737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            locals = PyEval_GetLocals();
738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (locals == Py_None)
740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        locals = globals;
741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyDict_SetItemString(globals, "__builtins__",
743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetBuiltins()) != 0)
744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    exists = 0;
748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Test for existence or directory. */
749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(PLAN9)
750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {
751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Dir *d;
752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if ((d = dirstat(filename))!=nil) {
754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if(d->mode & DMDIR)
755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                werrstr("is a directory");
756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                exists = 1;
758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            free(d);
759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(RISCOS)
762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (object_exists(filename)) {
763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (isdir(filename))
764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            errno = EISDIR;
765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            exists = 1;
767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else   /* standard Posix */
769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {
770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        struct stat s;
771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (stat(filename, &s) == 0) {
772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (S_ISDIR(s.st_mode))
773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#                               if defined(PYOS_OS2) && defined(PYCC_VACPP)
774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            errno = EOS2ERR;
775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#                               else
776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            errno = EISDIR;
777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#                               endif
778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                exists = 1;
780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (exists) {
785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_BEGIN_ALLOW_THREADS
786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        fp = fopen(filename, "r" PY_STDIOTEXTMODE);
787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_END_ALLOW_THREADS
788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (fp == NULL) {
790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            exists = 0;
791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!exists) {
795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename);
796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    cf.cf_flags = 0;
799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyEval_MergeCompilerFlags(&cf))
800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           locals, 1, &cf);
802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        res = PyRun_FileEx(fp, filename, Py_file_input, globals,
804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           locals, 1);
805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(execfile_doc,
809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"execfile(filename[, globals[, locals]])\n\
810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRead and execute a Python script from a file.\n\
812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe globals and locals are dictionaries, defaulting to the current\n\
813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielglobals and locals.  If only globals is given, locals defaults to it.");
814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_getattr(PyObject *self, PyObject *args)
818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *result, *dflt = NULL;
820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *name;
821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "getattr", 2, 3, &v, &name, &dflt))
823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyUnicode_Check(name)) {
826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name = _PyUnicode_AsDefaultEncodedString(name, NULL);
827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (name == NULL)
828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyString_Check(name)) {
833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "getattr(): attribute name must be string");
835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = PyObject_GetAttr(v, name);
838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (result == NULL && dflt != NULL &&
839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_ExceptionMatches(PyExc_AttributeError))
840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {
841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Clear();
842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(dflt);
843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = dflt;
844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(getattr_doc,
849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"getattr(object, name[, default]) -> value\n\
850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen a default argument is given, it is returned when the attribute doesn't\n\
853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielexist; without it, an exception is raised in that case.");
854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_globals(PyObject *self)
858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *d;
860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    d = PyEval_GetGlobals();
862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(d);
863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return d;
864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(globals_doc,
867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"globals() -> dictionary\n\
868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the dictionary containing the current scope's global variables.");
870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hasattr(PyObject *self, PyObject *args)
874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *name;
877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "hasattr", 2, 2, &v, &name))
879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyUnicode_Check(name)) {
882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        name = _PyUnicode_AsDefaultEncodedString(name, NULL);
883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (name == NULL)
884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyString_Check(name)) {
889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "hasattr(): attribute name must be string");
891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = PyObject_GetAttr(v, name);
894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL) {
895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyErr_ExceptionMatches(PyExc_Exception))
896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(Py_False);
900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return Py_False;
901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(v);
904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(Py_True);
905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Py_True;
906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hasattr_doc,
909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hasattr(object, name) -> bool\n\
910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether the object has an attribute with the given name.\n\
912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel(This is done by calling getattr(object, name) and catching exceptions.)");
913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_id(PyObject *self, PyObject *v)
917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyLong_FromVoidPtr(v);
919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(id_doc,
922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"id(object) -> integer\n\
923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the identity of an object.  This is guaranteed to be unique among\n\
925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsimultaneously existing objects.  (Hint: it's the object's memory address.)");
926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_map(PyObject *self, PyObject *args)
930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    typedef struct {
932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *it;           /* the iterator object */
933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int saw_StopIteration;  /* bool:  did the iterator end? */
934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } sequence;
935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *func, *result;
937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    sequence *seqs = NULL, *sqp;
938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t n, len;
939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register int i, j;
940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = PyTuple_Size(args);
942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (n < 2) {
943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "map() requires at least two args");
945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    func = PyTuple_GetItem(args, 0);
949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n--;
950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (func == Py_None) {
952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_WarnPy3k("map(None, ...) not supported in 3.x; "
953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                           "use list(...)", 1) < 0)
954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (n == 1) {
956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* map(None, S) is the same as list(S). */
957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PySequence_List(PyTuple_GetItem(args, 1));
958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Get space for sequence descriptors.  Must NULL out the iterator
962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * pointers so that jumping to Fail_2 later doesn't see trash.
963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_NoMemory();
966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n; ++i) {
969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seqs[i].it = (PyObject*)NULL;
970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        seqs[i].saw_StopIteration = 0;
971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Do a first pass to obtain iterators for the arguments, and set len
974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * to the largest of their lengths.
975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    len = 0;
977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *curseq;
979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_ssize_t curlen;
980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Get iterator. */
982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        curseq = PyTuple_GetItem(args, i+1);
983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        sqp->it = PyObject_GetIter(curseq);
984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (sqp->it == NULL) {
985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            static char errmsg[] =
986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "argument %d to map() must support iteration";
987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            char errbuf[sizeof(errmsg) + 25];
988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2);
989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError, errbuf);
990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_2;
991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* Update len. */
994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        curlen = _PyObject_LengthHint(curseq, 8);
995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (curlen > len)
996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            len = curlen;
997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Get space for the result list. */
1000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((result = (PyObject *) PyList_New(len)) == NULL)
1001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_2;
1002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Iterate over the sequences until all have stopped. */
1004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; ; ++i) {
1005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *alist, *item=NULL, *value;
1006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int numactive = 0;
1007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == Py_None && n == 1)
1009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            alist = NULL;
1010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if ((alist = PyTuple_New(n)) == NULL)
1011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
1012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
1014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (sqp->saw_StopIteration) {
1015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_INCREF(Py_None);
1016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                item = Py_None;
1017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                item = PyIter_Next(sqp->it);
1020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (item)
1021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ++numactive;
1022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                else {
1023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (PyErr_Occurred()) {
1024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_XDECREF(alist);
1025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        goto Fail_1;
1026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
1027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_INCREF(Py_None);
1028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    item = Py_None;
1029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    sqp->saw_StopIteration = 1;
1030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
1031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (alist)
1033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyTuple_SET_ITEM(alist, j, item);
1034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!alist)
1039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            alist = item;
1040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (numactive == 0) {
1042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(alist);
1043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
1044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == Py_None)
1047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            value = alist;
1048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
1049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            value = PyEval_CallObject(func, alist);
1050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(alist);
1051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (value == NULL)
1052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
1053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i >= len) {
1055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int status = PyList_Append(result, value);
1056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(value);
1057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (status < 0)
1058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
1059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (PyList_SetItem(result, i, value) < 0)
1061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
1062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_1;
1066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    goto Succeed;
1068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1:
1070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(result);
1071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_2:
1072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    result = NULL;
1073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSucceed:
1074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(seqs);
1075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n; ++i)
1076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(seqs[i].it);
1077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyMem_DEL(seqs);
1078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
1079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(map_doc,
1082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"map(function, sequence[, sequence, ...]) -> list\n\
1083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list of the results of applying the function to the items of\n\
1085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe argument sequence(s).  If more than one sequence is given, the\n\
1086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfunction is called with an argument list consisting of the corresponding\n\
1087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielitem of each sequence, substituting None for missing values when not all\n\
1088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsequences have the same length.  If the function is None, return a list of\n\
1089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe items of the sequence (or a list of tuples if more than one sequence).");
1090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_next(PyObject *self, PyObject *args)
1094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *it, *res;
1096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *def = NULL;
1097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "next", 1, 2, &it, &def))
1099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyIter_Check(it)) {
1101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
1102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            "%.200s object is not an iterator",
1103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            it->ob_type->tp_name);
1104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = (*it->ob_type->tp_iternext)(it);
1108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (res != NULL) {
1109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return res;
1110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (def != NULL) {
1111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyErr_Occurred()) {
1112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_ExceptionMatches(PyExc_StopIteration))
1113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
1115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(def);
1117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return def;
1118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (PyErr_Occurred()) {
1119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
1121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetNone(PyExc_StopIteration);
1122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(next_doc,
1127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"next(iterator[, default])\n\
1128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the next item from the iterator. If default is given and the iterator\n\
1130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis exhausted, it is returned instead of raising StopIteration.");
1131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_setattr(PyObject *self, PyObject *args)
1135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
1137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *name;
1138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *value;
1139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "setattr", 3, 3, &v, &name, &value))
1141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_SetAttr(v, name, value) != 0)
1143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(Py_None);
1145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Py_None;
1146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(setattr_doc,
1149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"setattr(object, name, value)\n\
1150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSet a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``x.y = v''.");
1153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_delattr(PyObject *self, PyObject *args)
1157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
1159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *name;
1160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "delattr", 2, 2, &v, &name))
1162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
1164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(Py_None);
1166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return Py_None;
1167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(delattr_doc,
1170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"delattr(object, name)\n\
1171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDelete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``del x.y''.");
1174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hash(PyObject *self, PyObject *v)
1178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long x;
1180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    x = PyObject_Hash(v);
1182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (x == -1)
1183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyInt_FromLong(x);
1185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hash_doc,
1188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hash(object) -> integer\n\
1189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a hash value for the object.  Two objects with the same value have\n\
1191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe same hash value.  The reverse is not necessarily true, but likely.");
1192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_hex(PyObject *self, PyObject *v)
1196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyNumberMethods *nb;
1198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
1199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((nb = v->ob_type->tp_as_number) == NULL ||
1201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nb->nb_hex == NULL) {
1202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
1203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   "hex() argument can't be converted to hex");
1204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = (*nb->nb_hex)(v);
1207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (res && !PyString_Check(res)) {
1208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
1209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "__hex__ returned non-string (type %.200s)",
1210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     res->ob_type->tp_name);
1211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(res);
1212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
1215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(hex_doc,
1218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"hex(number) -> string\n\
1219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the hexadecimal representation of an integer or long integer.");
1221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *builtin_raw_input(PyObject *, PyObject *);
1224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_input(PyObject *self, PyObject *args)
1227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *line;
1229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    char *str;
1230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
1231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *globals, *locals;
1232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyCompilerFlags cf;
1233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    line = builtin_raw_input(self, args);
1235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (line == NULL)
1236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return line;
1237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
1238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (*str == ' ' || *str == '\t')
1240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    str++;
1241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    globals = PyEval_GetGlobals();
1242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    locals = PyEval_GetLocals();
1243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyDict_SetItemString(globals, "__builtins__",
1245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 PyEval_GetBuiltins()) != 0)
1246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    cf.cf_flags = 0;
1249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyEval_MergeCompilerFlags(&cf);
1250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
1251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(line);
1252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
1253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(input_doc,
1256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"input([prompt]) -> value\n\
1257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielEquivalent to eval(raw_input(prompt)).");
1259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_intern(PyObject *self, PyObject *args)
1263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *s;
1265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTuple(args, "S:intern", &s))
1266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyString_CheckExact(s)) {
1268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
1269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "can't intern subclass of string");
1270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(s);
1273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyString_InternInPlace(&s);
1274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return s;
1275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(intern_doc,
1278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"intern(string) -> string\n\
1279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel``Intern'' the given string.  This enters the string in the (global)\n\
1281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltable of interned strings whose purpose is to speed up dictionary lookups.\n\
1282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the string itself or the previously interned string object with the\n\
1283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsame value.");
1284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_iter(PyObject *self, PyObject *args)
1288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *w = NULL;
1290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w))
1292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (w == NULL)
1294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyObject_GetIter(v);
1295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyCallable_Check(v)) {
1296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
1297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "iter(v, w): v must be callable");
1298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyCallIter_New(v, w);
1301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(iter_doc,
1304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"iter(collection) -> iterator\n\
1305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieliter(callable, sentinel) -> iterator\n\
1306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielGet an iterator from an object.  In the first form, the argument must\n\
1308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsupply its own iterator, or be a sequence.\n\
1309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIn the second form, the callable is called until it returns the sentinel.");
1310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_len(PyObject *self, PyObject *v)
1314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t res;
1316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = PyObject_Size(v);
1318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (res < 0 && PyErr_Occurred())
1319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyInt_FromSsize_t(res);
1321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(len_doc,
1324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"len(object) -> integer\n\
1325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the number of items of a sequence or collection.");
1327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_locals(PyObject *self)
1331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *d;
1333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    d = PyEval_GetLocals();
1335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XINCREF(d);
1336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return d;
1337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(locals_doc,
1340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"locals() -> dictionary\n\
1341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUpdate and return a dictionary containing the current scope's local variables.");
1343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmin_max(PyObject *args, PyObject *kwds, int op)
1347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *it, *item, *val, *maxitem, *maxval, *keyfunc=NULL;
1349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const char *name = op == Py_LT ? "min" : "max";
1350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_Size(args) > 1)
1352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        v = args;
1353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (!PyArg_UnpackTuple(args, (char *)name, 1, 1, &v))
1354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds)) {
1357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        keyfunc = PyDict_GetItemString(kwds, "key");
1358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyDict_Size(kwds)!=1  ||  keyfunc == NULL) {
1359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_TypeError,
1360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "%s() got an unexpected keyword argument", name);
1361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(keyfunc);
1364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    it = PyObject_GetIter(v);
1367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (it == NULL) {
1368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(keyfunc);
1369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    maxitem = NULL; /* the result */
1373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    maxval = NULL;  /* the value associated with the result */
1374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    while (( item = PyIter_Next(it) )) {
1375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* get the value from the key function */
1376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (keyfunc != NULL) {
1377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            val = PyObject_CallFunctionObjArgs(keyfunc, item, NULL);
1378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (val == NULL)
1379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_it_item;
1380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* no key function; the value is the item */
1382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
1383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            val = item;
1384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(val);
1385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* maximum value and item are unset; set them */
1388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (maxval == NULL) {
1389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            maxitem = item;
1390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            maxval = val;
1391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* maximum value and item are set; update them as necessary */
1393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
1394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int cmp = PyObject_RichCompareBool(val, maxval, op);
1395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (cmp < 0)
1396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_it_item_and_val;
1397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else if (cmp > 0) {
1398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(maxval);
1399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(maxitem);
1400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                maxval = val;
1401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                maxitem = item;
1402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
1404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
1405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(val);
1406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_Occurred())
1410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_it;
1411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (maxval == NULL) {
1412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_ValueError,
1413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "%s() arg is an empty sequence", name);
1414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        assert(maxitem == NULL);
1415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(maxval);
1418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
1419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(keyfunc);
1420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return maxitem;
1421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it_item_and_val:
1423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(val);
1424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it_item:
1425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(item);
1426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_it:
1427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(maxval);
1428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(maxitem);
1429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(it);
1430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(keyfunc);
1431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_min(PyObject *self, PyObject *args, PyObject *kwds)
1436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return min_max(args, kwds, Py_LT);
1438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(min_doc,
1441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"min(iterable[, key=func]) -> value\n\
1442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmin(a, b, c, ...[, key=func]) -> value\n\
1443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a single iterable argument, return its smallest item.\n\
1445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two or more arguments, return the smallest argument.");
1446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_max(PyObject *self, PyObject *args, PyObject *kwds)
1450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return min_max(args, kwds, Py_GT);
1452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(max_doc,
1455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"max(iterable[, key=func]) -> value\n\
1456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielmax(a, b, c, ...[, key=func]) -> value\n\
1457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a single iterable argument, return its largest item.\n\
1459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two or more arguments, return the largest argument.");
1460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_oct(PyObject *self, PyObject *v)
1464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyNumberMethods *nb;
1466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *res;
1467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nb->nb_oct == NULL) {
1470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_TypeError,
1471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                   "oct() argument can't be converted to oct");
1472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    res = (*nb->nb_oct)(v);
1475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (res && !PyString_Check(res)) {
1476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
1477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "__oct__ returned non-string (type %.200s)",
1478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     res->ob_type->tp_name);
1479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(res);
1480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return res;
1483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(oct_doc,
1486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"oct(number) -> string\n\
1487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the octal representation of an integer or long integer.");
1489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_open(PyObject *self, PyObject *args, PyObject *kwds)
1493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyObject_Call((PyObject*)&PyFile_Type, args, kwds);
1495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(open_doc,
1498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"open(name[, mode[, buffering]]) -> file object\n\
1499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOpen a file using the file() type, returns a file object.  This is the\n\
1501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielpreferred way to open a file.  See file.__doc__ for further information.");
1502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_ord(PyObject *self, PyObject* obj)
1506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long ord;
1508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t size;
1509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyString_Check(obj)) {
1511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        size = PyString_GET_SIZE(obj);
1512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (size == 1) {
1513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PyInt_FromLong(ord);
1515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (PyByteArray_Check(obj)) {
1517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        size = PyByteArray_GET_SIZE(obj);
1518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (size == 1) {
1519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ord = (long)((unsigned char)*PyByteArray_AS_STRING(obj));
1520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PyInt_FromLong(ord);
1521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
1524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else if (PyUnicode_Check(obj)) {
1525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        size = PyUnicode_GET_SIZE(obj);
1526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (size == 1) {
1527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ord = (long)*PyUnicode_AS_UNICODE(obj);
1528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return PyInt_FromLong(ord);
1529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
1532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
1533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "ord() expected string of length 1, but " \
1534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "%.200s found", obj->ob_type->tp_name);
1535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_Format(PyExc_TypeError,
1539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "ord() expected a character, "
1540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 "but string of length %zd found",
1541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                 size);
1542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(ord_doc,
1546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"ord(c) -> integer\n\
1547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the integer ordinal of a one-character string.");
1549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_pow(PyObject *self, PyObject *args)
1553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v, *w, *z = Py_None;
1555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "pow", 2, 3, &v, &w, &z))
1557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyNumber_Power(v, w, z);
1559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(pow_doc,
1562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"pow(x, y[, z]) -> number\n\
1563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith two arguments, equivalent to x**y.  With three arguments,\n\
1565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielequivalent to (x**y) % z, but may be more efficient (e.g. for longs).");
1566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_print(PyObject *self, PyObject *args, PyObject *kwds)
1570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static char *kwlist[] = {"sep", "end", "file", 0};
1572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static PyObject *dummy_args = NULL;
1573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static PyObject *unicode_newline = NULL, *unicode_space = NULL;
1574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static PyObject *str_newline = NULL, *str_space = NULL;
1575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *newline, *space;
1576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *sep = NULL, *end = NULL, *file = NULL;
1577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int i, err, use_unicode = 0;
1578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (dummy_args == NULL) {
1580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!(dummy_args = PyTuple_New(0)))
1581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (str_newline == NULL) {
1584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        str_newline = PyString_FromString("\n");
1585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (str_newline == NULL)
1586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        str_space = PyString_FromString(" ");
1588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (str_space == NULL) {
1589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(str_newline);
1590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
1593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        unicode_newline = PyUnicode_FromString("\n");
1594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (unicode_newline == NULL) {
1595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(str_newline);
1596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(str_space);
1597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        unicode_space = PyUnicode_FromString(" ");
1600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (unicode_space == NULL) {
1601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(str_newline);
1602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(str_space);
1603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_CLEAR(unicode_space);
1604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
1607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTupleAndKeywords(dummy_args, kwds, "|OOO:print",
1609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                     kwlist, &sep, &end, &file))
1610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (file == NULL || file == Py_None) {
1612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        file = PySys_GetObject("stdout");
1613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* sys.stdout may be None when FILE* stdout isn't connected */
1614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (file == Py_None)
1615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_RETURN_NONE;
1616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (sep == Py_None) {
1618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        sep = NULL;
1619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (sep) {
1621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyUnicode_Check(sep)) {
1622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            use_unicode = 1;
1623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (!PyString_Check(sep)) {
1625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_TypeError,
1626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "sep must be None, str or unicode, not %.200s",
1627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         sep->ob_type->tp_name);
1628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (end == Py_None)
1632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        end = NULL;
1633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (end) {
1634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyUnicode_Check(end)) {
1635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            use_unicode = 1;
1636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (!PyString_Check(end)) {
1638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Format(PyExc_TypeError,
1639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         "end must be None, str or unicode, not %.200s",
1640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         end->ob_type->tp_name);
1641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!use_unicode) {
1646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (i = 0; i < PyTuple_Size(args); i++) {
1647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyUnicode_Check(PyTuple_GET_ITEM(args, i))) {
1648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                use_unicode = 1;
1649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                break;
1650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
1651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (use_unicode) {
1654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        newline = unicode_newline;
1655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        space = unicode_space;
1656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
1658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        newline = str_newline;
1659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        space = str_space;
1660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < PyTuple_Size(args); i++) {
1663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i > 0) {
1664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (sep == NULL)
1665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFile_WriteObject(space, file,
1666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                         Py_PRINT_RAW);
1667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else
1668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                err = PyFile_WriteObject(sep, file,
1669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                         Py_PRINT_RAW);
1670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (err)
1671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
1672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        err = PyFile_WriteObject(PyTuple_GetItem(args, i), file,
1674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                 Py_PRINT_RAW);
1675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (err)
1676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
1677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (end == NULL)
1680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        err = PyFile_WriteObject(newline, file, Py_PRINT_RAW);
1681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        err = PyFile_WriteObject(end, file, Py_PRINT_RAW);
1683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (err)
1684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_RETURN_NONE;
1687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(print_doc,
1690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"print(value, ..., sep=' ', end='\\n', file=sys.stdout)\n\
1691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
1692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPrints the values to a stream, or to sys.stdout by default.\n\
1693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOptional keyword arguments:\n\
1694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfile: a file-like object (stream); defaults to the current sys.stdout.\n\
1695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsep:  string inserted between values, default a space.\n\
1696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielend:  string appended after the last value, default a newline.");
1697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return number of items in range (lo, hi, step), when arguments are
1700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyInt or PyLong objects.  step > 0 required.  Return a value < 0 if
1701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * & only if the true value is too large to fit in a signed long.
1702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Arguments MUST return 1 with either PyInt_Check() or
1703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyLong_Check().  Return -1 when there is an error.
1704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
1705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long
1706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_len_of_range_longs(PyObject *lo, PyObject *hi, PyObject *step)
1707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* -------------------------------------------------------------
1709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Algorithm is equal to that of get_len_of_range(), but it operates
1710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    on PyObjects (which are assumed to be PyLong or PyInt objects).
1711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ---------------------------------------------------------------*/
1712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long n;
1713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *diff = NULL;
1714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *one = NULL;
1715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *tmp1 = NULL, *tmp2 = NULL, *tmp3 = NULL;
1716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* holds sub-expression evaluations */
1717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* if (lo >= hi), return length of 0. */
1719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_Compare(lo, hi) >= 0)
1720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return 0;
1721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((one = PyLong_FromLong(1L)) == NULL)
1723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL)
1726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((diff = PyNumber_Subtract(tmp1, one)) == NULL)
1729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL)
1732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((tmp3 = PyNumber_Add(tmp2, one)) == NULL)
1735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = PyLong_AsLong(tmp3);
1738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_Occurred()) {  /* Check for Overflow */
1739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Clear();
1740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(tmp3);
1744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(tmp2);
1745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(diff);
1746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(tmp1);
1747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(one);
1748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return n;
1749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  Fail:
1751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp3);
1752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp2);
1753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(diff);
1754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(tmp1);
1755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(one);
1756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return -1;
1757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper function for handle_range_longs.  If arg is int or long
1760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   object, returns it with incremented reference count.  If arg is
1761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   float, raises type error. As a last resort, creates a new int by
1762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   calling arg type's nb_int method if it is defined.  Returns NULL
1763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   and sets exception on error.
1764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel   Returns a new reference to an int object. */
1766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_range_long_argument(PyObject *arg, const char *name)
1768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
1770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyNumberMethods *nb;
1771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyInt_Check(arg) || PyLong_Check(arg)) {
1772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(arg);
1773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return arg;
1774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFloat_Check(arg) ||
1776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        (nb = Py_TYPE(arg)->tp_as_number) == NULL ||
1777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        nb->nb_int == NULL) {
1778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_Format(PyExc_TypeError,
1779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     "range() integer %s argument expected, got %s.",
1780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                     name, arg->ob_type->tp_name);
1781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = nb->nb_int(arg);
1784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL)
1785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyInt_Check(v) || PyLong_Check(v))
1787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return v;
1788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(v);
1789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyErr_SetString(PyExc_TypeError,
1790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "__int__ should return int object");
1791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* An extension of builtin_range() that handles the case when PyLong
1795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * arguments are given. */
1796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielhandle_range_longs(PyObject *self, PyObject *args)
1798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *ilow = NULL;
1800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *ihigh = NULL;
1801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *istep = NULL;
1802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *low = NULL;
1804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *high = NULL;
1805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *step = NULL;
1806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *curnum = NULL;
1808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v = NULL;
1809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long bign;
1810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t i, n;
1811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int cmp_result;
1812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *zero = PyLong_FromLong(0);
1814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (zero == NULL)
1816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "range", 1, 3, &ilow, &ihigh, &istep)) {
1819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(zero);
1820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Figure out which way we were called, supply defaults, and be
1824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * sure to incref everything so that the decrefs at the end
1825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * are correct. NB: ilow, ihigh and istep are borrowed references.
1826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
1827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(ilow != NULL);
1828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (ihigh == NULL) {
1829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* only 1 arg -- it's the upper limit */
1830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ihigh = ilow;
1831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ilow = NULL;
1832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* convert ihigh if necessary */
1835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(ihigh != NULL);
1836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    high = get_range_long_argument(ihigh, "end");
1837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (high == NULL)
1838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* ihigh correct now; do ilow */
1841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (ilow == NULL) {
1842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(zero);
1843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        low = zero;
1844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
1846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        low = get_range_long_argument(ilow, "start");
1847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (low == NULL)
1848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail;
1849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* ilow and ihigh correct now; do istep */
1852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (istep == NULL)
1853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        step = PyLong_FromLong(1);
1854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        step = get_range_long_argument(istep, "step");
1856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (step == NULL)
1857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyObject_Cmp(step, zero, &cmp_result) == -1)
1860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (cmp_result == 0) {
1863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_ValueError,
1864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "range() step argument must not be zero");
1865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (cmp_result > 0)
1869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        bign = get_len_of_range_longs(low, high, step);
1870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
1871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *neg_step = PyNumber_Negative(step);
1872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (neg_step == NULL)
1873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail;
1874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        bign = get_len_of_range_longs(high, low, neg_step);
1875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(neg_step);
1876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = (Py_ssize_t)bign;
1879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (bign < 0 || (long)n != bign) {
1880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_OverflowError,
1881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "range() result has too many items");
1882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = PyList_New(n);
1886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL)
1887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail;
1888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    curnum = low;
1890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_INCREF(curnum);
1891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n; i++) {
1893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *w = PyNumber_Long(curnum);
1894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *tmp_num;
1895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (w == NULL)
1896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail;
1897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyList_SET_ITEM(v, i, w);
1899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        tmp_num = PyNumber_Add(curnum, step);
1901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tmp_num == NULL)
1902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail;
1903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(curnum);
1905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        curnum = tmp_num;
1906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(low);
1908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(high);
1909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(step);
1910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(zero);
1911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(curnum);
1912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return v;
1913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel  Fail:
1915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(low);
1916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(high);
1917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(step);
1918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(zero);
1919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(curnum);
1920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(v);
1921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
1922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Return number of items in range/xrange (lo, hi, step).  step > 0
1925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * required.  Return a value < 0 if & only if the true value is too
1926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * large to fit in a signed long.
1927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */
1928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic long
1929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielget_len_of_range(long lo, long hi, long step)
1930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* -------------------------------------------------------------
1932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    If lo >= hi, the range is empty.
1933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Else if n values are in the range, the last one is
1934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    lo + (n-1)*step, which must be <= hi-1.  Rearranging,
1935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    the proper value.  Since lo < hi in this case, hi-lo-1 >= 0, so
1937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    the RHS is non-negative and so truncation is the same as the
1938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    floor.  Letting M be the largest positive long, the worst case
1939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for the RHS numerator is hi=M, lo=-M-1, and then
1940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    hi-lo-1 = M-(-M-1)-1 = 2*M.  Therefore unsigned long has enough
1941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    precision to compute the RHS exactly.
1942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ---------------------------------------------------------------*/
1943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long n = 0;
1944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (lo < hi) {
1945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        unsigned long uhi = (unsigned long)hi;
1946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        unsigned long ulo = (unsigned long)lo;
1947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        unsigned long diff = uhi - ulo - 1;
1948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        n = (long)(diff / (unsigned long)step + 1);
1949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return n;
1951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
1952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
1954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_range(PyObject *self, PyObject *args)
1955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
1956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long ilow = 0, ihigh = 0, istep = 1;
1957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    long bign;
1958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t i, n;
1959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v;
1961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
1962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyTuple_Size(args) <= 1) {
1963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyArg_ParseTuple(args,
1964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "l;range() requires 1-3 int arguments",
1965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        &ihigh)) {
1966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
1967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return handle_range_longs(self, args);
1968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
1971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!PyArg_ParseTuple(args,
1972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "ll|l;range() requires 1-3 int arguments",
1973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        &ilow, &ihigh, &istep)) {
1974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_Clear();
1975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return handle_range_longs(self, args);
1976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
1977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (istep == 0) {
1979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_ValueError,
1980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "range() step argument must not be zero");
1981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (istep > 0)
1984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        bign = get_len_of_range(ilow, ihigh, istep);
1985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
1986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        bign = get_len_of_range(ihigh, ilow, -istep);
1987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    n = (Py_ssize_t)bign;
1988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (bign < 0 || (long)n != bign) {
1989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_OverflowError,
1990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        "range() result has too many items");
1991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
1993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = PyList_New(n);
1994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL)
1995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
1996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < n; i++) {
1997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *w = PyInt_FromLong(ilow);
1998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (w == NULL) {
1999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(v);
2000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyList_SET_ITEM(v, i, w);
2003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ilow += istep;
2004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return v;
2006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(range_doc,
2009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"range(stop) -> list of integers\n\
2010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielrange(start, stop[, step]) -> list of integers\n\
2011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list containing an arithmetic progression of integers.\n\
2013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielrange(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
2014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen step is given, it specifies the increment (or decrement).\n\
2015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor example, range(4) returns [0, 1, 2, 3].  The end point is omitted!\n\
2016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThese are exactly the valid indices for a list of 4 elements.");
2017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_raw_input(PyObject *self, PyObject *args)
2021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v = NULL;
2023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *fin = PySys_GetObject("stdin");
2024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *fout = PySys_GetObject("stdout");
2025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v))
2027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (fin == NULL) {
2030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdin");
2031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (fout == NULL) {
2034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdout");
2035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFile_SoftSpace(fout, 0)) {
2038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyFile_WriteString(" ", fout) != 0)
2039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFile_AsFile(fin) && PyFile_AsFile(fout)
2042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        && isatty(fileno(PyFile_AsFile(fin)))
2043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        && isatty(fileno(PyFile_AsFile(fout)))) {
2044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *po;
2045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *prompt;
2046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        char *s;
2047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *result;
2048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (v != NULL) {
2049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            po = PyObject_Str(v);
2050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (po == NULL)
2051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            prompt = PyString_AsString(po);
2053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (prompt == NULL)
2054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            po = NULL;
2058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            prompt = "";
2059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout),
2061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                          prompt);
2062c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(po);
2063c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (s == NULL) {
2064c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_Occurred())
2065c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetNone(PyExc_KeyboardInterrupt);
2066c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2067c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2068c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (*s == '\0') {
2069c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetNone(PyExc_EOFError);
2070c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = NULL;
2071c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2072c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else { /* strip trailing '\n' */
2073c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            size_t len = strlen(s);
2074c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (len > PY_SSIZE_T_MAX) {
2075c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_OverflowError,
2076c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "[raw_]input: input too long");
2077c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                result = NULL;
2078c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2079c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
2080c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                result = PyString_FromStringAndSize(s, len-1);
2081c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2082c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2083c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyMem_FREE(s);
2084c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return result;
2085c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2086c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v != NULL) {
2087c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0)
2088c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2089c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2090c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyFile_GetLine(fin, -1);
2091c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2092c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2093c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(raw_input_doc,
2094c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"raw_input([prompt]) -> string\n\
2095c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2096c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRead a string from standard input.  The trailing newline is stripped.\n\
2097c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielIf the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
2098c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielOn Unix, GNU readline is used if enabled.  The prompt string, if given,\n\
2099c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis printed without a trailing newline before reading.");
2100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_reduce(PyObject *self, PyObject *args)
2104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static PyObject *functools_reduce = NULL;
2106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnPy3k("reduce() not supported in 3.x; "
2108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       "use functools.reduce()", 1) < 0)
2109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (functools_reduce == NULL) {
2112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *functools = PyImport_ImportModule("functools");
2113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (functools == NULL)
2114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        functools_reduce = PyObject_GetAttrString(functools, "reduce");
2116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(functools);
2117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (functools_reduce == NULL)
2118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyObject_Call(functools_reduce, args, NULL);
2121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(reduce_doc,
2124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"reduce(function, sequence[, initial]) -> value\n\
2125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielApply a function of two arguments cumulatively to the items of a sequence,\n\
2127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfrom left to right, so as to reduce the sequence to a single value.\n\
2128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
2129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel((((1+2)+3)+4)+5).  If initial is present, it is placed before the items\n\
2130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielof the sequence in the calculation, and serves as a default when the\n\
2131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielsequence is empty.");
2132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_reload(PyObject *self, PyObject *v)
2136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyErr_WarnPy3k("In 3.x, reload() is renamed to imp.reload()",
2138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       1) < 0)
2139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyImport_ReloadModule(v);
2142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(reload_doc,
2145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"reload(module) -> module\n\
2146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReload the module.  The module must have been successfully imported before.");
2148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_repr(PyObject *self, PyObject *v)
2152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyObject_Repr(v);
2154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(repr_doc,
2157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"repr(object) -> string\n\
2158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the canonical string representation of the object.\n\
2160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFor most object types, eval(repr(object)) == object.");
2161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_round(PyObject *self, PyObject *args, PyObject *kwds)
2165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    double x;
2167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *o_ndigits = NULL;
2168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t ndigits;
2169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static char *kwlist[] = {"number", "ndigits", 0};
2170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTupleAndKeywords(args, kwds, "d|O:round",
2172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwlist, &x, &o_ndigits))
2173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (o_ndigits == NULL) {
2176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* second argument defaults to 0 */
2177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ndigits = 0;
2178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* interpret 2nd argument as a Py_ssize_t; clip on overflow */
2181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ndigits = PyNumber_AsSsize_t(o_ndigits, NULL);
2182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ndigits == -1 && PyErr_Occurred())
2183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* nans, infinities and zeros round to themselves */
2187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!Py_IS_FINITE(x) || x == 0.0)
2188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyFloat_FromDouble(x);
2189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Deal with extreme values for ndigits. For ndigits > NDIGITS_MAX, x
2191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       always rounds to itself.  For ndigits < NDIGITS_MIN, x always
2192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       rounds to +-0.0.  Here 0.30103 is an upper bound for log10(2). */
2193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NDIGITS_MAX ((int)((DBL_MANT_DIG-DBL_MIN_EXP) * 0.30103))
2194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NDIGITS_MIN (-(int)((DBL_MAX_EXP + 1) * 0.30103))
2195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (ndigits > NDIGITS_MAX)
2196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* return x */
2197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyFloat_FromDouble(x);
2198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else if (ndigits < NDIGITS_MIN)
2199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* return 0.0, but with sign of x */
2200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyFloat_FromDouble(0.0*x);
2201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else
2202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* finite x, and ndigits is not unreasonably large */
2203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* _Py_double_round is defined in floatobject.c */
2204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return _Py_double_round(x, (int)ndigits);
2205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef NDIGITS_MAX
2206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef NDIGITS_MIN
2207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(round_doc,
2210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"round(number[, ndigits]) -> floating point number\n\
2211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielRound a number to a given precision in decimal digits (default 0 digits).\n\
2213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThis always returns a floating point number.  Precision may be negative.");
2214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
2217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *newlist, *v, *seq, *compare=NULL, *keyfunc=NULL, *newargs;
2219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *callable;
2220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    static char *kwlist[] = {"iterable", "cmp", "key", "reverse", 0};
2221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int reverse;
2222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* args 1-4 should match listsort in Objects/listobject.c */
2224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OOi:sorted",
2225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        kwlist, &seq, &compare, &keyfunc, &reverse))
2226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    newlist = PySequence_List(seq);
2229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (newlist == NULL)
2230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    callable = PyObject_GetAttrString(newlist, "sort");
2233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (callable == NULL) {
2234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(newlist);
2235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    newargs = PyTuple_GetSlice(args, 1, 4);
2239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (newargs == NULL) {
2240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(newlist);
2241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(callable);
2242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    v = PyObject_Call(callable, newargs, kwds);
2246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(newargs);
2247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(callable);
2248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL) {
2249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(newlist);
2250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(v);
2253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return newlist;
2254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(sorted_doc,
2257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list");
2258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_vars(PyObject *self, PyObject *args)
2261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *v = NULL;
2263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *d;
2264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v))
2266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (v == NULL) {
2268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = PyEval_GetLocals();
2269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (d == NULL) {
2270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyErr_Occurred())
2271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_SystemError,
2272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                "vars(): no locals!?");
2273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
2275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(d);
2276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    else {
2278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        d = PyObject_GetAttrString(v, "__dict__");
2279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (d == NULL) {
2280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
2281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "vars() argument must have __dict__ attribute");
2282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return d;
2286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(vars_doc,
2289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"vars([object]) -> dictionary\n\
2290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWithout arguments, equivalent to locals().\n\
2292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith an argument, equivalent to object.__dict__.");
2293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject*
2296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_sum(PyObject *self, PyObject *args)
2297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *seq;
2299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result = NULL;
2300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *temp, *item, *iter;
2301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "sum", 1, 2, &seq, &result))
2303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    iter = PyObject_GetIter(seq);
2306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (iter == NULL)
2307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (result == NULL) {
2310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = PyInt_FromLong(0);
2311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (result == NULL) {
2312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(iter);
2313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    } else {
2316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* reject string values for 'start' parameter */
2317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyObject_TypeCheck(result, &PyBaseString_Type)) {
2318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError,
2319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "sum() can't sum strings [use ''.join(seq) instead]");
2320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(iter);
2321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_INCREF(result);
2324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef SLOW_SUM
2327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Fast addition by keeping temporary sums in C instead of new Python objects.
2328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       Assumes all inputs are the same type.  If the assumption fails, default
2329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       to the more general routine.
2330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    */
2331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyInt_CheckExact(result)) {
2332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        long i_result = PyInt_AS_LONG(result);
2333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(result);
2334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = NULL;
2335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        while(result == NULL) {
2336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            item = PyIter_Next(iter);
2337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (item == NULL) {
2338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(iter);
2339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_Occurred())
2340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyInt_FromLong(i_result);
2342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(item)) {
2344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                long b = PyInt_AS_LONG(item);
2345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                long x = i_result + b;
2346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((x^i_result) >= 0 || (x^b) >= 0) {
2347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    i_result = x;
2348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(item);
2349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    continue;
2350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* Either overflowed or is not an int. Restore real objects and process normally */
2353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = PyInt_FromLong(i_result);
2354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            temp = PyNumber_Add(result, item);
2355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(result);
2356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(item);
2357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = temp;
2358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (result == NULL) {
2359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(iter);
2360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyFloat_CheckExact(result)) {
2366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        double f_result = PyFloat_AS_DOUBLE(result);
2367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(result);
2368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = NULL;
2369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        while(result == NULL) {
2370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            item = PyIter_Next(iter);
2371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (item == NULL) {
2372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(iter);
2373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_Occurred())
2374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
2375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return PyFloat_FromDouble(f_result);
2376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyFloat_CheckExact(item)) {
2378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0)
2379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                f_result += PyFloat_AS_DOUBLE(item);
2380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyFPE_END_PROTECT(f_result)
2381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyInt_CheckExact(item)) {
2385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyFPE_START_PROTECT("add", Py_DECREF(item); Py_DECREF(iter); return 0)
2386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                f_result += (double)PyInt_AS_LONG(item);
2387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyFPE_END_PROTECT(f_result)
2388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                continue;
2390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = PyFloat_FromDouble(f_result);
2392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            temp = PyNumber_Add(result, item);
2393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(result);
2394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(item);
2395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            result = temp;
2396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (result == NULL) {
2397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(iter);
2398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for(;;) {
2405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = PyIter_Next(iter);
2406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL) {
2407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            /* error, or end-of-sequence */
2408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_Occurred()) {
2409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(result);
2410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                result = NULL;
2411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* It's tempting to use PyNumber_InPlaceAdd instead of
2415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           PyNumber_Add here, to avoid quadratic running time
2416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           when doing 'sum(list_of_lists, [])'.  However, this
2417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           would produce a change in behaviour: a snippet like
2418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             empty = []
2420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel             sum([[x] for x in range(10)], empty)
2421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel           would change the value of empty. */
2423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        temp = PyNumber_Add(result, item);
2424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(result);
2425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(item);
2426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        result = temp;
2427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (result == NULL)
2428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(iter);
2431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
2432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(sum_doc,
2435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"sum(sequence[, start]) -> value\n\
2436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn the sum of a sequence of numbers (NOT strings) plus the value\n\
2438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielof parameter 'start' (which defaults to 0).  When the sequence is\n\
2439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielempty, return start.");
2440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_isinstance(PyObject *self, PyObject *args)
2444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *inst;
2446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *cls;
2447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int retval;
2448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "isinstance", 2, 2, &inst, &cls))
2450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    retval = PyObject_IsInstance(inst, cls);
2453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (retval < 0)
2454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyBool_FromLong(retval);
2456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(isinstance_doc,
2459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"isinstance(object, class-or-type-or-tuple) -> bool\n\
2460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether an object is an instance of a class or of a subclass thereof.\n\
2462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWith a type as second argument, return whether that is the object's type.\n\
2463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielThe form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
2464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielisinstance(x, A) or isinstance(x, B) or ... (etc.).");
2465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_issubclass(PyObject *self, PyObject *args)
2469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *derived;
2471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *cls;
2472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    int retval;
2473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (!PyArg_UnpackTuple(args, "issubclass", 2, 2, &derived, &cls))
2475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    retval = PyObject_IsSubclass(derived, cls);
2478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (retval < 0)
2479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return PyBool_FromLong(retval);
2481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(issubclass_doc,
2484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"issubclass(C, B) -> bool\n\
2485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn whether class C is a subclass (i.e., a derived class) of class B.\n\
2487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielWhen using a tuple as the second argument issubclass(X, (A, B, ...)),\n\
2488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielis a shortcut for issubclass(X, A) or issubclass(X, B) or ... (etc.).");
2489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject*
2492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielbuiltin_zip(PyObject *self, PyObject *args)
2493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *ret;
2495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    const Py_ssize_t itemsize = PySequence_Length(args);
2496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t i;
2497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *itlist;  /* tuple of iterators */
2498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t len;        /* guess at result length */
2499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (itemsize == 0)
2501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return PyList_New(0);
2502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* args must be a tuple */
2504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    assert(PyTuple_Check(args));
2505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* Guess at result length:  the shortest of the input lengths.
2507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       If some argument refuses to say, we refuse to guess too, lest
2508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel       an argument like xrange(sys.maxint) lead us astray.*/
2509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    len = -1;           /* unknown */
2510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < itemsize; ++i) {
2511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item = PyTuple_GET_ITEM(args, i);
2512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_ssize_t thislen = _PyObject_LengthHint(item, -2);
2513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (thislen < 0) {
2514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (thislen == -1)
2515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                return NULL;
2516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            len = -1;
2517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            break;
2518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else if (len < 0 || thislen < len)
2520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            len = thislen;
2521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* allocate result list */
2524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (len < 0)
2525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        len = 10;               /* arbitrary */
2526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((ret = PyList_New(len)) == NULL)
2527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* obtain iterators */
2530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    itlist = PyTuple_New(itemsize);
2531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (itlist == NULL)
2532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        goto Fail_ret;
2533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; i < itemsize; ++i) {
2534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item = PyTuple_GET_ITEM(args, i);
2535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *it = PyObject_GetIter(item);
2536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (it == NULL) {
2537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyErr_ExceptionMatches(PyExc_TypeError))
2538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_Format(PyExc_TypeError,
2539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    "zip argument #%zd must support iteration",
2540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    i+1);
2541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_ret_itlist;
2542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyTuple_SET_ITEM(itlist, i, it);
2544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* build result into ret list */
2547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = 0; ; ++i) {
2548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int j;
2549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *next = PyTuple_New(itemsize);
2550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (!next)
2551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_ret_itlist;
2552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        for (j = 0; j < itemsize; j++) {
2554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *it = PyTuple_GET_ITEM(itlist, j);
2555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *item = PyIter_Next(it);
2556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!item) {
2557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (PyErr_Occurred()) {
2558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(ret);
2559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ret = NULL;
2560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(next);
2562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(itlist);
2563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Done;
2564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyTuple_SET_ITEM(next, j, item);
2566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (i < len)
2569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyList_SET_ITEM(ret, i, next);
2570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            int status = PyList_Append(ret, next);
2572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(next);
2573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ++len;
2574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (status < 0)
2575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_ret_itlist;
2576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielDone:
2580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (ret != NULL && i < len) {
2581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* The list is too big. */
2582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyList_SetSlice(ret, i, len, NULL) < 0)
2583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return NULL;
2584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return ret;
2586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_ret_itlist:
2588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(itlist);
2589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_ret:
2590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(ret);
2591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(zip_doc,
2596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielReturn a list of tuples, where each tuple contains the i-th element\n\
2599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfrom each of the argument sequences.  The returned list is truncated\n\
2600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin length to the length of the shortest argument sequence.");
2601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyMethodDef builtin_methods[] = {
2604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"__import__",      (PyCFunction)builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc},
2605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"abs",             builtin_abs,        METH_O, abs_doc},
2606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"all",             builtin_all,        METH_O, all_doc},
2607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"any",             builtin_any,        METH_O, any_doc},
2608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"apply",           builtin_apply,      METH_VARARGS, apply_doc},
2609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"bin",             builtin_bin,        METH_O, bin_doc},
2610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"callable",        builtin_callable,   METH_O, callable_doc},
2611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"chr",             builtin_chr,        METH_VARARGS, chr_doc},
2612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"cmp",             builtin_cmp,        METH_VARARGS, cmp_doc},
2613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"coerce",          builtin_coerce,     METH_VARARGS, coerce_doc},
2614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"compile",         (PyCFunction)builtin_compile,    METH_VARARGS | METH_KEYWORDS, compile_doc},
2615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"delattr",         builtin_delattr,    METH_VARARGS, delattr_doc},
2616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"dir",             builtin_dir,        METH_VARARGS, dir_doc},
2617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"divmod",          builtin_divmod,     METH_VARARGS, divmod_doc},
2618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"eval",            builtin_eval,       METH_VARARGS, eval_doc},
2619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"execfile",        builtin_execfile,   METH_VARARGS, execfile_doc},
2620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"filter",          builtin_filter,     METH_VARARGS, filter_doc},
2621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"format",          builtin_format,     METH_VARARGS, format_doc},
2622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"getattr",         builtin_getattr,    METH_VARARGS, getattr_doc},
2623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"globals",         (PyCFunction)builtin_globals,    METH_NOARGS, globals_doc},
2624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"hasattr",         builtin_hasattr,    METH_VARARGS, hasattr_doc},
2625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"hash",            builtin_hash,       METH_O, hash_doc},
2626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"hex",             builtin_hex,        METH_O, hex_doc},
2627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"id",              builtin_id,         METH_O, id_doc},
2628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"input",           builtin_input,      METH_VARARGS, input_doc},
2629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"intern",          builtin_intern,     METH_VARARGS, intern_doc},
2630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"isinstance",  builtin_isinstance, METH_VARARGS, isinstance_doc},
2631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"issubclass",  builtin_issubclass, METH_VARARGS, issubclass_doc},
2632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"iter",            builtin_iter,       METH_VARARGS, iter_doc},
2633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"len",             builtin_len,        METH_O, len_doc},
2634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"locals",          (PyCFunction)builtin_locals,     METH_NOARGS, locals_doc},
2635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"map",             builtin_map,        METH_VARARGS, map_doc},
2636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"max",             (PyCFunction)builtin_max,        METH_VARARGS | METH_KEYWORDS, max_doc},
2637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"min",             (PyCFunction)builtin_min,        METH_VARARGS | METH_KEYWORDS, min_doc},
2638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"next",            builtin_next,       METH_VARARGS, next_doc},
2639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"oct",             builtin_oct,        METH_O, oct_doc},
2640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"open",            (PyCFunction)builtin_open,       METH_VARARGS | METH_KEYWORDS, open_doc},
2641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"ord",             builtin_ord,        METH_O, ord_doc},
2642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"pow",             builtin_pow,        METH_VARARGS, pow_doc},
2643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"print",           (PyCFunction)builtin_print,      METH_VARARGS | METH_KEYWORDS, print_doc},
2644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"range",           builtin_range,      METH_VARARGS, range_doc},
2645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"raw_input",       builtin_raw_input,  METH_VARARGS, raw_input_doc},
2646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"reduce",          builtin_reduce,     METH_VARARGS, reduce_doc},
2647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"reload",          builtin_reload,     METH_O, reload_doc},
2648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"repr",            builtin_repr,       METH_O, repr_doc},
2649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"round",           (PyCFunction)builtin_round,      METH_VARARGS | METH_KEYWORDS, round_doc},
2650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"setattr",         builtin_setattr,    METH_VARARGS, setattr_doc},
2651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"sorted",          (PyCFunction)builtin_sorted,     METH_VARARGS | METH_KEYWORDS, sorted_doc},
2652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"sum",             builtin_sum,        METH_VARARGS, sum_doc},
2653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
2654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"unichr",          builtin_unichr,     METH_VARARGS, unichr_doc},
2655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"vars",            builtin_vars,       METH_VARARGS, vars_doc},
2657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {"zip",         builtin_zip,        METH_VARARGS, zip_doc},
2658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    {NULL,              NULL},
2659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel};
2660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyDoc_STRVAR(builtin_doc,
2662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel"Built-in functions, exceptions, and other objects.\n\
2663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel\n\
2664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.");
2665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPyObject *
2667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel_PyBuiltin_Init(void)
2668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *mod, *dict, *debug;
2670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    mod = Py_InitModule4("__builtin__", builtin_methods,
2671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         builtin_doc, (PyObject *)NULL,
2672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                         PYTHON_API_VERSION);
2673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (mod == NULL)
2674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    dict = PyModule_GetDict(mod);
2676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_TRACE_REFS
2678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    /* __builtin__ exposes a number of statically allocated objects
2679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * that, before this code was added in 2.3, never showed up in
2680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * the list of "all objects" maintained by Py_TRACE_REFS.  As a
2681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * result, programs leaking references to None and False (etc)
2682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     * couldn't be diagnosed by examining sys.getobjects(0).
2683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel     */
2684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define ADD_TO_ALL(OBJECT) _Py_AddToAllObjects((PyObject *)(OBJECT), 0)
2685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else
2686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define ADD_TO_ALL(OBJECT) (void)0
2687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define SETBUILTIN(NAME, OBJECT) \
2690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0)       \
2691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;                                                    \
2692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    ADD_TO_ALL(OBJECT)
2693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("None",                  Py_None);
2695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("Ellipsis",              Py_Ellipsis);
2696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("NotImplemented",        Py_NotImplemented);
2697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("False",                 Py_False);
2698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("True",                  Py_True);
2699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("basestring",            &PyBaseString_Type);
2700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("bool",                  &PyBool_Type);
2701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("memoryview",        &PyMemoryView_Type);
2702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("bytearray",             &PyByteArray_Type);
2703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("bytes",                 &PyString_Type);
2704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("buffer",                &PyBuffer_Type);
2705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("classmethod",           &PyClassMethod_Type);
2706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef WITHOUT_COMPLEX
2707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("complex",               &PyComplex_Type);
2708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("dict",                  &PyDict_Type);
2710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("enumerate",             &PyEnum_Type);
2711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("file",                  &PyFile_Type);
2712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("float",                 &PyFloat_Type);
2713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("frozenset",             &PyFrozenSet_Type);
2714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("property",              &PyProperty_Type);
2715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("int",                   &PyInt_Type);
2716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("list",                  &PyList_Type);
2717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("long",                  &PyLong_Type);
2718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("object",                &PyBaseObject_Type);
2719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("reversed",              &PyReversed_Type);
2720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("set",                   &PySet_Type);
2721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("slice",                 &PySlice_Type);
2722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("staticmethod",          &PyStaticMethod_Type);
2723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("str",                   &PyString_Type);
2724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("super",                 &PySuper_Type);
2725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("tuple",                 &PyTuple_Type);
2726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("type",                  &PyType_Type);
2727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("xrange",                &PyRange_Type);
2728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
2729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    SETBUILTIN("unicode",               &PyUnicode_Type);
2730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
2731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    debug = PyBool_FromLong(Py_OptimizeFlag == 0);
2732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_XDECREF(debug);
2734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_XDECREF(debug);
2737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return mod;
2739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef ADD_TO_ALL
2740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef SETBUILTIN
2741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a tuple through a function */
2744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfiltertuple(PyObject *func, PyObject *tuple)
2747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result;
2749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t i, j;
2750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t len = PyTuple_Size(tuple);
2751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (len == 0) {
2753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyTuple_CheckExact(tuple))
2754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(tuple);
2755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else
2756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tuple = PyTuple_New(0);
2757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return tuple;
2758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((result = PyTuple_New(len)) == NULL)
2761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = j = 0; i < len; ++i) {
2764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item, *good;
2765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int ok;
2766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (tuple->ob_type->tp_as_sequence &&
2768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            tuple->ob_type->tp_as_sequence->sq_item) {
2769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            item = tuple->ob_type->tp_as_sequence->sq_item(tuple, i);
2770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (item == NULL)
2771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
2773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyErr_SetString(PyExc_TypeError, "filter(): unsubscriptable tuple");
2774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
2775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == Py_None) {
2777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(item);
2778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            good = item;
2779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *arg = PyTuple_Pack(1, item);
2782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (arg == NULL) {
2783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            good = PyEval_CallObject(func, arg);
2787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(arg);
2788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (good == NULL) {
2789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        ok = PyObject_IsTrue(good);
2794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(good);
2795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok > 0) {
2796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (PyTuple_SetItem(result, j++, item) < 0)
2797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        else {
2800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(item);
2801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (ok < 0)
2802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (_PyTuple_Resize(&result, j) < 0)
2807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
2810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1:
2812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(result);
2813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a string through a function */
2818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfilterstring(PyObject *func, PyObject *strobj)
2821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result;
2823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t i, j;
2824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t len = PyString_Size(strobj);
2825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t outlen = len;
2826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (func == Py_None) {
2828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* If it's a real string we can return the original,
2829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * as no character is ever false and __getitem__
2830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * does return this character. If it's a subclass
2831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * we must go through the __getitem__ loop */
2832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyString_CheckExact(strobj)) {
2833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(strobj);
2834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return strobj;
2835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
2838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = j = 0; i < len; ++i) {
2841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item;
2842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int ok;
2843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL)
2846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
2847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func==Py_None) {
2848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = 1;
2849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
2850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            PyObject *arg, *good;
2851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg = PyTuple_Pack(1, item);
2852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (arg == NULL) {
2853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            good = PyEval_CallObject(func, arg);
2857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(arg);
2858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (good == NULL) {
2859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = PyObject_IsTrue(good);
2863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(good);
2864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok > 0) {
2866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_ssize_t reslen;
2867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyString_Check(item)) {
2868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_TypeError, "can't filter str to str:"
2869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    " __getitem__ returned different type");
2870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            reslen = PyString_GET_SIZE(item);
2874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (reslen == 1) {
2875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyString_AS_STRING(result)[j++] =
2876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyString_AS_STRING(item)[0];
2877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            } else {
2878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* do we need more space? */
2879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_ssize_t need = j;
2880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* calculate space requirements while checking for overflow */
2882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need > PY_SSIZE_T_MAX - reslen) {
2883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(item);
2884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto Fail_1;
2885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                need += reslen;
2888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need > PY_SSIZE_T_MAX - len) {
2890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(item);
2891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto Fail_1;
2892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                need += len;
2895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need <= i) {
2897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(item);
2898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    goto Fail_1;
2899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
2900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                need = need - i - 1;
2902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(need >= 0);
2904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(outlen >= 0);
2905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need > outlen) {
2907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* overallocate, to avoid reallocations */
2908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (outlen > PY_SSIZE_T_MAX / 2) {
2909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        Py_DECREF(item);
2910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        return NULL;
2911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (need<2*outlen) {
2914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        need = 2*outlen;
2915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      }
2916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    if (_PyString_Resize(&result, need)) {
2917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            Py_DECREF(item);
2918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            return NULL;
2919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    }
2920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    outlen = need;
2921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            }
2922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            memcpy(
2923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    PyString_AS_STRING(result) + j,
2924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    PyString_AS_STRING(item),
2925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    reslen
2926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            );
2927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            j += reslen;
2928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
2929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(item);
2931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok < 0)
2932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
2933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (j < outlen)
2936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        _PyString_Resize(&result, j);
2937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
2939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1:
2941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(result);
2942c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
2943c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
2944c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2945c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_USING_UNICODE
2946c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Helper for filter(): filter a Unicode object through a function */
2947c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2948c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielstatic PyObject *
2949c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielfilterunicode(PyObject *func, PyObject *strobj)
2950c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel{
2951c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    PyObject *result;
2952c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    register Py_ssize_t i, j;
2953c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t len = PyUnicode_GetSize(strobj);
2954c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_ssize_t outlen = len;
2955c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2956c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (func == Py_None) {
2957c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        /* If it's a real string we can return the original,
2958c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * as no character is ever false and __getitem__
2959c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * does return this character. If it's a subclass
2960c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel         * we must go through the __getitem__ loop */
2961c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (PyUnicode_CheckExact(strobj)) {
2962c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_INCREF(strobj);
2963c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            return strobj;
2964c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2965c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
2966c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if ((result = PyUnicode_FromUnicode(NULL, len)) == NULL)
2967c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        return NULL;
2968c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2969c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    for (i = j = 0; i < len; ++i) {
2970c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyObject *item, *arg, *good;
2971c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        int ok;
2972c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
2973c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2974c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (item == NULL)
2975c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
2976c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (func == Py_None) {
2977c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = 1;
2978c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        } else {
2979c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            arg = PyTuple_Pack(1, item);
2980c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (arg == NULL) {
2981c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2982c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2983c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2984c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            good = PyEval_CallObject(func, arg);
2985c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(arg);
2986c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (good == NULL) {
2987c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
2988c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
2989c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
2990c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            ok = PyObject_IsTrue(good);
2991c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_DECREF(good);
2992c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
2993c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok > 0) {
2994c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            Py_ssize_t reslen;
2995c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (!PyUnicode_Check(item)) {
2996c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyErr_SetString(PyExc_TypeError,
2997c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                "can't filter unicode to unicode:"
2998c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                " __getitem__ returned different type");
2999c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_DECREF(item);
3000c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                goto Fail_1;
3001c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            }
3002c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            reslen = PyUnicode_GET_SIZE(item);
3003c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            if (reslen == 1)
3004c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                PyUnicode_AS_UNICODE(result)[j++] =
3005c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    PyUnicode_AS_UNICODE(item)[0];
3006c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            else {
3007c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* do we need more space? */
3008c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                Py_ssize_t need = j + reslen + len - i - 1;
3009c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3010c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                /* check that didnt overflow */
3011c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if ((j > PY_SSIZE_T_MAX - reslen) ||
3012c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    ((j + reslen) > PY_SSIZE_T_MAX - len) ||
3013c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                        ((j + reslen + len) < i) ||
3014c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            ((j + reslen + len - i) <= 0)) {
3015c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    Py_DECREF(item);
3016c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    return NULL;
3017c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                }
3018c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3019c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(need >= 0);
3020c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                assert(outlen >= 0);
3021c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3022c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                if (need > outlen) {
3023c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    /* overallocate,
3024c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                       to avoid reallocations */
3025c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    if (need < 2 * outlen) {
3026c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (outlen > PY_SSIZE_T_MAX / 2) {
3027c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          Py_DECREF(item);
3028c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel          return NULL;
3029c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            } else {
3030c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                                    need = 2 * outlen;
3031c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                }
3032c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel      }
3033c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3034c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    if (PyUnicode_Resize(
3035c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            &result, need) < 0) {
3036c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            Py_DECREF(item);
3037c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                            goto Fail_1;
3038c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    }
3039c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                    outlen = need;
3040c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            }
3041c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            memcpy(PyUnicode_AS_UNICODE(result) + j,
3042c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   PyUnicode_AS_UNICODE(item),
3043c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                                   reslen*sizeof(Py_UNICODE));
3044c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                            j += reslen;
3045c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel                    }
3046c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        }
3047c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        Py_DECREF(item);
3048c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        if (ok < 0)
3049c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel            goto Fail_1;
3050c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    }
3051c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3052c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    if (j < outlen)
3053c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel        PyUnicode_Resize(&result, j);
3054c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3055c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return result;
3056c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel
3057c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielFail_1:
3058c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    Py_DECREF(result);
3059c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel    return NULL;
3060c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel}
3061c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif
3062