annotate Python/bltinmodule.c @ 45618:88c1e17ceffc 2.3

Backport of r61180: Added checks for integer overflows, contributed by Google. Some are only available if asserts are left in the code, in cases where they can't be triggered from Python code.
author Martin v. Löwis <martin@v.loewis.de>
date Sun, 02 Mar 2008 20:32:57 +0000
parents 7a1fb316e655
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15637
7fb7c51a2e61 Whoops! Two stray characters crept in to my last check-in
Andrew M. Kuchling <amk@amk.ca>
parents: 15635
diff changeset
1
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Built-in functions */
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
4 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #include "node.h"
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
7 #include "compile.h"
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
8 #include "eval.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
5317
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5223
diff changeset
10 #include <ctype.h>
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5223
diff changeset
11
20654
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
12 #ifdef RISCOS
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
13 #include "unixstuff.h"
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
14 #endif
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
15
17822
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
16 /* The default encoding used by the platform file system APIs
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
17 Can remain NULL for all platforms that don't have such a concept
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
18 */
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23868
diff changeset
19 #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
17822
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
20 const char *Py_FileSystemDefaultEncoding = "mbcs";
27782
904f0e769820 My previous checkin caused compile() to no longer accept buffers, as noted
Just van Rossum <just@letterror.com>
parents: 27781
diff changeset
21 #elif defined(__APPLE__)
904f0e769820 My previous checkin caused compile() to no longer accept buffers, as noted
Just van Rossum <just@letterror.com>
parents: 27781
diff changeset
22 const char *Py_FileSystemDefaultEncoding = "utf-8";
17822
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
23 #else
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
24 const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
50376d470648 Fix the Py_FileSystemDefaultEncoding checkin - declare the variable in a fileobject.h, and initialize it in bltinmodule.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17817
diff changeset
25 #endif
17817
f7c385226f65 Add support for Windows using "mbcs" as the default Unicode encoding when dealing with the file system. As discussed on python-dev and in patch 410465.
Mark Hammond <mhammond@skippinet.com.au>
parents: 17694
diff changeset
26
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
27 /* Forward */
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13446
diff changeset
28 static PyObject *filterstring(PyObject *, PyObject *);
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
29 #ifdef Py_USING_UNICODE
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
30 static PyObject *filterunicode(PyObject *, PyObject *);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
31 #endif
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13446
diff changeset
32 static PyObject *filtertuple (PyObject *, PyObject *);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
33
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
34 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
35 builtin___import__(PyObject *self, PyObject *args)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
36 {
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
37 char *name;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
38 PyObject *globals = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
39 PyObject *locals = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
40 PyObject *fromlist = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
41
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
42 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
2338
4c2f1452125d call __import__() with 4 args instead of 1
Guido van Rossum <guido@python.org>
parents: 2306
diff changeset
43 &name, &globals, &locals, &fromlist))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
44 return NULL;
6243
4279f4eb210a First part of package support.
Guido van Rossum <guido@python.org>
parents: 6198
diff changeset
45 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
46 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
47
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
48 PyDoc_STRVAR(import_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
49 "__import__(name, globals, locals, fromlist) -> module\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
50 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
51 Import a module. The globals are only used to determine the context;\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
52 they are not modified. The locals are currently unused. The fromlist\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
53 should be a list of names to emulate ``from name import ...'', or an\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
54 empty list to emulate ``import name''.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
55 When importing a module from a package, note that __import__('A.B', ...)\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
56 returns package A when fromlist is empty, but its submodule B when\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
57 fromlist is not empty.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
58
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
59
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
60 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
61 builtin_abs(PyObject *self, PyObject *v)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
62 {
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
63 return PyNumber_Absolute(v);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
66 PyDoc_STRVAR(abs_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
67 "abs(number) -> number\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
68 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
69 Return the absolute value of the argument.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
70
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
71
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
72 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
73 builtin_apply(PyObject *self, PyObject *args)
480
c64c6702549d Added "apply"; added "SyntaxError"; changed table lay-out.
Guido van Rossum <guido@python.org>
parents: 463
diff changeset
74 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
75 PyObject *func, *alist = NULL, *kwdict = NULL;
9188
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
76 PyObject *t = NULL, *retval = NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
77
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
78 if (!PyArg_UnpackTuple(args, "apply", 1, 3, &func, &alist, &kwdict))
480
c64c6702549d Added "apply"; added "SyntaxError"; changed table lay-out.
Guido van Rossum <guido@python.org>
parents: 463
diff changeset
79 return NULL;
9188
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
80 if (alist != NULL) {
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
81 if (!PyTuple_Check(alist)) {
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
82 if (!PySequence_Check(alist)) {
16017
7234d7c3c29f clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16011
diff changeset
83 PyErr_Format(PyExc_TypeError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
84 "apply() arg 2 expected sequence, found %s",
16017
7234d7c3c29f clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16011
diff changeset
85 alist->ob_type->tp_name);
9188
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
86 return NULL;
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
87 }
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
88 t = PySequence_Tuple(alist);
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
89 if (t == NULL)
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
90 return NULL;
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
91 alist = t;
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
92 }
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
93 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
94 if (kwdict != NULL && !PyDict_Check(kwdict)) {
16017
7234d7c3c29f clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16011
diff changeset
95 PyErr_Format(PyExc_TypeError,
7234d7c3c29f clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16011
diff changeset
96 "apply() arg 3 expected dictionary, found %s",
7234d7c3c29f clearer error messages for apply() and "no locals"
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16011
diff changeset
97 kwdict->ob_type->tp_name);
9188
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
98 goto finally;
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2824
diff changeset
99 }
9188
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
100 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
101 finally:
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
102 Py_XDECREF(t);
a1672e775f33 builtin_apply(): Second argument type check is relaxed to allow any sequence.
Barry Warsaw <barry@python.org>
parents: 9112
diff changeset
103 return retval;
480
c64c6702549d Added "apply"; added "SyntaxError"; changed table lay-out.
Guido van Rossum <guido@python.org>
parents: 463
diff changeset
104 }
c64c6702549d Added "apply"; added "SyntaxError"; changed table lay-out.
Guido van Rossum <guido@python.org>
parents: 463
diff changeset
105
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
106 PyDoc_STRVAR(apply_doc,
15832
0ae389e935fc Update the docstring for apply() so that "args" is marked as optional
Fred Drake <fdrake@acm.org>
parents: 15829
diff changeset
107 "apply(object[, args[, kwargs]]) -> value\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
108 \n\
11621
0ec803cbd872 Adjusted apply() docstring based on comments from Gerrit Holl
Fred Drake <fdrake@acm.org>
parents: 11383
diff changeset
109 Call a callable object with positional arguments taken from the tuple args,\n\
0ec803cbd872 Adjusted apply() docstring based on comments from Gerrit Holl
Fred Drake <fdrake@acm.org>
parents: 11383
diff changeset
110 and keyword arguments taken from the optional dictionary kwargs.\n\
28513
90c77b8af1a4 SF patch #701494: more apply removals
Raymond Hettinger <python@rcn.com>
parents: 28396
diff changeset
111 Note that classes are callable, as are instances with a __call__() method.\n\
90c77b8af1a4 SF patch #701494: more apply removals
Raymond Hettinger <python@rcn.com>
parents: 28396
diff changeset
112 \n\
90c77b8af1a4 SF patch #701494: more apply removals
Raymond Hettinger <python@rcn.com>
parents: 28396
diff changeset
113 Deprecated since release 2.3. Instead, use the extended call syntax:\n\
90c77b8af1a4 SF patch #701494: more apply removals
Raymond Hettinger <python@rcn.com>
parents: 28396
diff changeset
114 function(*args, **keywords).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
115
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
116
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
117 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
118 builtin_callable(PyObject *self, PyObject *v)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
119 {
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
120 return PyBool_FromLong((long)PyCallable_Check(v));
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
121 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
122
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
123 PyDoc_STRVAR(callable_doc,
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
124 "callable(object) -> bool\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
125 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
126 Return whether the object is callable (i.e., some kind of function).\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
127 Note that classes are callable, as are instances with a __call__() method.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
128
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
129
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
130 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
131 builtin_filter(PyObject *self, PyObject *args)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
132 {
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
133 PyObject *func, *seq, *result, *it, *arg;
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
134 int len; /* guess for result list size */
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
135 register int j;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
136
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
137 if (!PyArg_UnpackTuple(args, "filter", 2, 2, &func, &seq))
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
138 return NULL;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
139
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
140 /* Strings and tuples return a result of the same type. */
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
141 if (PyString_Check(seq))
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
142 return filterstring(func, seq);
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
143 #ifdef Py_USING_UNICODE
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
144 if (PyUnicode_Check(seq))
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
145 return filterunicode(func, seq);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
146 #endif
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
147 if (PyTuple_Check(seq))
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
148 return filtertuple(func, seq);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
149
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
150 /* Get iterator. */
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
151 it = PyObject_GetIter(seq);
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
152 if (it == NULL)
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
153 return NULL;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
154
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
155 /* Guess a result list size. */
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
156 len = -1; /* unknown */
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
157 if (PySequence_Check(seq) &&
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
158 seq->ob_type->tp_as_sequence->sq_length) {
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
159 len = PySequence_Size(seq);
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
160 if (len < 0)
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
161 PyErr_Clear();
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
162 }
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
163 if (len < 0)
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
164 len = 8; /* arbitrary */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
165
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
166 /* Pre-allocate argument list tuple. */
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
167 arg = PyTuple_New(1);
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
168 if (arg == NULL)
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
169 goto Fail_arg;
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
170
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
171 /* Get a result list. */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
172 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
173 /* Eww - can modify the list in-place. */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
174 Py_INCREF(seq);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
175 result = seq;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
176 }
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
177 else {
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
178 result = PyList_New(len);
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
179 if (result == NULL)
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
180 goto Fail_it;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
181 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
182
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
183 /* Build the result list. */
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
184 j = 0;
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
185 for (;;) {
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
186 PyObject *item;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
187 int ok;
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
188
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
189 item = PyIter_Next(it);
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
190 if (item == NULL) {
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
191 if (PyErr_Occurred())
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
192 goto Fail_result_it;
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
193 break;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
194 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
195
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
196 if (func == Py_None) {
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
197 ok = PyObject_IsTrue(item);
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
198 }
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
199 else {
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
200 PyObject *good;
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
201 PyTuple_SET_ITEM(arg, 0, item);
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
202 good = PyObject_Call(func, arg, NULL);
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
203 PyTuple_SET_ITEM(arg, 0, NULL);
2120
84b61fe44573 fix subtle refcount big in filter() -- Tim MacKenzie
Guido van Rossum <guido@python.org>
parents: 2113
diff changeset
204 if (good == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
205 Py_DECREF(item);
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
206 goto Fail_result_it;
2120
84b61fe44573 fix subtle refcount big in filter() -- Tim MacKenzie
Guido van Rossum <guido@python.org>
parents: 2113
diff changeset
207 }
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
208 ok = PyObject_IsTrue(good);
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
209 Py_DECREF(good);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
210 }
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
211 if (ok) {
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
212 if (j < len)
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
213 PyList_SET_ITEM(result, j, item);
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
214 else {
9991
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
215 int status = PyList_Append(result, item);
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
216 Py_DECREF(item);
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
217 if (status < 0)
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
218 goto Fail_result_it;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
219 }
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
220 ++j;
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
221 }
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
222 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
223 Py_DECREF(item);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
224 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
225
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
226
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
227 /* Cut back result list if len is too big. */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
228 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
229 goto Fail_result_it;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
230
17874
eb03c6fc31e5 SF bug #425836: Reference leak in filter().
Tim Peters <tim.peters@gmail.com>
parents: 17822
diff changeset
231 Py_DECREF(it);
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
232 Py_DECREF(arg);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
233 return result;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
234
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
235 Fail_result_it:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
236 Py_DECREF(result);
17654
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
237 Fail_it:
a97e18e499a9 Generalize filter(f, seq) to work with iterators. This also generalizes
Tim Peters <tim.peters@gmail.com>
parents: 17641
diff changeset
238 Py_DECREF(it);
24863
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
239 Fail_arg:
a3ebd1233c00 A nice little speed-up for filter():
Guido van Rossum <guido@python.org>
parents: 24817
diff changeset
240 Py_DECREF(arg);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
241 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
242 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
243
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
244 PyDoc_STRVAR(filter_doc,
22225
67a5e25dc88b backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21712
diff changeset
245 "filter(function or None, sequence) -> list, tuple, or string\n"
67a5e25dc88b backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21712
diff changeset
246 "\n"
67a5e25dc88b backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21712
diff changeset
247 "Return those items of sequence for which function(item) is true. If\n"
67a5e25dc88b backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21712
diff changeset
248 "function is None, return the items that are true. If sequence is a tuple\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
249 "or string, return the same type, else return a list.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
250
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
251 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
252 builtin_chr(PyObject *self, PyObject *args)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 {
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 long x;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 char s[1];
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
256
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
257 if (!PyArg_ParseTuple(args, "l:chr", &x))
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 if (x < 0 || x >= 256) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
260 PyErr_SetString(PyExc_ValueError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
261 "chr() arg not in range(256)");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
5317
c72c7e1930b3 Keep gcc -Wall and Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5223
diff changeset
264 s[0] = (char)x;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
265 return PyString_FromStringAndSize(s, 1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
267
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
268 PyDoc_STRVAR(chr_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
269 "chr(i) -> character\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
270 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
271 Return a string of one character with ordinal i; 0 <= i < 256.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
272
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
273
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
274 #ifdef Py_USING_UNICODE
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
275 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
276 builtin_unichr(PyObject *self, PyObject *args)
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
277 {
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
278 long x;
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
279
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
280 if (!PyArg_ParseTuple(args, "l:unichr", &x))
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
281 return NULL;
18282
f38923ce3c6b more unicode tweaks: make unichr(0xdddddddd) behave like u"\Udddddddd"
Fredrik Lundh <fredrik@pythonware.com>
parents: 18281
diff changeset
282
24737
eaa87632b1e8 Add C API PyUnicode_FromOrdinal() which exposes unichr() at C level.
Marc-André Lemburg <mal@egenix.com>
parents: 24071
diff changeset
283 return PyUnicode_FromOrdinal(x);
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
284 }
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
285
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
286 PyDoc_STRVAR(unichr_doc,
12386
32e9d0e78935 When refering to Unicode characters in exception messages and
Fred Drake <fdrake@acm.org>
parents: 12384
diff changeset
287 "unichr(i) -> Unicode character\n\
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
288 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
289 Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
290 #endif
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
291
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
292
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
293 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
294 builtin_cmp(PyObject *self, PyObject *args)
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 1073
diff changeset
295 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
296 PyObject *a, *b;
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
297 int c;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
298
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
299 if (!PyArg_UnpackTuple(args, "cmp", 2, 2, &a, &b))
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 1073
diff changeset
300 return NULL;
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
301 if (PyObject_Cmp(a, b, &c) < 0)
5610
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5471
diff changeset
302 return NULL;
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
303 return PyInt_FromLong((long)c);
1079
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 1073
diff changeset
304 }
e4c6a0dd5c2b * bltinmodule.c: added built-in function cmp(a, b)
Guido van Rossum <guido@python.org>
parents: 1073
diff changeset
305
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
306 PyDoc_STRVAR(cmp_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
307 "cmp(x, y) -> integer\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
308 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
309 Return negative if x<y, zero if x==y, positive if x>y.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
310
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
311
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
312 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
313 builtin_coerce(PyObject *self, PyObject *args)
2113
76c860a18d82 move coerce() from bltinmodule.c to object.c and implement builtin_coerce() differently
Guido van Rossum <guido@python.org>
parents: 2106
diff changeset
314 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
315 PyObject *v, *w;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
316 PyObject *res;
2113
76c860a18d82 move coerce() from bltinmodule.c to object.c and implement builtin_coerce() differently
Guido van Rossum <guido@python.org>
parents: 2106
diff changeset
317
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
318 if (!PyArg_UnpackTuple(args, "coerce", 2, 2, &v, &w))
2113
76c860a18d82 move coerce() from bltinmodule.c to object.c and implement builtin_coerce() differently
Guido van Rossum <guido@python.org>
parents: 2106
diff changeset
319 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
320 if (PyNumber_Coerce(&v, &w) < 0)
944
222f04f55083 Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
321 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
322 res = Py_BuildValue("(OO)", v, w);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
323 Py_DECREF(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
324 Py_DECREF(w);
944
222f04f55083 Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
325 return res;
222f04f55083 Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
326 }
222f04f55083 Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
327
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
328 PyDoc_STRVAR(coerce_doc,
33262
7a1fb316e655 Patch #1015021: Stop claiming that coerce can return None.
Martin v. Löwis <martin@v.loewis.de>
parents: 31838
diff changeset
329 "coerce(x, y) -> (x1, y1)\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
330 \n\
33262
7a1fb316e655 Patch #1015021: Stop claiming that coerce can return None.
Martin v. Löwis <martin@v.loewis.de>
parents: 31838
diff changeset
331 Return a tuple consisting of the two numeric arguments converted to\n\
7a1fb316e655 Patch #1015021: Stop claiming that coerce can return None.
Martin v. Löwis <martin@v.loewis.de>
parents: 31838
diff changeset
332 a common type, using the same rules as used by arithmetic operations.\n\
7a1fb316e655 Patch #1015021: Stop claiming that coerce can return None.
Martin v. Löwis <martin@v.loewis.de>
parents: 31838
diff changeset
333 If coercion is not possible, raise TypeError.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
334
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
335 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
336 builtin_compile(PyObject *self, PyObject *args)
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
337 {
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
338 char *str;
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
339 char *filename;
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
340 char *startstr;
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
341 int start;
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
342 int dont_inherit = 0;
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
343 int supplied_flags = 0;
18611
fdb36a0c7e6e Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents: 18436
diff changeset
344 PyCompilerFlags cf;
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
345 PyObject *result, *cmd, *tmp = NULL;
27782
904f0e769820 My previous checkin caused compile() to no longer accept buffers, as noted
Just van Rossum <just@letterror.com>
parents: 27781
diff changeset
346 int length;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
347
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
348 if (!PyArg_ParseTuple(args, "Oss|ii:compile", &cmd, &filename,
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
349 &startstr, &supplied_flags, &dont_inherit))
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
350 return NULL;
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
351
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
352 cf.cf_flags = supplied_flags;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
353
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
354 #ifdef Py_USING_UNICODE
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
355 if (PyUnicode_Check(cmd)) {
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
356 tmp = PyUnicode_AsUTF8String(cmd);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
357 if (tmp == NULL)
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
358 return NULL;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
359 cmd = tmp;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
360 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
361 }
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
362 #endif
27782
904f0e769820 My previous checkin caused compile() to no longer accept buffers, as noted
Just van Rossum <just@letterror.com>
parents: 27781
diff changeset
363 if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length))
904f0e769820 My previous checkin caused compile() to no longer accept buffers, as noted
Just van Rossum <just@letterror.com>
parents: 27781
diff changeset
364 return NULL;
27790
b650a54a76fd Squashed compiler wng about signed/unsigned clash in comparison.
Tim Peters <tim.peters@gmail.com>
parents: 27786
diff changeset
365 if ((size_t)length != strlen(str)) {
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
366 PyErr_SetString(PyExc_TypeError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
367 "compile() expected string without null bytes");
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
368 return NULL;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
369 }
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
370
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
371 if (strcmp(startstr, "exec") == 0)
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5421
diff changeset
372 start = Py_file_input;
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
373 else if (strcmp(startstr, "eval") == 0)
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5421
diff changeset
374 start = Py_eval_input;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
375 else if (strcmp(startstr, "single") == 0)
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5421
diff changeset
376 start = Py_single_input;
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
377 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
378 PyErr_SetString(PyExc_ValueError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
379 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
380 return NULL;
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
381 }
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
382
27878
be7683a6f521 - Finally fixed the bug in compile() and exec where a string ending
Guido van Rossum <guido@python.org>
parents: 27795
diff changeset
383 if (supplied_flags &
be7683a6f521 - Finally fixed the bug in compile() and exec where a string ending
Guido van Rossum <guido@python.org>
parents: 27795
diff changeset
384 ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT))
be7683a6f521 - Finally fixed the bug in compile() and exec where a string ending
Guido van Rossum <guido@python.org>
parents: 27795
diff changeset
385 {
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
386 PyErr_SetString(PyExc_ValueError,
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
387 "compile(): unrecognised flags");
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
388 return NULL;
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
389 }
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
390 /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
391
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
392 if (!dont_inherit) {
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
393 PyEval_MergeCompilerFlags(&cf);
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
394 }
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
395 result = Py_CompileStringFlags(str, filename, start, &cf);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
396 Py_XDECREF(tmp);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
397 return result;
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
398 }
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
399
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
400 PyDoc_STRVAR(compile_doc,
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
401 "compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
402 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
403 Compile the source string (a Python module, statement or expression)\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
404 into a code object that can be executed by the exec statement or eval().\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
405 The filename will be used for run-time error messages.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
406 The mode must be 'exec' to compile a module, 'single' to compile a\n\
19355
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
407 single (interactive) statement, or 'eval' to compile an expression.\n\
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
408 The flags argument, if present, controls which future statements influence\n\
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
409 the compilation of the code.\n\
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
410 The dont_inherit argument, if non-zero, stops the compilation inheriting\n\
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
411 the effects of any future statements in effect in the code calling\n\
d5acff178ad5 A fiddled version of the rest of Michael Hudson's SF patch
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
412 compile; if absent or zero these statements do influence the compilation,\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
413 in addition to any features explicitly specified.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
414
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
415 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
416 builtin_dir(PyObject *self, PyObject *args)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 {
19665
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
418 PyObject *arg = NULL;
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
419
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
420 if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))
19665
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
421 return NULL;
19705
b7f6fbc087a7 At Guido's suggestion, here's a new C API function, PyObject_Dir(), like
Tim Peters <tim.peters@gmail.com>
parents: 19670
diff changeset
422 return PyObject_Dir(arg);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
425 PyDoc_STRVAR(dir_doc,
19665
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
426 "dir([object]) -> list of strings\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
427 "\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
428 "Return an alphabetized list of names comprising (some of) the attributes\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
429 "of the given object, and of attributes reachable from it:\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
430 "\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
431 "No argument: the names in the current scope.\n"
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
432 "Module object: the module attributes.\n"
19670
78cfb993f274 builtin_dir(): Treat classic classes like types. Use PyDict_Keys instead
Tim Peters <tim.peters@gmail.com>
parents: 19665
diff changeset
433 "Type or class object: its attributes, and recursively the attributes of\n"
78cfb993f274 builtin_dir(): Treat classic classes like types. Use PyDict_Keys instead
Tim Peters <tim.peters@gmail.com>
parents: 19665
diff changeset
434 " its bases.\n"
19665
08c3c9edd99b Make dir() wordier (see the new docstring). The new behavior is a mixed
Tim Peters <tim.peters@gmail.com>
parents: 19471
diff changeset
435 "Otherwise: its attributes, its class's attributes, and recursively the\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
436 " attributes of its class's base classes.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
437
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
438 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
439 builtin_divmod(PyObject *self, PyObject *args)
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
440 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
441 PyObject *v, *w;
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
442
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
443 if (!PyArg_UnpackTuple(args, "divmod", 2, 2, &v, &w))
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
444 return NULL;
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
445 return PyNumber_Divmod(v, w);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
447
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
448 PyDoc_STRVAR(divmod_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
449 "divmod(x, y) -> (div, mod)\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
450 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
451 Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
452
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
453
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
454 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
455 builtin_eval(PyObject *self, PyObject *args)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 {
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
457 PyObject *cmd, *result, *tmp = NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
458 PyObject *globals = Py_None, *locals = Py_None;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
459 char *str;
19357
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
460 PyCompilerFlags cf;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
461
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
462 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
463 &cmd,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
464 &PyDict_Type, &globals,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
465 &PyDict_Type, &locals))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
466 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
467 if (globals == Py_None) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
468 globals = PyEval_GetGlobals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
469 if (locals == Py_None)
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
470 locals = PyEval_GetLocals();
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
471 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
472 else if (locals == Py_None)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
473 locals = globals;
19357
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
474
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
475 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
476 if (PyDict_SetItemString(globals, "__builtins__",
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
477 PyEval_GetBuiltins()) != 0)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
478 return NULL;
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
479 }
19357
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
480
18885
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
481 if (PyCode_Check(cmd)) {
21398
de125792bfaa Fix for SF bug [ #492403 ] exec() segfaults on closure's func_code
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 21077
diff changeset
482 if (PyCode_GetNumFree((PyCodeObject *)cmd) > 0) {
18885
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
483 PyErr_SetString(PyExc_TypeError,
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
484 "code object passed to eval() may not contain free variables");
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
485 return NULL;
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
486 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
487 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
18885
22456d0ee737 Fix for SF bug [ #443866 ] Evaluating func_code causing core dump
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18836
diff changeset
488 }
19357
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
489
14696
85038a024b19 This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents: 14662
diff changeset
490 if (!PyString_Check(cmd) &&
85038a024b19 This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents: 14662
diff changeset
491 !PyUnicode_Check(cmd)) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
492 PyErr_SetString(PyExc_TypeError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
493 "eval() arg 1 must be a string or code object");
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 return NULL;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 }
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
496 cf.cf_flags = 0;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
497
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
498 #ifdef Py_USING_UNICODE
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
499 if (PyUnicode_Check(cmd)) {
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
500 tmp = PyUnicode_AsUTF8String(cmd);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
501 if (tmp == NULL)
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
502 return NULL;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
503 cmd = tmp;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
504 cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
505 }
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
506 #endif
14696
85038a024b19 This patch adds a new Python C API called PyString_AsStringAndSize()
Marc-André Lemburg <mal@egenix.com>
parents: 14662
diff changeset
507 if (PyString_AsStringAndSize(cmd, &str, NULL))
959
68b302ad84a1 use getargs() in more cases;
Guido van Rossum <guido@python.org>
parents: 955
diff changeset
508 return NULL;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
509 while (*str == ' ' || *str == '\t')
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
510 str++;
19357
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
511
be9b50704e4c Fix for bug [#452230] future division isn't propagated.
Tim Peters <tim.peters@gmail.com>
parents: 19355
diff changeset
512 (void)PyEval_MergeCompilerFlags(&cf);
27781
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
513 result = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
514 Py_XDECREF(tmp);
cc01fb654ce3 patch #683515: "Add unicode support to compile(), eval() and exec"
Just van Rossum <just@letterror.com>
parents: 27681
diff changeset
515 return result;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
516 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
517
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
518 PyDoc_STRVAR(eval_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
519 "eval(source[, globals[, locals]]) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
520 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
521 Evaluate the source in the context of globals and locals.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
522 The source may be a string representing a Python expression\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
523 or a code object as returned by compile().\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
524 The globals and locals are dictionaries, defaulting to the current\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
525 globals and locals. If only globals is given, locals defaults to it.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
526
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
527
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
528 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
529 builtin_execfile(PyObject *self, PyObject *args)
673
71d496259ad3 Added execfile().
Guido van Rossum <guido@python.org>
parents: 662
diff changeset
530 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
531 char *filename;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
532 PyObject *globals = Py_None, *locals = Py_None;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
533 PyObject *res;
19726
5487d9d53a0e builtin_execfile(): initialize another local that the GCC on leroy
Guido van Rossum <guido@python.org>
parents: 19705
diff changeset
534 FILE* fp = NULL;
18611
fdb36a0c7e6e Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents: 18436
diff changeset
535 PyCompilerFlags cf;
19053
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
536 int exists;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
537
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
538 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
539 &filename,
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
540 &PyDict_Type, &globals,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
541 &PyDict_Type, &locals))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
542 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
543 if (globals == Py_None) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
544 globals = PyEval_GetGlobals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
545 if (locals == Py_None)
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
546 locals = PyEval_GetLocals();
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
547 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
548 else if (locals == Py_None)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
549 locals = globals;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
550 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
551 if (PyDict_SetItemString(globals, "__builtins__",
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
552 PyEval_GetBuiltins()) != 0)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
553 return NULL;
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
554 }
19053
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
555
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
556 exists = 0;
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
557 /* Test for existence or directory. */
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
558 #if defined(PLAN9)
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
559 {
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
560 Dir *d;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
561
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
562 if ((d = dirstat(filename))!=nil) {
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
563 if(d->mode & DMDIR)
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
564 werrstr("is a directory");
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
565 else
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
566 exists = 1;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
567 free(d);
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
568 }
19053
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
569 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
570 #elif defined(RISCOS)
20654
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
571 if (object_exists(filename)) {
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
572 if (isdir(filename))
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
573 errno = EISDIR;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
574 else
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
575 exists = 1;
edd9d0b3c47e SF patch #474590 -- RISC OS support
Guido van Rossum <guido@python.org>
parents: 20471
diff changeset
576 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
577 #else /* standard Posix */
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
578 {
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
579 struct stat s;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
580 if (stat(filename, &s) == 0) {
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
581 if (S_ISDIR(s.st_mode))
31838
677c0bf05735 OS/2 VACPP build updates/fixes
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 31121
diff changeset
582 # if defined(PYOS_OS2) && defined(PYCC_VACPP)
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
583 errno = EOS2ERR;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
584 # else
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
585 errno = EISDIR;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
586 # endif
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
587 else
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
588 exists = 1;
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
589 }
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
590 }
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22225
diff changeset
591 #endif
19053
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
592
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
593 if (exists) {
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
594 Py_BEGIN_ALLOW_THREADS
23029
8291473fde3e Mass checkin of universal newline support.
Jack Jansen <jack.jansen@cwi.nl>
parents: 22785
diff changeset
595 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
19053
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
596 Py_END_ALLOW_THREADS
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
597
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
598 if (fp == NULL) {
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
599 exists = 0;
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
600 }
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
601 }
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
602
2bb242dc69d8 Patch #448227: Raise an exception when a directory is passed to execfile.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
603 if (!exists) {
25046
434bc1dea4f8 execfile should call PyErr_SetFromErrnoWithFilename instead of
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 24863
diff changeset
604 PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename);
673
71d496259ad3 Added execfile().
Guido van Rossum <guido@python.org>
parents: 662
diff changeset
605 return NULL;
71d496259ad3 Added execfile().
Guido van Rossum <guido@python.org>
parents: 662
diff changeset
606 }
18611
fdb36a0c7e6e Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents: 18436
diff changeset
607 cf.cf_flags = 0;
fdb36a0c7e6e Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents: 18436
diff changeset
608 if (PyEval_MergeCompilerFlags(&cf))
17641
9be7758a8c94 Fix buglet reported on c.l.py: map(fnc, file.xreadlines()) blows up.
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
609 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
17125
2054cea38754 Extend support for from __future__ import nested_scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17111
diff changeset
610 locals, 1, &cf);
18611
fdb36a0c7e6e Part way to allowing "from __future__ import generators" to communicate
Tim Peters <tim.peters@gmail.com>
parents: 18436
diff changeset
611 else
17641
9be7758a8c94 Fix buglet reported on c.l.py: map(fnc, file.xreadlines()) blows up.
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
612 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
17125
2054cea38754 Extend support for from __future__ import nested_scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 17111
diff changeset
613 locals, 1);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
614 return res;
673
71d496259ad3 Added execfile().
Guido van Rossum <guido@python.org>
parents: 662
diff changeset
615 }
71d496259ad3 Added execfile().
Guido van Rossum <guido@python.org>
parents: 662
diff changeset
616
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
617 PyDoc_STRVAR(execfile_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
618 "execfile(filename[, globals[, locals]])\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
619 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
620 Read and execute a Python script from a file.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
621 The globals and locals are dictionaries, defaulting to the current\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
622 globals and locals. If only globals is given, locals defaults to it.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
623
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
624
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
625 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
626 builtin_getattr(PyObject *self, PyObject *args)
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
627 {
8581
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
628 PyObject *v, *result, *dflt = NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
629 PyObject *name;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
630
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
631 if (!PyArg_UnpackTuple(args, "getattr", 2, 3, &v, &name, &dflt))
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
632 return NULL;
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
633 #ifdef Py_USING_UNICODE
18888
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
634 if (PyUnicode_Check(name)) {
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
635 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
636 if (name == NULL)
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
637 return NULL;
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
638 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
639 #endif
18888
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
640
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
641 if (!PyString_Check(name)) {
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
642 PyErr_SetString(PyExc_TypeError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
643 "getattr(): attribute name must be string");
18888
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
644 return NULL;
f12e1a766a14 Fix for SF byg [ #420304 ] getattr function w/ default
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18885
diff changeset
645 }
8581
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
646 result = PyObject_GetAttr(v, name);
20471
bbdc0abfbb13 SF patch #471852 (anonymous) notes that getattr(obj, name, default)
Guido van Rossum <guido@python.org>
parents: 20307
diff changeset
647 if (result == NULL && dflt != NULL &&
bbdc0abfbb13 SF patch #471852 (anonymous) notes that getattr(obj, name, default)
Guido van Rossum <guido@python.org>
parents: 20307
diff changeset
648 PyErr_ExceptionMatches(PyExc_AttributeError))
bbdc0abfbb13 SF patch #471852 (anonymous) notes that getattr(obj, name, default)
Guido van Rossum <guido@python.org>
parents: 20307
diff changeset
649 {
8581
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
650 PyErr_Clear();
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
651 Py_INCREF(dflt);
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
652 result = dflt;
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
653 }
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
654 return result;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
655 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
656
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
657 PyDoc_STRVAR(getattr_doc,
8581
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
658 "getattr(object, name[, default]) -> value\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
659 \n\
8581
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
660 Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
221667f89064 Experimental feature: add default argument to getattr().
Guido van Rossum <guido@python.org>
parents: 8561
diff changeset
661 When a default argument is given, it is returned when the attribute doesn't\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
662 exist; without it, an exception is raised in that case.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
663
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
664
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
665 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
666 builtin_globals(PyObject *self)
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
667 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
668 PyObject *d;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
669
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
670 d = PyEval_GetGlobals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
671 Py_INCREF(d);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
672 return d;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
673 }
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
674
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
675 PyDoc_STRVAR(globals_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
676 "globals() -> dictionary\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
677 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
678 Return the dictionary containing the current scope's global variables.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
679
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
680
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
681 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
682 builtin_hasattr(PyObject *self, PyObject *args)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
683 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
684 PyObject *v;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
685 PyObject *name;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
686
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
687 if (!PyArg_UnpackTuple(args, "hasattr", 2, 2, &v, &name))
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
688 return NULL;
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
689 #ifdef Py_USING_UNICODE
18890
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
690 if (PyUnicode_Check(name)) {
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
691 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
692 if (name == NULL)
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
693 return NULL;
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
694 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
695 #endif
18890
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
696
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
697 if (!PyString_Check(name)) {
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
698 PyErr_SetString(PyExc_TypeError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
699 "hasattr(): attribute name must be string");
18890
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
700 return NULL;
fb837c5ae5d3 Do for hasattr() what was done for getattr()
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 18888
diff changeset
701 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
702 v = PyObject_GetAttr(v, name);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
703 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
704 PyErr_Clear();
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
705 Py_INCREF(Py_False);
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
706 return Py_False;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
707 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
708 Py_DECREF(v);
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
709 Py_INCREF(Py_True);
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
710 return Py_True;
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
711 }
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
712
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
713 PyDoc_STRVAR(hasattr_doc,
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
714 "hasattr(object, name) -> bool\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
715 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
716 Return whether the object has an attribute with the given name.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
717 (This is done by calling getattr(object, name) and catching exceptions.)");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
718
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
719
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
720 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
721 builtin_id(PyObject *self, PyObject *v)
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
722 {
13078
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
723 return PyLong_FromVoidPtr(v);
1263
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
724 }
65a1e4e9cd54 * Fixed some subtleties with fastlocals. You can no longer access
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
725
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
726 PyDoc_STRVAR(id_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
727 "id(object) -> integer\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
728 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
729 Return the identity of an object. This is guaranteed to be unique among\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
730 simultaneously existing objects. (Hint: it's the object's memory address.)");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
731
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
732
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
733 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
734 builtin_map(PyObject *self, PyObject *args)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
735 {
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
736 typedef struct {
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
737 PyObject *it; /* the iterator object */
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
738 int saw_StopIteration; /* bool: did the iterator end? */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
739 } sequence;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
740
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
741 PyObject *func, *result;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
742 sequence *seqs = NULL, *sqp;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
743 int n, len;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
744 register int i, j;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
745
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
746 n = PyTuple_Size(args);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
747 if (n < 2) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
748 PyErr_SetString(PyExc_TypeError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
749 "map() requires at least two args");
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
750 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
751 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
752
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
753 func = PyTuple_GetItem(args, 0);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
754 n--;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
755
8661
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
756 if (func == Py_None && n == 1) {
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
757 /* map(None, S) is the same as list(S). */
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
758 return PySequence_List(PyTuple_GetItem(args, 1));
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
759 }
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
760
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
761 /* Get space for sequence descriptors. Must NULL out the iterator
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
762 * pointers so that jumping to Fail_2 later doesn't see trash.
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
763 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
764 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
765 PyErr_NoMemory();
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
766 return NULL;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
767 }
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
768 for (i = 0; i < n; ++i) {
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
769 seqs[i].it = (PyObject*)NULL;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
770 seqs[i].saw_StopIteration = 0;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
771 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
772
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
773 /* Do a first pass to obtain iterators for the arguments, and set len
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
774 * to the largest of their lengths.
17641
9be7758a8c94 Fix buglet reported on c.l.py: map(fnc, file.xreadlines()) blows up.
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
775 */
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
776 len = 0;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
777 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
778 PyObject *curseq;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
779 int curlen;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
780
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
781 /* Get iterator. */
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
782 curseq = PyTuple_GetItem(args, i+1);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
783 sqp->it = PyObject_GetIter(curseq);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
784 if (sqp->it == NULL) {
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
785 static char errmsg[] =
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
786 "argument %d to map() must support iteration";
5388
13a30cea8dbf Avoid sprintf buffer overflow if more than 9999 arguments.
Guido van Rossum <guido@python.org>
parents: 5373
diff changeset
787 char errbuf[sizeof(errmsg) + 25];
21077
379fc66f4c96 Use PyOS_snprintf instead of sprintf.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20871
diff changeset
788 PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
789 PyErr_SetString(PyExc_TypeError, errbuf);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
790 goto Fail_2;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
791 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
792
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
793 /* Update len. */
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
794 curlen = -1; /* unknown */
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
795 if (PySequence_Check(curseq) &&
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
796 curseq->ob_type->tp_as_sequence->sq_length) {
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
797 curlen = PySequence_Size(curseq);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
798 if (curlen < 0)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
799 PyErr_Clear();
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
800 }
17641
9be7758a8c94 Fix buglet reported on c.l.py: map(fnc, file.xreadlines()) blows up.
Tim Peters <tim.peters@gmail.com>
parents: 17597
diff changeset
801 if (curlen < 0)
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
802 curlen = 8; /* arbitrary */
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18890
diff changeset
803 if (curlen > len)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18890
diff changeset
804 len = curlen;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
805 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
806
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
807 /* Get space for the result list. */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
808 if ((result = (PyObject *) PyList_New(len)) == NULL)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
809 goto Fail_2;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
810
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
811 /* Iterate over the sequences until all have stopped. */
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
812 for (i = 0; ; ++i) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
813 PyObject *alist, *item=NULL, *value;
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
814 int numactive = 0;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
815
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
816 if (func == Py_None && n == 1)
2824
65c7105868f8 rename arglist to alist (conflict with new grammar symbol)
Guido van Rossum <guido@python.org>
parents: 2808
diff changeset
817 alist = NULL;
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
818 else if ((alist = PyTuple_New(n)) == NULL)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
819 goto Fail_1;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
820
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
821 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
822 if (sqp->saw_StopIteration) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
823 Py_INCREF(Py_None);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
824 item = Py_None;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
825 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
826 else {
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
827 item = PyIter_Next(sqp->it);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
828 if (item)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
829 ++numactive;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
830 else {
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
831 if (PyErr_Occurred()) {
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
832 Py_XDECREF(alist);
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
833 goto Fail_1;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
834 }
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
835 Py_INCREF(Py_None);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
836 item = Py_None;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
837 sqp->saw_StopIteration = 1;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
838 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
839 }
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
840 if (alist)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
841 PyTuple_SET_ITEM(alist, j, item);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
842 else
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
843 break;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
844 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
845
2824
65c7105868f8 rename arglist to alist (conflict with new grammar symbol)
Guido van Rossum <guido@python.org>
parents: 2808
diff changeset
846 if (!alist)
65c7105868f8 rename arglist to alist (conflict with new grammar symbol)
Guido van Rossum <guido@python.org>
parents: 2808
diff changeset
847 alist = item;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
848
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
849 if (numactive == 0) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
850 Py_DECREF(alist);
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
851 break;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
852 }
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
853
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
854 if (func == Py_None)
2824
65c7105868f8 rename arglist to alist (conflict with new grammar symbol)
Guido van Rossum <guido@python.org>
parents: 2808
diff changeset
855 value = alist;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
856 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
857 value = PyEval_CallObject(func, alist);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
858 Py_DECREF(alist);
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
859 if (value == NULL)
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
860 goto Fail_1;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
861 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
862 if (i >= len) {
9991
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
863 int status = PyList_Append(result, value);
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
864 Py_DECREF(value);
ddbbed8cb830 builtin_map(): A better fix for the previous leak plug (remember
Barry Warsaw <barry@python.org>
parents: 9980
diff changeset
865 if (status < 0)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
866 goto Fail_1;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
867 }
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
868 else if (PyList_SetItem(result, i, value) < 0)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
869 goto Fail_1;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
870 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
871
8661
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
872 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
873 goto Fail_1;
30fbf18af29e Small changes to map() and filter():
Guido van Rossum <guido@python.org>
parents: 8589
diff changeset
874
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
875 goto Succeed;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
876
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
877 Fail_1:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
878 Py_DECREF(result);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
879 Fail_2:
17675
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
880 result = NULL;
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
881 Succeed:
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
882 assert(seqs);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
883 for (i = 0; i < n; ++i)
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
884 Py_XDECREF(seqs[i].it);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
885 PyMem_DEL(seqs);
0be277039d93 Generalize map() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17667
diff changeset
886 return result;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
887 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
888
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
889 PyDoc_STRVAR(map_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
890 "map(function, sequence[, sequence, ...]) -> list\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
891 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
892 Return a list of the results of applying the function to the items of\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
893 the argument sequence(s). If more than one sequence is given, the\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
894 function is called with an argument list consisting of the corresponding\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
895 item of each sequence, substituting None for missing values when not all\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
896 sequences have the same length. If the function is None, return a list of\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
897 the items of the sequence (or a list of tuples if more than one sequence).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
898
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
899
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
900 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
901 builtin_setattr(PyObject *self, PyObject *args)
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
902 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
903 PyObject *v;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
904 PyObject *name;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
905 PyObject *value;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
906
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
907 if (!PyArg_UnpackTuple(args, "setattr", 3, 3, &v, &name, &value))
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
908 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
909 if (PyObject_SetAttr(v, name, value) != 0)
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
910 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
911 Py_INCREF(Py_None);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
912 return Py_None;
644
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
913 }
59f9325bb8ec Added getattr and setattr built-in functions.
Guido van Rossum <guido@python.org>
parents: 606
diff changeset
914
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
915 PyDoc_STRVAR(setattr_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
916 "setattr(object, name, value)\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
917 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
918 Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
919 ``x.y = v''.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
920
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
921
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
922 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
923 builtin_delattr(PyObject *self, PyObject *args)
1843
8294bbd94535 Added delattr()
Guido van Rossum <guido@python.org>
parents: 1842
diff changeset
924 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
925 PyObject *v;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
926 PyObject *name;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
927
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
928 if (!PyArg_UnpackTuple(args, "delattr", 2, 2, &v, &name))
1843
8294bbd94535 Added delattr()
Guido van Rossum <guido@python.org>
parents: 1842
diff changeset
929 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
930 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
1843
8294bbd94535 Added delattr()
Guido van Rossum <guido@python.org>
parents: 1842
diff changeset
931 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
932 Py_INCREF(Py_None);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
933 return Py_None;
1843
8294bbd94535 Added delattr()
Guido van Rossum <guido@python.org>
parents: 1842
diff changeset
934 }
8294bbd94535 Added delattr()
Guido van Rossum <guido@python.org>
parents: 1842
diff changeset
935
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
936 PyDoc_STRVAR(delattr_doc,
9514
a126107c433a Fix cosmetic bug in delattr docstring discovered by JvR.
Guido van Rossum <guido@python.org>
parents: 9188
diff changeset
937 "delattr(object, name)\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
938 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
939 Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
940 ``del x.y''.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
941
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
942
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
943 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
944 builtin_hash(PyObject *self, PyObject *v)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
945 {
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
946 long x;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
947
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
948 x = PyObject_Hash(v);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
949 if (x == -1)
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
950 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
951 return PyInt_FromLong(x);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
952 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
953
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
954 PyDoc_STRVAR(hash_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
955 "hash(object) -> integer\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
956 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
957 Return a hash value for the object. Two objects with the same value have\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
958 the same hash value. The reverse is not necessarily true, but likely.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
959
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
960
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
961 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
962 builtin_hex(PyObject *self, PyObject *v)
404
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
963 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
964 PyNumberMethods *nb;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
965
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
966 if ((nb = v->ob_type->tp_as_number) == NULL ||
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
967 nb->nb_hex == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
968 PyErr_SetString(PyExc_TypeError,
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
969 "hex() argument can't be converted to hex");
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
970 return NULL;
404
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
971 }
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
972 return (*nb->nb_hex)(v);
404
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
973 }
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
974
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
975 PyDoc_STRVAR(hex_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
976 "hex(number) -> string\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
977 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
978 Return the hexadecimal representation of an integer or long integer.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
979
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
980
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13446
diff changeset
981 static PyObject *builtin_raw_input(PyObject *, PyObject *);
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1049
diff changeset
982
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
983 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
984 builtin_input(PyObject *self, PyObject *args)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
985 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
986 PyObject *line;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
987 char *str;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
988 PyObject *res;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
989 PyObject *globals, *locals;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
990
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
991 line = builtin_raw_input(self, args);
1073
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1049
diff changeset
992 if (line == NULL)
2c0432fcc270 Modified most (but not yet all) I/O to always go through sys.stdout or
Guido van Rossum <guido@python.org>
parents: 1049
diff changeset
993 return line;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
994 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
995 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
996 while (*str == ' ' || *str == '\t')
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
997 str++;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
998 globals = PyEval_GetGlobals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
999 locals = PyEval_GetLocals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1000 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1001 if (PyDict_SetItemString(globals, "__builtins__",
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1002 PyEval_GetBuiltins()) != 0)
2098
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
1003 return NULL;
b7be0382f9ee __builtins__ mods (and sys_checkinterval for ceval.c)
Guido van Rossum <guido@python.org>
parents: 2087
diff changeset
1004 }
5438
e926c331ebbf Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents: 5421
diff changeset
1005 res = PyRun_String(str, Py_eval_input, globals, locals);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1006 Py_DECREF(line);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1007 return res;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1009
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1010 PyDoc_STRVAR(input_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1011 "input([prompt]) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1012 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1013 Equivalent to eval(raw_input(prompt)).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1014
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1015
5092
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1016 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1017 builtin_intern(PyObject *self, PyObject *args)
5092
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1018 {
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1019 PyObject *s;
11882
dc65c5f6ad7c Massive patch by Skip Montanaro to add ":name" to as many
Guido van Rossum <guido@python.org>
parents: 11800
diff changeset
1020 if (!PyArg_ParseTuple(args, "S:intern", &s))
5092
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1021 return NULL;
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1022 Py_INCREF(s);
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1023 PyString_InternInPlace(&s);
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1024 return s;
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1025 }
cb7aadd9d9f2 Added intern() function.
Guido van Rossum <guido@python.org>
parents: 5010
diff changeset
1026
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1027 PyDoc_STRVAR(intern_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1028 "intern(string) -> string\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1029 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1030 ``Intern'' the given string. This enters the string in the (global)\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1031 table of interned strings whose purpose is to speed up dictionary lookups.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1032 Return the string itself or the previously interned string object with the\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1033 same value.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1034
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1035
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1036 static PyObject *
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1037 builtin_iter(PyObject *self, PyObject *args)
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1038 {
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1039 PyObject *v, *w = NULL;
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1040
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1041 if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w))
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1042 return NULL;
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1043 if (w == NULL)
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1044 return PyObject_GetIter(v);
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1045 if (!PyCallable_Check(v)) {
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1046 PyErr_SetString(PyExc_TypeError,
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1047 "iter(v, w): v must be callable");
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1048 return NULL;
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1049 }
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1050 return PyCallIter_New(v, w);
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1051 }
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1052
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1053 PyDoc_STRVAR(iter_doc,
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1054 "iter(collection) -> iterator\n\
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1055 iter(callable, sentinel) -> iterator\n\
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1056 \n\
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1057 Get an iterator from an object. In the first form, the argument must\n\
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1058 supply its own iterator, or be a sequence.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1059 In the second form, the callable is called until it returns the sentinel.");
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1060
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1061
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17337
diff changeset
1062 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1063 builtin_len(PyObject *self, PyObject *v)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1064 {
8589
97dc6aa532e7 Fix a stupid little bug: len() of an unsized returns -1 and leaves an
Guido van Rossum <guido@python.org>
parents: 8581
diff changeset
1065 long res;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1066
13576
61e4c29d53d8 replace PyXXX_Length calls with PyXXX_Size calls
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13447
diff changeset
1067 res = PyObject_Size(v);
8589
97dc6aa532e7 Fix a stupid little bug: len() of an unsized returns -1 and leaves an
Guido van Rossum <guido@python.org>
parents: 8581
diff changeset
1068 if (res < 0 && PyErr_Occurred())
97dc6aa532e7 Fix a stupid little bug: len() of an unsized returns -1 and leaves an
Guido van Rossum <guido@python.org>
parents: 8581
diff changeset
1069 return NULL;
97dc6aa532e7 Fix a stupid little bug: len() of an unsized returns -1 and leaves an
Guido van Rossum <guido@python.org>
parents: 8581
diff changeset
1070 return PyInt_FromLong(res);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1071 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1073 PyDoc_STRVAR(len_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1074 "len(object) -> integer\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1075 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1076 Return the number of items of a sequence or mapping.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1077
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1078
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1079 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1080 builtin_locals(PyObject *self)
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1081 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1082 PyObject *d;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1083
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1084 d = PyEval_GetLocals();
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1085 Py_INCREF(d);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1086 return d;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1087 }
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1088
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1089 PyDoc_STRVAR(locals_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1090 "locals() -> dictionary\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1091 \n\
27076
753306f9b0a0 SF bug #655271: Slightly modify locals() doc
Raymond Hettinger <python@rcn.com>
parents: 26824
diff changeset
1092 Update and return a dictionary containing the current scope's local variables.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1093
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1094
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1095 static PyObject *
15949
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1096 min_max(PyObject *args, int op)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1097 {
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1098 PyObject *v, *w, *x, *it;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1099
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1100 if (PyTuple_Size(args) > 1)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1101 v = args;
26824
fb36d9b50df5 Make error message more specific for min() and max().
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
1102 else if (!PyArg_UnpackTuple(args, (op==Py_LT) ? "min" : "max", 1, 1, &v))
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 return NULL;
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1104
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1105 it = PyObject_GetIter(v);
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1106 if (it == NULL)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 return NULL;
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1108
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1109 w = NULL; /* the result */
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1110 for (;;) {
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1111 x = PyIter_Next(it);
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1112 if (x == NULL) {
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1113 if (PyErr_Occurred()) {
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1114 Py_XDECREF(w);
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1115 Py_DECREF(it);
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1116 return NULL;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1117 }
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1118 break;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1119 }
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1120
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1121 if (w == NULL)
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1122 w = x;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1123 else {
15949
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1124 int cmp = PyObject_RichCompareBool(x, w, op);
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1125 if (cmp > 0) {
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1126 Py_DECREF(w);
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1127 w = x;
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1128 }
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1129 else if (cmp < 0) {
5610
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5471
diff changeset
1130 Py_DECREF(x);
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1131 Py_DECREF(w);
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1132 Py_DECREF(it);
5610
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5471
diff changeset
1133 return NULL;
10e9cfa010f0 PyObject_Compare can raise an exception now.
Guido van Rossum <guido@python.org>
parents: 5471
diff changeset
1134 }
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1135 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1136 Py_DECREF(x);
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1137 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1138 }
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1139 if (w == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1140 PyErr_SetString(PyExc_ValueError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
1141 "min() or max() arg is an empty sequence");
17667
76ee8b62ee2a Generalize max(seq) and min(seq) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17654
diff changeset
1142 Py_DECREF(it);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1143 return w;
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1145
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1146 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1147 builtin_min(PyObject *self, PyObject *v)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1148 {
15949
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1149 return min_max(v, Py_LT);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1150 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1151
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1152 PyDoc_STRVAR(min_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1153 "min(sequence) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1154 min(a, b, c, ...) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1155 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1156 With a single sequence argument, return its smallest item.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1157 With two or more arguments, return the smallest argument.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1158
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1159
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1160 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1161 builtin_max(PyObject *self, PyObject *v)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1162 {
15949
76ad2a9a3e53 Use rich comparisons in min and max.
Guido van Rossum <guido@python.org>
parents: 15832
diff changeset
1163 return min_max(v, Py_GT);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1164 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1166 PyDoc_STRVAR(max_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1167 "max(sequence) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1168 max(a, b, c, ...) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1169 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1170 With a single sequence argument, return its largest item.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1171 With two or more arguments, return the largest argument.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1172
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1173
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1174 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1175 builtin_oct(PyObject *self, PyObject *v)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1176 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1177 PyNumberMethods *nb;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1178
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
1179 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
1180 nb->nb_oct == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1181 PyErr_SetString(PyExc_TypeError,
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
1182 "oct() argument can't be converted to oct");
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
1183 return NULL;
404
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
1184 }
1049
2ed511171809 Made builtins int(), long(), float(), oct() and hex() more generic.
Guido van Rossum <guido@python.org>
parents: 972
diff changeset
1185 return (*nb->nb_oct)(v);
404
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
1186 }
9cd38d1ac391 Made dir() more robust.
Guido van Rossum <guido@python.org>
parents: 385
diff changeset
1187
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1188 PyDoc_STRVAR(oct_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1189 "oct(number) -> string\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1190 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1191 Return the octal representation of an integer or long integer.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1192
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1193
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1194 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1195 builtin_ord(PyObject *self, PyObject* obj)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196 {
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
1197 long ord;
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1198 int size;
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
1199
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1200 if (PyString_Check(obj)) {
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1201 size = PyString_GET_SIZE(obj);
15635
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1202 if (size == 1) {
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1203 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
15635
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1204 return PyInt_FromLong(ord);
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1205 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
1206 #ifdef Py_USING_UNICODE
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1207 } else if (PyUnicode_Check(obj)) {
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1208 size = PyUnicode_GET_SIZE(obj);
15635
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1209 if (size == 1) {
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1210 ord = (long)*PyUnicode_AS_UNICODE(obj);
15635
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1211 return PyInt_FromLong(ord);
838551869790 Patch #102955, fixing one of the warnings in bug #121479:
Andrew M. Kuchling <amk@amk.ca>
parents: 15478
diff changeset
1212 }
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
1213 #endif
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1214 } else {
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1215 PyErr_Format(PyExc_TypeError,
15654
6405f30aa08c CHange error messages for ord(), using "string" instead of "string or Unicode"
Andrew M. Kuchling <amk@amk.ca>
parents: 15637
diff changeset
1216 "ord() expected string of length 1, but " \
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1217 "%.200s found", obj->ob_type->tp_name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1218 return NULL;
11973
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
1219 }
8bdc25d22925 Marc-Andre Lemburg: added new builtin functions unicode() and
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
1220
15829
9308dc8c85e0 (Modified) patch by Ping - SF Patch #102681.
Guido van Rossum <guido@python.org>
parents: 15727
diff changeset
1221 PyErr_Format(PyExc_TypeError,
15654
6405f30aa08c CHange error messages for ord(), using "string" instead of "string or Unicode"
Andrew M. Kuchling <amk@amk.ca>
parents: 15637
diff changeset
1222 "ord() expected a character, "
6405f30aa08c CHange error messages for ord(), using "string" instead of "string or Unicode"
Andrew M. Kuchling <amk@amk.ca>
parents: 15637
diff changeset
1223 "but string of length %d found",
12384
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1224 size);
aa013f2cf80b ord: provide better error messages
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12368
diff changeset
1225 return NULL;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1226 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1227
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1228 PyDoc_STRVAR(ord_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1229 "ord(c) -> integer\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1230 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1231 Return the integer ordinal of a one-character string.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1232
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1233
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1234 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1235 builtin_pow(PyObject *self, PyObject *args)
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1236 {
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
1237 PyObject *v, *w, *z = Py_None;
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1238
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1239 if (!PyArg_UnpackTuple(args, "pow", 2, 3, &v, &w, &z))
2087
65146b52f16b * Python/bltinmodule.c: restructured coerce(), divmod(), pow() to
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
1240 return NULL;
8402
0cb0394c2edc A bunch of functions are now properly implemented in abstract.c, and
Guido van Rossum <guido@python.org>
parents: 8287
diff changeset
1241 return PyNumber_Power(v, w, z);
223
6693c5d87f3a Added long() and support for longs in int() and float();
Guido van Rossum <guido@python.org>
parents: 182
diff changeset
1242 }
6693c5d87f3a Added long() and support for longs in int() and float();
Guido van Rossum <guido@python.org>
parents: 182
diff changeset
1243
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1244 PyDoc_STRVAR(pow_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1245 "pow(x, y[, z]) -> number\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1246 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1247 With two arguments, equivalent to x**y. With three arguments,\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1248 equivalent to (x**y) % z, but may be more efficient (e.g. for longs).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1249
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1250
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1251
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1252 /* Return number of items in range (lo, hi, step), when arguments are
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1253 * PyInt or PyLong objects. step > 0 required. Return a value < 0 if
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1254 * & only if the true value is too large to fit in a signed long.
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1255 * Arguments MUST return 1 with either PyInt_Check() or
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1256 * PyLong_Check(). Return -1 when there is an error.
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1257 */
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1258 static long
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1259 get_len_of_range_longs(PyObject *lo, PyObject *hi, PyObject *step)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1260 {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1261 /* -------------------------------------------------------------
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1262 Algorithm is equal to that of get_len_of_range(), but it operates
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1263 on PyObjects (which are assumed to be PyLong or PyInt objects).
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1264 ---------------------------------------------------------------*/
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1265 long n;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1266 PyObject *diff = NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1267 PyObject *one = NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1268 PyObject *tmp1 = NULL, *tmp2 = NULL, *tmp3 = NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1269 /* holds sub-expression evaluations */
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1270
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1271 /* if (lo >= hi), return length of 0. */
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1272 if (PyObject_Compare(lo, hi) >= 0)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1273 return 0;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1274
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1275 if ((one = PyLong_FromLong(1L)) == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1276 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1277
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1278 if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1279 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1280
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1281 if ((diff = PyNumber_Subtract(tmp1, one)) == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1282 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1283
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1284 if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1285 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1286
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1287 if ((tmp3 = PyNumber_Add(tmp2, one)) == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1288 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1289
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1290 n = PyLong_AsLong(tmp3);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1291 if (PyErr_Occurred()) { /* Check for Overflow */
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1292 PyErr_Clear();
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1293 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1294 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1295
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1296 Py_DECREF(tmp3);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1297 Py_DECREF(tmp2);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1298 Py_DECREF(diff);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1299 Py_DECREF(tmp1);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1300 Py_DECREF(one);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1301 return n;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1302
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1303 Fail:
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1304 Py_XDECREF(tmp3);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1305 Py_XDECREF(tmp2);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1306 Py_XDECREF(diff);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1307 Py_XDECREF(tmp1);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1308 Py_XDECREF(one);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1309 return -1;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1310 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1311
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1312 /* An extension of builtin_range() that handles the case when PyLong
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1313 * arguments are given. */
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1314 static PyObject *
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1315 handle_range_longs(PyObject *self, PyObject *args)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1316 {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1317 PyObject *ilow;
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1318 PyObject *ihigh = NULL;
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1319 PyObject *istep = NULL;
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1320
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1321 PyObject *curnum = NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1322 PyObject *v = NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1323 long bign;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1324 int i, n;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1325 int cmp_result;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1326
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1327 PyObject *zero = PyLong_FromLong(0);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1328
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1329 if (zero == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1330 return NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1331
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1332 if (!PyArg_UnpackTuple(args, "range", 1, 3, &ilow, &ihigh, &istep)) {
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1333 Py_DECREF(zero);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1334 return NULL;
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1335 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1336
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1337 /* Figure out which way we were called, supply defaults, and be
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1338 * sure to incref everything so that the decrefs at the end
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1339 * are correct.
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1340 */
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1341 assert(ilow != NULL);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1342 if (ihigh == NULL) {
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1343 /* only 1 arg -- it's the upper limit */
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1344 ihigh = ilow;
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1345 ilow = NULL;
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1346 }
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1347 assert(ihigh != NULL);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1348 Py_INCREF(ihigh);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1349
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1350 /* ihigh correct now; do ilow */
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1351 if (ilow == NULL)
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1352 ilow = zero;
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1353 Py_INCREF(ilow);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1354
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1355 /* ilow and ihigh correct now; do istep */
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1356 if (istep == NULL) {
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1357 istep = PyLong_FromLong(1L);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1358 if (istep == NULL)
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1359 goto Fail;
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1360 }
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1361 else {
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1362 Py_INCREF(istep);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1363 }
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1364
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1365 if (!PyInt_Check(ilow) && !PyLong_Check(ilow)) {
28612
0792caa6371c Some errors from range() should be TypeError, not ValueError.
Guido van Rossum <guido@python.org>
parents: 28604
diff changeset
1366 PyErr_Format(PyExc_TypeError,
28738
52f3d90c17e8 complete and clarify some error messages for range()
Alex Martelli <aleaxit@gmail.com>
parents: 28718
diff changeset
1367 "range() integer start argument expected, got %s.",
28604
eee4969adbae Prompted by Tim's comment, when handle_range_longs() sees an
Guido van Rossum <guido@python.org>
parents: 28597
diff changeset
1368 ilow->ob_type->tp_name);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1369 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1370 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1371
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1372 if (!PyInt_Check(ihigh) && !PyLong_Check(ihigh)) {
28612
0792caa6371c Some errors from range() should be TypeError, not ValueError.
Guido van Rossum <guido@python.org>
parents: 28604
diff changeset
1373 PyErr_Format(PyExc_TypeError,
28738
52f3d90c17e8 complete and clarify some error messages for range()
Alex Martelli <aleaxit@gmail.com>
parents: 28718
diff changeset
1374 "range() integer end argument expected, got %s.",
28604
eee4969adbae Prompted by Tim's comment, when handle_range_longs() sees an
Guido van Rossum <guido@python.org>
parents: 28597
diff changeset
1375 ihigh->ob_type->tp_name);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1376 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1377 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1378
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1379 if (!PyInt_Check(istep) && !PyLong_Check(istep)) {
28612
0792caa6371c Some errors from range() should be TypeError, not ValueError.
Guido van Rossum <guido@python.org>
parents: 28604
diff changeset
1380 PyErr_Format(PyExc_TypeError,
28738
52f3d90c17e8 complete and clarify some error messages for range()
Alex Martelli <aleaxit@gmail.com>
parents: 28718
diff changeset
1381 "range() integer step argument expected, got %s.",
28604
eee4969adbae Prompted by Tim's comment, when handle_range_longs() sees an
Guido van Rossum <guido@python.org>
parents: 28597
diff changeset
1382 istep->ob_type->tp_name);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1383 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1384 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1385
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1386 if (PyObject_Cmp(istep, zero, &cmp_result) == -1)
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1387 goto Fail;
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1388 if (cmp_result == 0) {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1389 PyErr_SetString(PyExc_ValueError,
28738
52f3d90c17e8 complete and clarify some error messages for range()
Alex Martelli <aleaxit@gmail.com>
parents: 28718
diff changeset
1390 "range() step argument must not be zero");
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1391 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1392 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1393
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1394 if (cmp_result > 0)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1395 bign = get_len_of_range_longs(ilow, ihigh, istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1396 else {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1397 PyObject *neg_istep = PyNumber_Negative(istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1398 if (neg_istep == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1399 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1400 bign = get_len_of_range_longs(ihigh, ilow, neg_istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1401 Py_DECREF(neg_istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1402 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1403
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1404 n = (int)bign;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1405 if (bign < 0 || (long)n != bign) {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1406 PyErr_SetString(PyExc_OverflowError,
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1407 "range() result has too many items");
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1408 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1409 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1410
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1411 v = PyList_New(n);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1412 if (v == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1413 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1414
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1415 curnum = ilow;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1416 Py_INCREF(curnum);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1417
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1418 for (i = 0; i < n; i++) {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1419 PyObject *w = PyNumber_Long(curnum);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1420 PyObject *tmp_num;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1421 if (w == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1422 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1423
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1424 PyList_SET_ITEM(v, i, w);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1425
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1426 tmp_num = PyNumber_Add(curnum, istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1427 if (tmp_num == NULL)
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1428 goto Fail;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1429
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1430 Py_DECREF(curnum);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1431 curnum = tmp_num;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1432 }
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1433 Py_DECREF(ilow);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1434 Py_DECREF(ihigh);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1435 Py_DECREF(istep);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1436 Py_DECREF(zero);
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1437 Py_DECREF(curnum);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1438 return v;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1439
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1440 Fail:
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1441 Py_DECREF(ilow);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1442 Py_DECREF(ihigh);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1443 Py_XDECREF(istep);
28597
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1444 Py_DECREF(zero);
d2d232e2427b handle_range_longs(): refcount handling is very delicate here, and
Tim Peters <tim.peters@gmail.com>
parents: 28583
diff changeset
1445 Py_XDECREF(curnum);
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1446 Py_XDECREF(v);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1447 return NULL;
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1448 }
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1449
10279
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1450 /* Return number of items in range/xrange (lo, hi, step). step > 0
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1451 * required. Return a value < 0 if & only if the true value is too
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1452 * large to fit in a signed long.
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1453 */
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1454 static long
13679
61f65de19e1e Another missed ansification.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
1455 get_len_of_range(long lo, long hi, long step)
10279
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1456 {
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1457 /* -------------------------------------------------------------
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1458 If lo >= hi, the range is empty.
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1459 Else if n values are in the range, the last one is
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1460 lo + (n-1)*step, which must be <= hi-1. Rearranging,
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1461 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1462 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1463 the RHS is non-negative and so truncation is the same as the
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1464 floor. Letting M be the largest positive long, the worst case
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1465 for the RHS numerator is hi=M, lo=-M-1, and then
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1466 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1467 precision to compute the RHS exactly.
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1468 ---------------------------------------------------------------*/
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1469 long n = 0;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1470 if (lo < hi) {
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1471 unsigned long uhi = (unsigned long)hi;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1472 unsigned long ulo = (unsigned long)lo;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1473 unsigned long diff = uhi - ulo - 1;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1474 n = (long)(diff / (unsigned long)step + 1);
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1475 }
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1476 return n;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1477 }
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1478
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1479 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1480 builtin_range(PyObject *self, PyObject *args)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1481 {
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1482 long ilow = 0, ihigh = 0, istep = 1;
10279
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1483 long bign;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1484 int i, n;
10279
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1485
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1486 PyObject *v;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1487
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1488 if (PyTuple_Size(args) <= 1) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1489 if (!PyArg_ParseTuple(args,
2153
e54b8654f938 fix Alpha bug in (x)range; different __builtins__ initialization
Guido van Rossum <guido@python.org>
parents: 2120
diff changeset
1490 "l;range() requires 1-3 int arguments",
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1491 &ihigh)) {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1492 PyErr_Clear();
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1493 return handle_range_longs(self, args);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1494 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1495 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1496 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1497 if (!PyArg_ParseTuple(args,
2153
e54b8654f938 fix Alpha bug in (x)range; different __builtins__ initialization
Guido van Rossum <guido@python.org>
parents: 2120
diff changeset
1498 "ll|l;range() requires 1-3 int arguments",
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1499 &ilow, &ihigh, &istep)) {
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1500 PyErr_Clear();
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1501 return handle_range_longs(self, args);
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1502 }
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1503 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1504 if (istep == 0) {
28583
a0c002050526 Patch by Chad Netzer (with significant change):
Guido van Rossum <guido@python.org>
parents: 28513
diff changeset
1505 PyErr_SetString(PyExc_ValueError,
28738
52f3d90c17e8 complete and clarify some error messages for range()
Alex Martelli <aleaxit@gmail.com>
parents: 28718
diff changeset
1506 "range() step argument must not be zero");
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1507 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1508 }
10279
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1509 if (istep > 0)
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1510 bign = get_len_of_range(ilow, ihigh, istep);
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1511 else
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1512 bign = get_len_of_range(ihigh, ilow, -istep);
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1513 n = (int)bign;
886ea255f381 Patch by Tim Peters to improve the range checks for range() and
Guido van Rossum <guido@python.org>
parents: 10020
diff changeset
1514 if (bign < 0 || (long)n != bign) {
9849
5e9ef9d8575b Avoid overflow if possible in calculations for range(); report
Guido van Rossum <guido@python.org>
parents: 9567
diff changeset
1515 PyErr_SetString(PyExc_OverflowError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
1516 "range() result has too many items");
9849
5e9ef9d8575b Avoid overflow if possible in calculations for range(); report
Guido van Rossum <guido@python.org>
parents: 9567
diff changeset
1517 return NULL;
5e9ef9d8575b Avoid overflow if possible in calculations for range(); report
Guido van Rossum <guido@python.org>
parents: 9567
diff changeset
1518 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1519 v = PyList_New(n);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1520 if (v == NULL)
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1521 return NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1522 for (i = 0; i < n; i++) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1523 PyObject *w = PyInt_FromLong(ilow);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1524 if (w == NULL) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1525 Py_DECREF(v);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1526 return NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1527 }
8138
9d0310143600 Fred's right -- we need PyList_SET_ITEM().
Guido van Rossum <guido@python.org>
parents: 8132
diff changeset
1528 PyList_SET_ITEM(v, i, w);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1529 ilow += istep;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1530 }
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1531 return v;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1532 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1533
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1534 PyDoc_STRVAR(range_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1535 "range([start,] stop[, step]) -> list of integers\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1536 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1537 Return a list containing an arithmetic progression of integers.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1538 range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1539 When step is given, it specifies the increment (or decrement).\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1540 For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1541 These are exactly the valid indices for a list of 4 elements.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1542
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1543
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1544 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1545 builtin_raw_input(PyObject *self, PyObject *args)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1546 {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1547 PyObject *v = NULL;
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1548 PyObject *fin = PySys_GetObject("stdin");
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1549 PyObject *fout = PySys_GetObject("stdout");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1550
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1551 if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v))
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1552 return NULL;
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1553
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1554 if (fin == NULL) {
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
1555 PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdin");
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1556 return NULL;
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1557 }
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1558 if (fout == NULL) {
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
1559 PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdout");
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1560 return NULL;
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1561 }
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1562 if (PyFile_SoftSpace(fout, 0)) {
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1563 if (PyFile_WriteString(" ", fout) != 0)
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1564 return NULL;
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1565 }
25924
dc4a0336a2a3 Patch #512981: Update readline input stream on sys.stdin/out change.
Martin v. Löwis <martin@v.loewis.de>
parents: 25046
diff changeset
1566 if (PyFile_Check (fin) && PyFile_Check (fout)
dc4a0336a2a3 Patch #512981: Update readline input stream on sys.stdin/out change.
Martin v. Löwis <martin@v.loewis.de>
parents: 25046
diff changeset
1567 && isatty(fileno(PyFile_AsFile(fin)))
dc4a0336a2a3 Patch #512981: Update readline input stream on sys.stdin/out change.
Martin v. Löwis <martin@v.loewis.de>
parents: 25046
diff changeset
1568 && isatty(fileno(PyFile_AsFile(fout)))) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1569 PyObject *po;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1570 char *prompt;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1571 char *s;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1572 PyObject *result;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1573 if (v != NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1574 po = PyObject_Str(v);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1575 if (po == NULL)
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1576 return NULL;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1577 prompt = PyString_AsString(po);
8560
46fd630dce63 In raw_input(prompt), make sure that str(prompt) really a string
Guido van Rossum <guido@python.org>
parents: 8451
diff changeset
1578 if (prompt == NULL)
46fd630dce63 In raw_input(prompt), make sure that str(prompt) really a string
Guido van Rossum <guido@python.org>
parents: 8451
diff changeset
1579 return NULL;
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1580 }
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1581 else {
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1582 po = NULL;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1583 prompt = "";
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1584 }
25924
dc4a0336a2a3 Patch #512981: Update readline input stream on sys.stdin/out change.
Martin v. Löwis <martin@v.loewis.de>
parents: 25046
diff changeset
1585 s = PyOS_Readline(PyFile_AsFile (fin), PyFile_AsFile (fout),
dc4a0336a2a3 Patch #512981: Update readline input stream on sys.stdin/out change.
Martin v. Löwis <martin@v.loewis.de>
parents: 25046
diff changeset
1586 prompt);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1587 Py_XDECREF(po);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1588 if (s == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1589 PyErr_SetNone(PyExc_KeyboardInterrupt);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1590 return NULL;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1591 }
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1592 if (*s == '\0') {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1593 PyErr_SetNone(PyExc_EOFError);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1594 result = NULL;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1595 }
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1596 else { /* strip trailing '\n' */
13078
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1597 size_t len = strlen(s);
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1598 if (len > INT_MAX) {
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1599 PyErr_SetString(PyExc_OverflowError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
1600 "[raw_]input: input too long");
13078
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1601 result = NULL;
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1602 }
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1603 else {
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1604 result = PyString_FromStringAndSize(s,
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1605 (int)(len-1));
13078
1d0407960953 Trent Mick:
Guido van Rossum <guido@python.org>
parents: 12961
diff changeset
1606 }
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1607 }
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12572
diff changeset
1608 PyMem_FREE(s);
2808
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1609 return result;
9318ac51691e added locals() and globals(); [raw_]input() uses readline()
Guido van Rossum <guido@python.org>
parents: 2375
diff changeset
1610 }
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 253
diff changeset
1611 if (v != NULL) {
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1612 if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0)
284
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 253
diff changeset
1613 return NULL;
6ac402023cac printobject now returns an error code
Guido van Rossum <guido@python.org>
parents: 253
diff changeset
1614 }
24817
3ae8e3ff7e3f Patch #550192: Set softspace to 0 in raw_input().
Martin v. Löwis <martin@v.loewis.de>
parents: 24737
diff changeset
1615 return PyFile_GetLine(fin, -1);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1616 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1617
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1618 PyDoc_STRVAR(raw_input_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1619 "raw_input([prompt]) -> string\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1620 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1621 Read a string from standard input. The trailing newline is stripped.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1622 If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1623 On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1624 is printed without a trailing newline before reading.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1625
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1626
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1627 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1628 builtin_reduce(PyObject *self, PyObject *args)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1629 {
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1630 PyObject *seq, *func, *result = NULL, *it;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1631
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1632 if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1633 return NULL;
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1634 if (result != NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1635 Py_INCREF(result);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1636
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1637 it = PyObject_GetIter(seq);
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1638 if (it == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1639 PyErr_SetString(PyExc_TypeError,
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1640 "reduce() arg 2 must support iteration");
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1641 Py_XDECREF(result);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1642 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1643 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1644
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1645 if ((args = PyTuple_New(2)) == NULL)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1646 goto Fail;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1647
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1648 for (;;) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1649 PyObject *op2;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1650
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1651 if (args->ob_refcnt > 1) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1652 Py_DECREF(args);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1653 if ((args = PyTuple_New(2)) == NULL)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1654 goto Fail;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1655 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1656
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1657 op2 = PyIter_Next(it);
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1658 if (op2 == NULL) {
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1659 if (PyErr_Occurred())
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1660 goto Fail;
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17677
diff changeset
1661 break;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1662 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1663
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1664 if (result == NULL)
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1665 result = op2;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1666 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1667 PyTuple_SetItem(args, 0, result);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1668 PyTuple_SetItem(args, 1, op2);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1669 if ((result = PyEval_CallObject(func, args)) == NULL)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1670 goto Fail;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1671 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1672 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1673
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1674 Py_DECREF(args);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1675
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1676 if (result == NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1677 PyErr_SetString(PyExc_TypeError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
1678 "reduce() of empty sequence with no initial value");
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1679
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1680 Py_DECREF(it);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1681 return result;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1682
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1683 Fail:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1684 Py_XDECREF(args);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1685 Py_XDECREF(result);
17677
bf7f166d3c97 Generalize reduce() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17675
diff changeset
1686 Py_DECREF(it);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1687 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1688 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
1689
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1690 PyDoc_STRVAR(reduce_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1691 "reduce(function, sequence[, initial]) -> value\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1692 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1693 Apply a function of two arguments cumulatively to the items of a sequence,\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1694 from left to right, so as to reduce the sequence to a single value.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1695 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1696 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1697 of the sequence in the calculation, and serves as a default when the\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1698 sequence is empty.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1699
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1700
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1701 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1702 builtin_reload(PyObject *self, PyObject *v)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1703 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1704 return PyImport_ReloadModule(v);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1705 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
1706
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1707 PyDoc_STRVAR(reload_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1708 "reload(module) -> module\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1709 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1710 Reload the module. The module must have been successfully imported before.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1711
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1712
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1713 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
1714 builtin_repr(PyObject *self, PyObject *v)
1094
d2af6bdcb6d0 * config.c: Added audioop to lists.
Guido van Rossum <guido@python.org>
parents: 1079
diff changeset
1715 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1716 return PyObject_Repr(v);
1094
d2af6bdcb6d0 * config.c: Added audioop to lists.
Guido van Rossum <guido@python.org>
parents: 1079
diff changeset
1717 }
d2af6bdcb6d0 * config.c: Added audioop to lists.
Guido van Rossum <guido@python.org>
parents: 1079
diff changeset
1718
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1719 PyDoc_STRVAR(repr_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1720 "repr(object) -> string\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1721 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1722 Return the canonical string representation of the object.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1723 For most object types, eval(repr(object)) == object.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1724
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1725
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1726 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1727 builtin_round(PyObject *self, PyObject *args)
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1728 {
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1729 double x;
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1730 double f;
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1731 int ndigits = 0;
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1732 int i;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1733
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1734 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1735 return NULL;
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1736 f = 1.0;
8287
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1737 i = abs(ndigits);
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1738 while (--i >= 0)
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1739 f = f*10.0;
8287
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1740 if (ndigits < 0)
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1741 x /= f;
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1742 else
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1743 x *= f;
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1744 if (x >= 0.0)
8287
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1745 x = floor(x + 0.5);
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1746 else
8287
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1747 x = ceil(x - 0.5);
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1748 if (ndigits < 0)
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1749 x *= f;
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1750 else
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1751 x /= f;
d3bf3c2ad75a Implement round() slightly different, so that for negative ndigits no
Guido van Rossum <guido@python.org>
parents: 8138
diff changeset
1752 return PyFloat_FromDouble(x);
1215
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1753 }
9d6cf529bb71 bltinmodule.c: added round(x, [n]); coerce() of two class instances
Guido van Rossum <guido@python.org>
parents: 1096
diff changeset
1754
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1755 PyDoc_STRVAR(round_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1756 "round(number[, ndigits]) -> floating point number\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1757 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1758 Round a number to a given precision in decimal digits (default 0 digits).\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1759 This always returns a floating point number. Precision may be negative.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1760
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1761
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1762 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1763 builtin_vars(PyObject *self, PyObject *args)
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1764 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1765 PyObject *v = NULL;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1766 PyObject *d;
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1767
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1768 if (!PyArg_UnpackTuple(args, "vars", 0, 1, &v))
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2002
diff changeset
1769 return NULL;
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1770 if (v == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1771 d = PyEval_GetLocals();
2857
eebbdbee54f9 be more suspicious of getlocals()
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
1772 if (d == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1773 if (!PyErr_Occurred())
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1774 PyErr_SetString(PyExc_SystemError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
1775 "vars(): no locals!?");
2857
eebbdbee54f9 be more suspicious of getlocals()
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
1776 }
eebbdbee54f9 be more suspicious of getlocals()
Guido van Rossum <guido@python.org>
parents: 2844
diff changeset
1777 else
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1778 Py_INCREF(d);
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1779 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1780 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1781 d = PyObject_GetAttrString(v, "__dict__");
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1782 if (d == NULL) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
1783 PyErr_SetString(PyExc_TypeError,
1840
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1784 "vars() argument must have __dict__ attribute");
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1785 return NULL;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1786 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1787 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1788 return d;
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1789 }
bfd11620a2d8 * Python/bltinmodule.c (builtin_vars): correct typo in error msg
Guido van Rossum <guido@python.org>
parents: 1444
diff changeset
1790
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1791 PyDoc_STRVAR(vars_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1792 "vars([object]) -> dictionary\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1793 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1794 Without arguments, equivalent to locals().\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1795 With an argument, equivalent to object.__dict__.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1796
28717
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1797
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1798 static PyObject*
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1799 builtin_sum(PyObject *self, PyObject *args)
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1800 {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1801 PyObject *seq;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1802 PyObject *result = NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1803 PyObject *temp, *item, *iter;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1804
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1805 if (!PyArg_ParseTuple(args, "O|O:sum", &seq, &result))
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1806 return NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1807
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1808 iter = PyObject_GetIter(seq);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1809 if (iter == NULL)
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1810 return NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1811
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1812 if (result == NULL) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1813 result = PyInt_FromLong(0);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1814 if (result == NULL) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1815 Py_DECREF(iter);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1816 return NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1817 }
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1818 } else {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1819 /* reject string values for 'start' parameter */
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1820 if (PyObject_TypeCheck(result, &PyBaseString_Type)) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1821 PyErr_SetString(PyExc_TypeError,
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
1822 "sum() can't sum strings [use ''.join(seq) instead]");
28717
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1823 Py_DECREF(iter);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1824 return NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1825 }
28718
16ef5b9bc789 fixed a potential refcount bug (thanks Raymond!).
Alex Martelli <aleaxit@gmail.com>
parents: 28717
diff changeset
1826 Py_INCREF(result);
28717
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1827 }
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1828
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1829 for(;;) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1830 item = PyIter_Next(iter);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1831 if (item == NULL) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1832 /* error, or end-of-sequence */
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1833 if (PyErr_Occurred()) {
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1834 Py_DECREF(result);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1835 result = NULL;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1836 }
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1837 break;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1838 }
30783
4833a9cd377e regressing the performance bugfix -- Guido wants the performance bug left
Alex Martelli <aleaxit@gmail.com>
parents: 30775
diff changeset
1839 temp = PyNumber_Add(result, item);
28717
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1840 Py_DECREF(result);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1841 Py_DECREF(item);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1842 result = temp;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1843 if (result == NULL)
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1844 break;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1845 }
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1846 Py_DECREF(iter);
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1847 return result;
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1848 }
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1849
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1850 PyDoc_STRVAR(sum_doc,
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1851 "sum(sequence, start=0) -> value\n\
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1852 \n\
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1853 Returns the sum of a sequence of numbers (NOT strings) plus the value\n\
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1854 of parameter 'start'. When the sequence is empty, returns start.");
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1855
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
1856
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1857 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1858 builtin_isinstance(PyObject *self, PyObject *args)
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1859 {
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1860 PyObject *inst;
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1861 PyObject *cls;
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1862 int retval;
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1863
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1864 if (!PyArg_UnpackTuple(args, "isinstance", 2, 2, &inst, &cls))
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1865 return NULL;
10995
0d186c10a70e Patch by Jim Fulton (code style tweaked a bit) to support
Guido van Rossum <guido@python.org>
parents: 10529
diff changeset
1866
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1867 retval = PyObject_IsInstance(inst, cls);
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1868 if (retval < 0)
15829
9308dc8c85e0 (Modified) patch by Ping - SF Patch #102681.
Guido van Rossum <guido@python.org>
parents: 15727
diff changeset
1869 return NULL;
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
1870 return PyBool_FromLong(retval);
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1871 }
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1872
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1873 PyDoc_STRVAR(isinstance_doc,
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
1874 "isinstance(object, class-or-type-or-tuple) -> bool\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1875 \n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1876 Return whether an object is an instance of a class or of a subclass thereof.\n\
20307
aa681345bfab Implement isinstance(x, (A, B, ...)). Note that we only allow tuples,
Guido van Rossum <guido@python.org>
parents: 19903
diff changeset
1877 With a type as second argument, return whether that is the object's type.\n\
aa681345bfab Implement isinstance(x, (A, B, ...)). Note that we only allow tuples,
Guido van Rossum <guido@python.org>
parents: 19903
diff changeset
1878 The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1879 isinstance(x, A) or isinstance(x, B) or ... (etc.).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1880
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1881
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1882 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
1883 builtin_issubclass(PyObject *self, PyObject *args)
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1884 {
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1885 PyObject *derived;
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1886 PyObject *cls;
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1887 int retval;
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1888
26818
e094a03a80ff SF patch #659536: Use PyArg_UnpackTuple where possible.
Raymond Hettinger <python@rcn.com>
parents: 26612
diff changeset
1889 if (!PyArg_UnpackTuple(args, "issubclass", 2, 2, &derived, &cls))
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1890 return NULL;
10995
0d186c10a70e Patch by Jim Fulton (code style tweaked a bit) to support
Guido van Rossum <guido@python.org>
parents: 10529
diff changeset
1891
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1892 retval = PyObject_IsSubclass(derived, cls);
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1893 if (retval < 0)
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 16048
diff changeset
1894 return NULL;
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
1895 return PyBool_FromLong(retval);
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1896 }
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1897
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
1898 PyDoc_STRVAR(issubclass_doc,
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
1899 "issubclass(C, B) -> bool\n\
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1900 \n\
26612
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 25924
diff changeset
1901 Return whether class C is a subclass (i.e., a derived class) of class B.\n\
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 25924
diff changeset
1902 When using a tuple as the second argument issubclass(X, (A, B, ...)),\n\
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 25924
diff changeset
1903 is a shortcut for issubclass(X, A) or issubclass(X, B) or ... (etc.).");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
1904
6145
341fcb7bad90 Two new built-in functions: issubclass() and isinstance(). Both take
Barry Warsaw <barry@python.org>
parents: 5926
diff changeset
1905
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1906 static PyObject*
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1907 builtin_zip(PyObject *self, PyObject *args)
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1908 {
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1909 PyObject *ret;
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1910 const int itemsize = PySequence_Length(args);
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1911 int i;
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1912 PyObject *itlist; /* tuple of iterators */
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1913 int len; /* guess at result length */
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1914
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1915 if (itemsize < 1) {
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1916 PyErr_SetString(PyExc_TypeError,
15318
8aa947e1eee8 Ka-Ping Yee <ping@lfw.org>:
Fred Drake <fdrake@acm.org>
parents: 14869
diff changeset
1917 "zip() requires at least one sequence");
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1918 return NULL;
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1919 }
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1920 /* args must be a tuple */
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1921 assert(PyTuple_Check(args));
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1922
23421
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1923 /* Guess at result length: the shortest of the input lengths.
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1924 If some argument refuses to say, we refuse to guess too, lest
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1925 an argument like xrange(sys.maxint) lead us astray.*/
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1926 len = -1; /* unknown */
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1927 for (i = 0; i < itemsize; ++i) {
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1928 PyObject *item = PyTuple_GET_ITEM(args, i);
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1929 int thislen = PySequence_Length(item);
23421
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1930 if (thislen < 0) {
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1931 PyErr_Clear();
23421
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1932 len = -1;
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1933 break;
642a453e7a2e SF bug 555042: zip() may trigger MemoryError.
Tim Peters <tim.peters@gmail.com>
parents: 23305
diff changeset
1934 }
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1935 else if (len < 0 || thislen < len)
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1936 len = thislen;
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1937 }
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1938
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1939 /* allocate result list */
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1940 if (len < 0)
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1941 len = 10; /* arbitrary */
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1942 if ((ret = PyList_New(len)) == NULL)
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1943 return NULL;
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1944
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1945 /* obtain iterators */
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1946 itlist = PyTuple_New(itemsize);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1947 if (itlist == NULL)
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1948 goto Fail_ret;
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1949 for (i = 0; i < itemsize; ++i) {
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1950 PyObject *item = PyTuple_GET_ITEM(args, i);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1951 PyObject *it = PyObject_GetIter(item);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1952 if (it == NULL) {
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1953 if (PyErr_ExceptionMatches(PyExc_TypeError))
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1954 PyErr_Format(PyExc_TypeError,
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1955 "zip argument #%d must support iteration",
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1956 i+1);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1957 goto Fail_ret_itlist;
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1958 }
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1959 PyTuple_SET_ITEM(itlist, i, it);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1960 }
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1961
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1962 /* build result into ret list */
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1963 for (i = 0; ; ++i) {
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1964 int j;
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1965 PyObject *next = PyTuple_New(itemsize);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1966 if (!next)
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1967 goto Fail_ret_itlist;
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1968
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1969 for (j = 0; j < itemsize; j++) {
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1970 PyObject *it = PyTuple_GET_ITEM(itlist, j);
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1971 PyObject *item = PyIter_Next(it);
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1972 if (!item) {
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1973 if (PyErr_Occurred()) {
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1974 Py_DECREF(ret);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1975 ret = NULL;
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1976 }
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1977 Py_DECREF(next);
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1978 Py_DECREF(itlist);
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1979 goto Done;
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1980 }
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1981 PyTuple_SET_ITEM(next, j, item);
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1982 }
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1983
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1984 if (i < len)
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1985 PyList_SET_ITEM(ret, i, next);
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1986 else {
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1987 int status = PyList_Append(ret, next);
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1988 Py_DECREF(next);
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1989 ++len;
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1990 if (status < 0)
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1991 goto Fail_ret_itlist;
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1992 }
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
1993 }
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
1994
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1995 Done:
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1996 if (ret != NULL && i < len) {
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1997 /* The list is too big. */
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1998 if (PyList_SetSlice(ret, i, len, NULL) < 0)
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
1999 return NULL;
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
2000 }
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
2001 return ret;
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
2002
17694
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2003 Fail_ret_itlist:
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2004 Py_DECREF(itlist);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2005 Fail_ret:
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2006 Py_DECREF(ret);
aab6c1f19289 Generalize zip() to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2007 return NULL;
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2008 }
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2009
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2010
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
2011 PyDoc_STRVAR(zip_doc,
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2012 "zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2013 \n\
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2014 Return a list of tuples, where each tuple contains the i-th element\n\
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2015 from each of the argument sequences. The returned list is truncated\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
2016 in length to the length of the shortest argument sequence.");
13822
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2017
c57b574e6766 Both PEP 201 Lockstep Iteration and SF patch #101030 have been
Barry Warsaw <barry@python.org>
parents: 13761
diff changeset
2018
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2019 static PyMethodDef builtin_methods[] = {
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2020 {"__import__", builtin___import__, METH_VARARGS, import_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2021 {"abs", builtin_abs, METH_O, abs_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2022 {"apply", builtin_apply, METH_VARARGS, apply_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2023 {"callable", builtin_callable, METH_O, callable_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2024 {"chr", builtin_chr, METH_VARARGS, chr_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2025 {"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2026 {"coerce", builtin_coerce, METH_VARARGS, coerce_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2027 {"compile", builtin_compile, METH_VARARGS, compile_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2028 {"delattr", builtin_delattr, METH_VARARGS, delattr_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2029 {"dir", builtin_dir, METH_VARARGS, dir_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2030 {"divmod", builtin_divmod, METH_VARARGS, divmod_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2031 {"eval", builtin_eval, METH_VARARGS, eval_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2032 {"execfile", builtin_execfile, METH_VARARGS, execfile_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2033 {"filter", builtin_filter, METH_VARARGS, filter_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2034 {"getattr", builtin_getattr, METH_VARARGS, getattr_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2035 {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2036 {"hasattr", builtin_hasattr, METH_VARARGS, hasattr_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2037 {"hash", builtin_hash, METH_O, hash_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2038 {"hex", builtin_hex, METH_O, hex_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2039 {"id", builtin_id, METH_O, id_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2040 {"input", builtin_input, METH_VARARGS, input_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2041 {"intern", builtin_intern, METH_VARARGS, intern_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2042 {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2043 {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2044 {"iter", builtin_iter, METH_VARARGS, iter_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2045 {"len", builtin_len, METH_O, len_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2046 {"locals", (PyCFunction)builtin_locals, METH_NOARGS, locals_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2047 {"map", builtin_map, METH_VARARGS, map_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2048 {"max", builtin_max, METH_VARARGS, max_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2049 {"min", builtin_min, METH_VARARGS, min_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2050 {"oct", builtin_oct, METH_O, oct_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2051 {"ord", builtin_ord, METH_O, ord_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2052 {"pow", builtin_pow, METH_VARARGS, pow_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2053 {"range", builtin_range, METH_VARARGS, range_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2054 {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2055 {"reduce", builtin_reduce, METH_VARARGS, reduce_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2056 {"reload", builtin_reload, METH_O, reload_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2057 {"repr", builtin_repr, METH_O, repr_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2058 {"round", builtin_round, METH_VARARGS, round_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2059 {"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
28717
13d0a3c4e465 Adding new built-in function sum, with docs and tests.
Alex Martelli <aleaxit@gmail.com>
parents: 28612
diff changeset
2060 {"sum", builtin_sum, METH_VARARGS, sum_doc},
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
2061 #ifdef Py_USING_UNICODE
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2062 {"unichr", builtin_unichr, METH_VARARGS, unichr_doc},
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
2063 #endif
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2064 {"vars", builtin_vars, METH_VARARGS, vars_doc},
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 19061
diff changeset
2065 {"zip", builtin_zip, METH_VARARGS, zip_doc},
480
c64c6702549d Added "apply"; added "SyntaxError"; changed table lay-out.
Guido van Rossum <guido@python.org>
parents: 463
diff changeset
2066 {NULL, NULL},
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2067 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2068
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
2069 PyDoc_STRVAR(builtin_doc,
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2070 "Built-in functions, exceptions, and other objects.\n\
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2071 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23695
diff changeset
2072 Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.");
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2073
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2074 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
2075 _PyBuiltin_Init(void)
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2076 {
12961
eb911eca9ee9 Christopher Fandrich <cfandrich@8cs.com>:
Fred Drake <fdrake@acm.org>
parents: 12756
diff changeset
2077 PyObject *mod, *dict, *debug;
8561
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2078 mod = Py_InitModule4("__builtin__", builtin_methods,
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2079 builtin_doc, (PyObject *)NULL,
8973e7085cf4 Added doc strings.
Guido van Rossum <guido@python.org>
parents: 8560
diff changeset
2080 PYTHON_API_VERSION);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2081 if (mod == NULL)
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2082 return NULL;
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2083 dict = PyModule_GetDict(mod);
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2084
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2085 #ifdef Py_TRACE_REFS
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2086 /* __builtin__ exposes a number of statically allocated objects
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2087 * that, before this code was added in 2.3, never showed up in
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2088 * the list of "all objects" maintained by Py_TRACE_REFS. As a
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2089 * result, programs leaking references to None and False (etc)
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2090 * couldn't be diagnosed by examining sys.getobjects(0).
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2091 */
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2092 #define ADD_TO_ALL(OBJECT) _Py_AddToAllObjects((PyObject *)(OBJECT), 0)
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2093 #else
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2094 #define ADD_TO_ALL(OBJECT) (void)0
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2095 #endif
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2096
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2097 #define SETBUILTIN(NAME, OBJECT) \
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2098 if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0) \
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2099 return NULL; \
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2100 ADD_TO_ALL(OBJECT)
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2101
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2102 SETBUILTIN("None", Py_None);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2103 SETBUILTIN("Ellipsis", Py_Ellipsis);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2104 SETBUILTIN("NotImplemented", Py_NotImplemented);
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
2105 SETBUILTIN("False", Py_False);
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
2106 SETBUILTIN("True", Py_True);
23597
ed007e47b3a1 Change name from string to basestring
Neal Norwitz <nnorwitz@gmail.com>
parents: 23542
diff changeset
2107 SETBUILTIN("basestring", &PyBaseString_Type);
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
2108 SETBUILTIN("bool", &PyBool_Type);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
2109 SETBUILTIN("buffer", &PyBuffer_Type);
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2110 SETBUILTIN("classmethod", &PyClassMethod_Type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18890
diff changeset
2111 #ifndef WITHOUT_COMPLEX
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2112 SETBUILTIN("complex", &PyComplex_Type);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18890
diff changeset
2113 #endif
20754
272336648d1f Rename "dictionary" (type and constructor) to "dict".
Tim Peters <tim.peters@gmail.com>
parents: 20654
diff changeset
2114 SETBUILTIN("dict", &PyDict_Type);
23305
ef6e31f0cee1 builtin_zip(): Take a good guess at how big the result list will be,
Tim Peters <tim.peters@gmail.com>
parents: 23295
diff changeset
2115 SETBUILTIN("enumerate", &PyEnum_Type);
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2116 SETBUILTIN("float", &PyFloat_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2117 SETBUILTIN("property", &PyProperty_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2118 SETBUILTIN("int", &PyInt_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2119 SETBUILTIN("list", &PyList_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2120 SETBUILTIN("long", &PyLong_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2121 SETBUILTIN("object", &PyBaseObject_Type);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23832
diff changeset
2122 SETBUILTIN("slice", &PySlice_Type);
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2123 SETBUILTIN("staticmethod", &PyStaticMethod_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2124 SETBUILTIN("str", &PyString_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2125 SETBUILTIN("super", &PySuper_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2126 SETBUILTIN("tuple", &PyTuple_Type);
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2127 SETBUILTIN("type", &PyType_Type);
23695
6266f1bd1ab9 Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents: 23597
diff changeset
2128 SETBUILTIN("xrange", &PyRange_Type);
19903
c082971823ce Get rid of builtin_open() entirely (the C code and docstring, not the
Tim Peters <tim.peters@gmail.com>
parents: 19902
diff changeset
2129
c082971823ce Get rid of builtin_open() entirely (the C code and docstring, not the
Tim Peters <tim.peters@gmail.com>
parents: 19902
diff changeset
2130 /* Note that open() is just an alias of file(). */
c082971823ce Get rid of builtin_open() entirely (the C code and docstring, not the
Tim Peters <tim.peters@gmail.com>
parents: 19902
diff changeset
2131 SETBUILTIN("open", &PyFile_Type);
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2132 SETBUILTIN("file", &PyFile_Type);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
2133 #ifdef Py_USING_UNICODE
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2134 SETBUILTIN("unicode", &PyUnicode_Type);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19301
diff changeset
2135 #endif
22785
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22205
diff changeset
2136 debug = PyBool_FromLong(Py_OptimizeFlag == 0);
12961
eb911eca9ee9 Christopher Fandrich <cfandrich@8cs.com>:
Fred Drake <fdrake@acm.org>
parents: 12756
diff changeset
2137 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
eb911eca9ee9 Christopher Fandrich <cfandrich@8cs.com>:
Fred Drake <fdrake@acm.org>
parents: 12756
diff changeset
2138 Py_XDECREF(debug);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2139 return NULL;
12961
eb911eca9ee9 Christopher Fandrich <cfandrich@8cs.com>:
Fred Drake <fdrake@acm.org>
parents: 12756
diff changeset
2140 }
eb911eca9ee9 Christopher Fandrich <cfandrich@8cs.com>:
Fred Drake <fdrake@acm.org>
parents: 12756
diff changeset
2141 Py_XDECREF(debug);
6198
c43ca8dd0081 Removed obsolete exception PyExc_AccessError.
Barry Warsaw <barry@python.org>
parents: 6145
diff changeset
2142
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
2143 return mod;
28396
d56282c28a1e Improved new Py_TRACE_REFS gimmicks.
Tim Peters <tim.peters@gmail.com>
parents: 28027
diff changeset
2144 #undef ADD_TO_ALL
19902
de39956b5458 _PyBuiltin_Init(): For clarity, macroize this purely repetitive code.
Tim Peters <tim.peters@gmail.com>
parents: 19894
diff changeset
2145 #undef SETBUILTIN
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2146 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents:
diff changeset
2147
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1387
diff changeset
2148 /* Helper for filter(): filter a tuple through a function */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2149
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2150 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
2151 filtertuple(PyObject *func, PyObject *tuple)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2152 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2153 PyObject *result;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2154 register int i, j;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2155 int len = PyTuple_Size(tuple);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2156
2890
04e1690fb4d1 avoid resize of 0-length tuple
Guido van Rossum <guido@python.org>
parents: 2857
diff changeset
2157 if (len == 0) {
27681
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2158 if (PyTuple_CheckExact(tuple))
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2159 Py_INCREF(tuple);
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2160 else
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2161 tuple = PyTuple_New(0);
2890
04e1690fb4d1 avoid resize of 0-length tuple
Guido van Rossum <guido@python.org>
parents: 2857
diff changeset
2162 return tuple;
04e1690fb4d1 avoid resize of 0-length tuple
Guido van Rossum <guido@python.org>
parents: 2857
diff changeset
2163 }
04e1690fb4d1 avoid resize of 0-length tuple
Guido van Rossum <guido@python.org>
parents: 2857
diff changeset
2164
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2165 if ((result = PyTuple_New(len)) == NULL)
1387
f992ac2a38d5 * rangeobject.{c,h}, bltinmodule.c: removed non-essential ops from range
Guido van Rossum <guido@python.org>
parents: 1380
diff changeset
2166 return NULL;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2167
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2168 for (i = j = 0; i < len; ++i) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2169 PyObject *item, *good;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2170 int ok;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2171
27795
2042e2051d97 Change filtertuple() to use tp_as_sequence->sq_item
Walter Dörwald <walter@livinglogic.de>
parents: 27790
diff changeset
2172 if (tuple->ob_type->tp_as_sequence &&
2042e2051d97 Change filtertuple() to use tp_as_sequence->sq_item
Walter Dörwald <walter@livinglogic.de>
parents: 27790
diff changeset
2173 tuple->ob_type->tp_as_sequence->sq_item) {
2042e2051d97 Change filtertuple() to use tp_as_sequence->sq_item
Walter Dörwald <walter@livinglogic.de>
parents: 27790
diff changeset
2174 item = tuple->ob_type->tp_as_sequence->sq_item(tuple, i);
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2175 if (item == NULL)
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2176 goto Fail_1;
27795
2042e2051d97 Change filtertuple() to use tp_as_sequence->sq_item
Walter Dörwald <walter@livinglogic.de>
parents: 27790
diff changeset
2177 } else {
28740
d3297e298211 some more error-message enhancements
Alex Martelli <aleaxit@gmail.com>
parents: 28738
diff changeset
2178 PyErr_SetString(PyExc_TypeError, "filter(): unsubscriptable tuple");
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2179 goto Fail_1;
27795
2042e2051d97 Change filtertuple() to use tp_as_sequence->sq_item
Walter Dörwald <walter@livinglogic.de>
parents: 27790
diff changeset
2180 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2181 if (func == Py_None) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2182 Py_INCREF(item);
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2183 good = item;
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2184 }
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2185 else {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2186 PyObject *arg = Py_BuildValue("(O)", item);
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2187 if (arg == NULL) {
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2188 Py_DECREF(item);
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2189 goto Fail_1;
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2190 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2191 good = PyEval_CallObject(func, arg);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2192 Py_DECREF(arg);
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2193 if (good == NULL) {
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2194 Py_DECREF(item);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2195 goto Fail_1;
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2196 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2197 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2198 ok = PyObject_IsTrue(good);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2199 Py_DECREF(good);
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2200 if (ok) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2201 if (PyTuple_SetItem(result, j++, item) < 0)
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2202 goto Fail_1;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2203 }
30183
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2204 else
af5535b0e009 Backport checkin:
Walter Dörwald <walter@livinglogic.de>
parents: 28740
diff changeset
2205 Py_DECREF(item);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2206 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2207
17976
d579a5d8b3fe Cruft cleanup: Removed the unused last_is_sticky argument from the internal
Tim Peters <tim.peters@gmail.com>
parents: 17874
diff changeset
2208 if (_PyTuple_Resize(&result, j) < 0)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2209 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2210
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2211 return result;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2212
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2213 Fail_1:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2214 Py_DECREF(result);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2215 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2216 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2217
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2218
1393
7d6a2d950f13 * nismodule.c: database keys and values can contain null bytes. be more
Guido van Rossum <guido@python.org>
parents: 1387
diff changeset
2219 /* Helper for filter(): filter a string through a function */
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2220
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2221 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13576
diff changeset
2222 filterstring(PyObject *func, PyObject *strobj)
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2223 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2224 PyObject *result;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2225 register int i, j;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2226 int len = PyString_Size(strobj);
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2227 int outlen = len;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2228
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2229 if (func == Py_None) {
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2230 /* If it's a real string we can return the original,
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2231 * as no character is ever false and __getitem__
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2232 * does return this character. If it's a subclass
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2233 * we must go through the __getitem__ loop */
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2234 if (PyString_CheckExact(strobj)) {
27681
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2235 Py_INCREF(strobj);
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2236 return strobj;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2237 }
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2238 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2239 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
1387
f992ac2a38d5 * rangeobject.{c,h}, bltinmodule.c: removed non-essential ops from range
Guido van Rossum <guido@python.org>
parents: 1380
diff changeset
2240 return NULL;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2241
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2242 for (i = j = 0; i < len; ++i) {
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2243 PyObject *item;
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2244 int ok;
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2245
1375
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2246 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2247 if (item == NULL)
f3a325662d39 * listobject.c (list_ass_slice): XDECREF instead of DECREF so
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
2248 goto Fail_1;
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2249 if (func==Py_None) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2250 ok = 1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2251 } else {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2252 PyObject *arg, *good;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2253 arg = Py_BuildValue("(O)", item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2254 if (arg == NULL) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2255 Py_DECREF(item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2256 goto Fail_1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2257 }
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2258 good = PyEval_CallObject(func, arg);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2259 Py_DECREF(arg);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2260 if (good == NULL) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2261 Py_DECREF(item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2262 goto Fail_1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2263 }
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2264 ok = PyObject_IsTrue(good);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2265 Py_DECREF(good);
17337
96ea0eccdb31 SF patch #413552 - Premature decref on object
Tim Peters <tim.peters@gmail.com>
parents: 17125
diff changeset
2266 }
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2267 if (ok) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2268 int reslen;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2269 if (!PyString_Check(item)) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2270 PyErr_SetString(PyExc_TypeError, "can't filter str to str:"
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2271 " __getitem__ returned different type");
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2272 Py_DECREF(item);
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2273 goto Fail_1;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2274 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2275 reslen = PyString_GET_SIZE(item);
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2276 if (reslen == 1) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2277 PyString_AS_STRING(result)[j++] =
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2278 PyString_AS_STRING(item)[0];
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2279 } else {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2280 /* do we need more space? */
45618
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2281 int need = j;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2282
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2283 /* calculate space requirements while checking for overflow */
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2284 if (need > INT_MAX - reslen) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2285 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2286 goto Fail_1;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2287 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2288
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2289 need += reslen;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2290
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2291 if (need > INT_MAX - len) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2292 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2293 goto Fail_1;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2294 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2295
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2296 need += len;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2297
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2298 if (need <= i) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2299 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2300 goto Fail_1;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2301 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2302
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2303 need = need - i - 1;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2304
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2305 assert(need >= 0);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2306 assert(outlen >= 0);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2307
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2308 if (need > outlen) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2309 /* overallocate, to avoid reallocations */
45618
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2310 if (outlen > INT_MAX / 2) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2311 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2312 return NULL;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2313 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2314
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2315 if (need<2*outlen) {
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2316 need = 2*outlen;
45618
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2317 }
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2318 if (_PyString_Resize(&result, need)) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2319 Py_DECREF(item);
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2320 return NULL;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2321 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2322 outlen = need;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2323 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2324 memcpy(
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2325 PyString_AS_STRING(result) + j,
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2326 PyString_AS_STRING(item),
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2327 reslen
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2328 );
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2329 j += reslen;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2330 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2331 }
17337
96ea0eccdb31 SF patch #413552 - Premature decref on object
Tim Peters <tim.peters@gmail.com>
parents: 17125
diff changeset
2332 Py_DECREF(item);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2333 }
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2334
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2335 if (j < outlen)
23295
6fa76b4e59fe Repair widespread misuse of _PyString_Resize. Since it's clear people
Tim Peters <tim.peters@gmail.com>
parents: 23285
diff changeset
2336 _PyString_Resize(&result, j);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2337
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2338 return result;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2339
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2340 Fail_1:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5317
diff changeset
2341 Py_DECREF(result);
1369
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2342 return NULL;
89e1e5d9ccbf * compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents: 1360
diff changeset
2343 }
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2344
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2345 #ifdef Py_USING_UNICODE
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2346 /* Helper for filter(): filter a Unicode object through a function */
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2347
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2348 static PyObject *
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2349 filterunicode(PyObject *func, PyObject *strobj)
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2350 {
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2351 PyObject *result;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2352 register int i, j;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2353 int len = PyUnicode_GetSize(strobj);
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2354 int outlen = len;
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2355
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2356 if (func == Py_None) {
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2357 /* If it's a real string we can return the original,
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2358 * as no character is ever false and __getitem__
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2359 * does return this character. If it's a subclass
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2360 * we must go through the __getitem__ loop */
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2361 if (PyUnicode_CheckExact(strobj)) {
27681
e5454fe1aafd Make sure filter() never returns tuple, str or unicode
Walter Dörwald <walter@livinglogic.de>
parents: 27675
diff changeset
2362 Py_INCREF(strobj);
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2363 return strobj;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2364 }
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2365 }
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2366 if ((result = PyUnicode_FromUnicode(NULL, len)) == NULL)
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2367 return NULL;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2368
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2369 for (i = j = 0; i < len; ++i) {
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2370 PyObject *item, *arg, *good;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2371 int ok;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2372
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2373 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2374 if (item == NULL)
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2375 goto Fail_1;
27786
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2376 if (func == Py_None) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2377 ok = 1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2378 } else {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2379 arg = Py_BuildValue("(O)", item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2380 if (arg == NULL) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2381 Py_DECREF(item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2382 goto Fail_1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2383 }
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2384 good = PyEval_CallObject(func, arg);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2385 Py_DECREF(arg);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2386 if (good == NULL) {
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2387 Py_DECREF(item);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2388 goto Fail_1;
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2389 }
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2390 ok = PyObject_IsTrue(good);
f34446fa216e Change filterstring() and filterunicode(): If the
Walter Dörwald <walter@livinglogic.de>
parents: 27782
diff changeset
2391 Py_DECREF(good);
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2392 }
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2393 if (ok) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2394 int reslen;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2395 if (!PyUnicode_Check(item)) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2396 PyErr_SetString(PyExc_TypeError, "can't filter unicode to unicode:"
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2397 " __getitem__ returned different type");
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2398 Py_DECREF(item);
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2399 goto Fail_1;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2400 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2401 reslen = PyUnicode_GET_SIZE(item);
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2402 if (reslen == 1) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2403 PyUnicode_AS_UNICODE(result)[j++] =
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2404 PyUnicode_AS_UNICODE(item)[0];
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2405 } else {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2406 /* do we need more space? */
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2407 int need = j + reslen + len-i-1;
45618
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2408
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2409 /* check that didnt overflow */
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2410 if ((j > INT_MAX - reslen) ||
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2411 ((j + reslen) > INT_MAX - len) ||
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2412 ((j + reslen + len) < i) ||
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2413 ((j + reslen + len - i) <= 0)) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2414 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2415 return NULL;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2416 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2417
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2418 assert(need >= 0);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2419 assert(outlen >= 0);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2420
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2421 if (need > outlen) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2422 /* overallocate, to avoid reallocations */
45618
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2423 if (need < 2 * outlen) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2424 if (outlen > INT_MAX / 2) {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2425 Py_DECREF(item);
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2426 return NULL;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2427 } else {
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2428 need = 2 * outlen;
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2429 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2430 }
88c1e17ceffc Backport of r61180:
Martin v. Löwis <martin@v.loewis.de>
parents: 33262
diff changeset
2431
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2432 if (PyUnicode_Resize(&result, need)) {
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2433 Py_DECREF(item);
27675
8f8448fb58d6 PyUnicode_Resize() doesn't free its argument in case of a failure,
Walter Dörwald <walter@livinglogic.de>
parents: 27674
diff changeset
2434 goto Fail_1;
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2435 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2436 outlen = need;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2437 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2438 memcpy(
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2439 PyUnicode_AS_UNICODE(result) + j,
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2440 PyUnicode_AS_UNICODE(item),
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2441 reslen*sizeof(Py_UNICODE)
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2442 );
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2443 j += reslen;
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2444 }
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2445 }
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2446 Py_DECREF(item);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2447 }
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2448
27674
ce3faab06de7 filterstring() and filterunicode() in Python/bltinmodule.c
Walter Dörwald <walter@livinglogic.de>
parents: 27652
diff changeset
2449 if (j < outlen)
27385
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2450 PyUnicode_Resize(&result, j);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2451
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2452 return result;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2453
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2454 Fail_1:
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2455 Py_DECREF(result);
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2456 return NULL;
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2457 }
91a573243d5d Patch #636005: Filter unicode into unicode.
Martin v. Löwis <martin@v.loewis.de>
parents: 27076
diff changeset
2458 #endif