Mercurial > cpython-lru_cache-weakref
annotate Python/getargs.c @ 76333:4dce3afc392c
Issue #13959: Simplify imp.reload() by relying on a module's
__loader__.
Since import now sets __loader__ on all modules it creates and
imp.reload() already relied on the attribute for modules that import
didn't create, the only potential compatibility issue is if people
were deleting the attribute on modules and expecting imp.reload() to
continue to work.
| author | Brett Cannon <brett@python.org> |
|---|---|
| date | Sun, 15 Apr 2012 17:56:09 -0400 |
| parents | 052779d34945 |
| children | bc6d28e726d8 |
| rev | line source |
|---|---|
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* New getargs implementation */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
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" |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
4102
9569664ac347
Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents:
4026
diff
changeset
|
6 #include <ctype.h> |
|
9569664ac347
Add needed #include <ctype.h>
Guido van Rossum <guido@python.org>
parents:
4026
diff
changeset
|
7 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
9 #ifdef __cplusplus |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
10 extern "C" { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
11 #endif |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
12 int PyArg_Parse(PyObject *, const char *, ...); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
13 int PyArg_ParseTuple(PyObject *, const char *, ...); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
14 int PyArg_VaParse(PyObject *, const char *, va_list); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
15 |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13378
diff
changeset
|
16 int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
17 const char *, char **, ...); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
18 int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
19 const char *, char **, va_list); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
20 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
21 #ifdef HAVE_DECLSPEC_DLL |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
22 /* Export functions */ |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
23 PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
24 PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
25 PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
26 const char *, char **, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
27 PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
28 PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
29 PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
30 const char *, char **, va_list); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
31 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
32 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
33 #define FLAG_COMPAT 1 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
34 #define FLAG_SIZE_T 2 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
35 |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
36 typedef int (*destr_t)(PyObject *, void *); |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
37 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
38 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
39 /* Keep track of "objects" that have been allocated or initialized and |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
40 which will need to be deallocated or cleaned up somehow if overall |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
41 parsing fails. |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
42 */ |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
43 typedef struct { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
44 void *item; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
45 destr_t destructor; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
46 } freelistentry_t; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
47 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
48 typedef struct { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
49 int first_available; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
50 freelistentry_t *entries; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
51 } freelist_t; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
52 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 /* Forward */ |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
55 static int vgetargs1(PyObject *, const char *, va_list *, int); |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
56 static void seterror(int, const char *, int *, const char *, const char *); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
57 static char *convertitem(PyObject *, const char **, va_list *, int, int *, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
58 char *, size_t, freelist_t *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
59 static char *converttuple(PyObject *, const char **, va_list *, int, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
60 int *, char *, size_t, int, freelist_t *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
61 static char *convertsimple(PyObject *, const char **, va_list *, int, char *, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
62 size_t, freelist_t *); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
63 static Py_ssize_t convertbuffer(PyObject *, void **p, char **); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
64 static int getbuffer(PyObject *, Py_buffer *, char**); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
65 |
|
13447
a89f7f268de4
Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents:
13378
diff
changeset
|
66 static int vgetargskeywords(PyObject *, PyObject *, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
67 const char *, char **, va_list *, int); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
68 static char *skipitem(const char **, va_list *, int); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
70 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
71 PyArg_Parse(PyObject *args, const char *format, ...) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
73 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
74 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
75 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
76 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
77 retval = vgetargs1(args, format, &va, FLAG_COMPAT); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
78 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
79 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
80 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
81 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
82 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
83 _PyArg_Parse_SizeT(PyObject *args, char *format, ...) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
84 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
85 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
86 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
87 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
88 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
89 retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
90 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
91 return retval; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
95 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
96 PyArg_ParseTuple(PyObject *args, const char *format, ...) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
98 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
99 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
100 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
101 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
102 retval = vgetargs1(args, format, &va, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
103 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
104 return retval; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
105 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
106 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
107 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
108 _PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
109 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
110 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
111 va_list va; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
112 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
113 va_start(va, format); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
114 retval = vgetargs1(args, format, &va, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
115 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
116 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
117 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
118 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
121 PyArg_VaParse(PyObject *args, const char *format, va_list va) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
123 va_list lva; |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
124 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
125 Py_VA_COPY(lva, va); |
|
2052
d7e91437f0a2
Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents:
2004
diff
changeset
|
126 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
127 return vgetargs1(args, format, &lva, 0); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
130 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
131 _PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va) |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
132 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
133 va_list lva; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
134 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
135 Py_VA_COPY(lva, va); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
136 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
137 return vgetargs1(args, format, &lva, FLAG_SIZE_T); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
138 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
139 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
141 /* Handle cleanup of allocated memory in case of exception */ |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
142 |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
143 static int |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
144 cleanup_ptr(PyObject *self, void *ptr) |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
145 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
146 if (ptr) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
147 PyMem_FREE(ptr); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
148 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
149 return 0; |
|
48888
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
150 } |
|
27e142d99a71
#3668: When PyArg_ParseTuple correctly parses a s* format, but raises an
Antoine Pitrou <solipsis@pitrou.net>
parents:
48880
diff
changeset
|
151 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
152 static int |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
153 cleanup_buffer(PyObject *self, void *ptr) |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
154 { |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
155 Py_buffer *buf = (Py_buffer *)ptr; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
156 if (buf) { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
157 PyBuffer_Release(buf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
158 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
159 return 0; |
|
54421
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
160 } |
|
11de35da281c
Issue #6012: Add cleanup support to O& argument parsing.
Martin v. Löwis <martin@v.loewis.de>
parents:
53816
diff
changeset
|
161 |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
162 static int |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
163 addcleanup(void *ptr, freelist_t *freelist, destr_t destructor) |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
164 { |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
165 int index; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
166 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
167 index = freelist->first_available; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
168 freelist->first_available += 1; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
169 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
170 freelist->entries[index].item = ptr; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
171 freelist->entries[index].destructor = destructor; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
172 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
173 return 0; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
174 } |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
175 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
176 static int |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
177 cleanreturn(int retval, freelist_t *freelist) |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
178 { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
179 int index; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
180 |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
181 if (retval == 0) { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
182 /* A failure occurred, therefore execute all of the cleanup |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
183 functions. |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
184 */ |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
185 for (index = 0; index < freelist->first_available; ++index) { |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
186 freelist->entries[index].destructor(NULL, |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
187 freelist->entries[index].item); |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
188 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
189 } |
|
75747
212f20284724
use memory macros
Benjamin Peterson <benjamin@python.org>
parents:
75746
diff
changeset
|
190 PyMem_FREE(freelist->entries); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
191 return retval; |
|
28952
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
192 } |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
193 |
|
6c4a04ce965c
Patch #684981: Add cleanup capability for argument parsers. Fixes 501716.
Martin v. Löwis <martin@v.loewis.de>
parents:
28667
diff
changeset
|
194 |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
196 vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
198 char msgbuf[256]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
199 int levels[32]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
200 const char *fname = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
201 const char *message = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
202 int min = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
203 int max = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
204 int level = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
205 int endfmt = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
206 const char *formatsave = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
207 Py_ssize_t i, len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
208 char *msg; |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
209 freelist_t freelist = {0, NULL}; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
210 int compat = flags & FLAG_COMPAT; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
211 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
212 assert(compat || (args != (PyObject*)NULL)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
213 flags = flags & ~FLAG_COMPAT; |
|
16582
9a8e961b505f
Related to SF bug 132008 (PyList_Reverse blows up).
Tim Peters <tim.peters@gmail.com>
parents:
16264
diff
changeset
|
214 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
215 while (endfmt == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
216 int c = *format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
217 switch (c) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
218 case '(': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
219 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
220 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
221 level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
222 if (level >= 30) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
223 Py_FatalError("too many tuple nesting levels " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
224 "in argument format string"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
225 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
226 case ')': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
227 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
228 Py_FatalError("excess ')' in getargs format"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
229 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
230 level--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
231 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
232 case '\0': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
233 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
234 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
235 case ':': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
236 fname = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
237 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
238 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
239 case ';': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
240 message = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
241 endfmt = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
242 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
243 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
244 if (level == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
245 if (c == 'O') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
246 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
247 else if (isalpha(Py_CHARMASK(c))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
248 if (c != 'e') /* skip encoded */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
249 max++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
250 } else if (c == '|') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
251 min = max; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
252 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
253 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
254 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
255 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
256 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
257 if (level != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
258 Py_FatalError(/* '(' */ "missing ')' in getargs format"); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
259 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
260 if (min < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
261 min = max; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
262 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
263 format = formatsave; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
264 |
|
75747
212f20284724
use memory macros
Benjamin Peterson <benjamin@python.org>
parents:
75746
diff
changeset
|
265 freelist.entries = PyMem_NEW(freelistentry_t, max); |
|
75746
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
266 if (freelist.entries == NULL) { |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
267 PyErr_NoMemory(); |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
268 return 0; |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
269 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
270 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
271 if (compat) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
272 if (max == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
273 if (args == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
274 return 1; |
|
68809
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
275 PyErr_Format(PyExc_TypeError, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
276 "%.200s%s takes no arguments", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
277 fname==NULL ? "function" : fname, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
278 fname==NULL ? "" : "()"); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
279 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
280 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
281 else if (min == 1 && max == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
282 if (args == NULL) { |
|
68809
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
283 PyErr_Format(PyExc_TypeError, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
284 "%.200s%s takes at least one argument", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
285 fname==NULL ? "function" : fname, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
286 fname==NULL ? "" : "()"); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
287 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
288 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
289 msg = convertitem(args, &format, p_va, flags, levels, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
290 msgbuf, sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
291 if (msg == NULL) |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
292 return cleanreturn(1, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
293 seterror(levels[0], msg, levels+1, fname, message); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
294 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
295 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
296 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
297 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
298 "old style getargs format uses new features"); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
299 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
300 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
301 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
302 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
303 if (!PyTuple_Check(args)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
304 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
305 "new style getargs format but argument is not a tuple"); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
306 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
307 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
308 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
309 len = PyTuple_GET_SIZE(args); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
310 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
311 if (len < min || max < len) { |
|
68809
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
312 if (message == NULL) |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
313 PyErr_Format(PyExc_TypeError, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
314 "%.150s%s takes %s %d argument%s (%ld given)", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
315 fname==NULL ? "function" : fname, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
316 fname==NULL ? "" : "()", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
317 min==max ? "exactly" |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
318 : len < min ? "at least" : "at most", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
319 len < min ? min : max, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
320 (len < min ? min : max) == 1 ? "" : "s", |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
321 Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
322 else |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
323 PyErr_SetString(PyExc_TypeError, message); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
324 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
325 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
326 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
327 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
328 if (*format == '|') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
329 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
330 msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
331 flags, levels, msgbuf, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
332 sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
333 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
334 seterror(i+1, msg, levels, fname, msg); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
335 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
336 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
337 } |
|
6805
93e480dedcf0
Add explicit check for correct next character in format at end of
Guido van Rossum <guido@python.org>
parents:
5410
diff
changeset
|
338 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
339 if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
340 *format != '(' && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
341 *format != '|' && *format != ':' && *format != ';') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
342 PyErr_Format(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
343 "bad format string: %.200s", formatsave); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
344 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
345 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
346 |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
347 return cleanreturn(1, &freelist); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 static void |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
353 seterror(int iarg, const char *msg, int *levels, const char *fname, |
|
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
354 const char *message) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
356 char buf[512]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
357 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
358 char *p = buf; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
360 if (PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
361 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
362 else if (message == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
363 if (fname != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
364 PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
365 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
366 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
367 if (iarg != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
368 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
369 "argument %d", iarg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
370 i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
371 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
372 while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
373 PyOS_snprintf(p, sizeof(buf) - (p - buf), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
374 ", item %d", levels[i]-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
375 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
376 i++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
377 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
378 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
379 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
380 PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
381 p += strlen(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
382 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
383 PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
384 message = buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
385 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
386 PyErr_SetString(PyExc_TypeError, message); |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
389 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
390 /* Convert a tuple argument. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 On entry, *p_format points to the character _after_ the opening '('. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
392 On successful exit, *p_format points to the closing ')'. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 If successful: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 *p_format and *p_va are updated, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 *levels and *msgbuf are untouched, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
396 and NULL is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 If the argument is invalid: |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 *p_format is unchanged, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 *p_va is undefined, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 *levels is a 0-terminated list of item numbers, |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 *msgbuf contains an error message, whose format is: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
402 "must be <typename1>, not <typename2>", where: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
403 <typename1> is the name of the expected type, and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
404 <typename2> is the name of the actual type, |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 and msgbuf is returned. |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
409 converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
410 int *levels, char *msgbuf, size_t bufsize, int toplevel, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
411 freelist_t *freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
413 int level = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
414 int n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
415 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
416 int i; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
417 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
418 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
419 int c = *format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
420 if (c == '(') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
421 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
422 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
423 level++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
424 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
425 else if (c == ')') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
426 if (level == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
427 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
428 level--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
429 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
430 else if (c == ':' || c == ';' || c == '\0') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
431 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
432 else if (level == 0 && isalpha(Py_CHARMASK(c))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
433 n++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
434 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
435 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
436 if (!PySequence_Check(arg) || PyBytes_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
437 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
438 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
439 toplevel ? "expected %d arguments, not %.50s" : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
440 "must be %d-item sequence, not %.50s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
441 n, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
442 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
443 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
444 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
445 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
446 if ((i = PySequence_Size(arg)) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
447 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
448 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
449 toplevel ? "expected %d arguments, not %d" : |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
450 "must be sequence of length %d, not %d", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
451 n, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
452 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
453 } |
|
15899
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
454 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
455 format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
456 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
457 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
458 PyObject *item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
459 item = PySequence_GetItem(arg, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
460 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
461 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
462 levels[0] = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
463 levels[1] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
464 strncpy(msgbuf, "is not retrievable", bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
465 return msgbuf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
466 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
467 msg = convertitem(item, &format, p_va, flags, levels+1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
468 msgbuf, bufsize, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
469 /* PySequence_GetItem calls tp->sq_item, which INCREFs */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
470 Py_XDECREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
471 if (msg != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
472 levels[0] = i+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
473 return msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
474 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
475 } |
|
15899
152814f6cd11
This patch makes sure that the function name always appears in the error
Ka-Ping Yee <ping@zesty.ca>
parents:
15502
diff
changeset
|
476 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
477 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
478 return NULL; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 /* Convert a single item. */ |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
485 convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
486 int *levels, char *msgbuf, size_t bufsize, freelist_t *freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
488 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
489 const char *format = *p_format; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
490 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
491 if (*format == '(' /* ')' */) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
492 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
493 msg = converttuple(arg, &format, p_va, flags, levels, msgbuf, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
494 bufsize, 0, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
495 if (msg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
496 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
497 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
498 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
499 msg = convertsimple(arg, &format, p_va, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
500 msgbuf, bufsize, freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
501 if (msg != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
502 levels[0] = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
503 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
504 if (msg == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
505 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
506 return msg; |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 } |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
508 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
511 /* Format an error message generated by convertsimple(). */ |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 |
|
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 static char * |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
514 converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
515 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
516 assert(expected != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
517 assert(arg != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
518 PyOS_snprintf(msgbuf, bufsize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
519 "must be %.50s, not %.50s", expected, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
520 arg == Py_None ? "None" : arg->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
521 return msgbuf; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
522 } |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
523 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
524 #define CONV_UNICODE "(unicode conversion error)" |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
525 |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36773
diff
changeset
|
526 /* Explicitly check for float arguments when integers are expected. |
|
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36773
diff
changeset
|
527 Return 1 for error, 0 if ok. */ |
|
27685
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
528 static int |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
529 float_argument_error(PyObject *arg) |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
530 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
531 if (PyFloat_Check(arg)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
532 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
533 "integer argument expected, got float" ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
534 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
535 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
536 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
537 return 0; |
|
27685
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
538 } |
|
9e47f9ed49f6
If a float is passed where a int is expected, issue a DeprecationWarning
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
27363
diff
changeset
|
539 |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
540 /* Convert a non-tuple argument. Return NULL if conversion went OK, |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
541 or a string with a message describing the failure. The message is |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
542 formatted as "must be <desired type>, not <actual type>". |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
543 When failing, an exception may or may not have been raised. |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
544 Don't call if a tuple is expected. |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
545 |
|
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
546 When you add new format codes, please don't forget poor skipitem() below. |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
547 */ |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
548 |
|
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
549 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
550 convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
551 char *msgbuf, size_t bufsize, freelist_t *freelist) |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
553 /* For # codes */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
554 #define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
555 if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
556 else q=va_arg(*p_va, int*); |
|
68794
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
557 #define STORE_SIZE(s) \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
558 if (flags & FLAG_SIZE_T) \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
559 *q2=s; \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
560 else { \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
561 if (INT_MAX < s) { \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
562 PyErr_SetString(PyExc_OverflowError, \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
563 "size does not fit in an int"); \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
564 return converterr("", arg, msgbuf, bufsize); \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
565 } \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
566 *q=s; \ |
|
d9633064458c
Issue #8651: PyArg_Parse*() functions raise an OverflowError if the file
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62483
diff
changeset
|
567 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
568 #define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
569 #define RETURN_ERR_OCCURRED return msgbuf |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
570 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
571 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
572 char c = *format++; |
| 72475 | 573 char *sarg; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
574 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
575 switch (c) { |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
576 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
577 case 'b': { /* unsigned byte -- very short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
578 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
579 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
580 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
581 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
582 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
583 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
584 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
585 else if (ival < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
586 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
587 "unsigned byte integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
588 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
589 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
590 else if (ival > UCHAR_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
591 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
592 "unsigned byte integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
593 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
594 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
595 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
596 *p = (unsigned char) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
597 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
598 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
599 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
600 case 'B': {/* byte sized bitfield - both signed and unsigned |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
601 values allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
602 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
603 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
604 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
605 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
606 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
607 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
608 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
609 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
610 *p = (unsigned char) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
611 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
612 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
614 case 'h': {/* signed short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
615 short *p = va_arg(*p_va, short *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
616 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
617 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
618 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
619 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
620 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
621 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
622 else if (ival < SHRT_MIN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
623 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
624 "signed short integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
625 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
626 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
627 else if (ival > SHRT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
628 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
629 "signed short integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
630 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
631 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
632 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
633 *p = (short) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
634 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
635 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
636 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
637 case 'H': { /* short int sized bitfield, both signed and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
638 unsigned allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
639 unsigned short *p = va_arg(*p_va, unsigned short *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
640 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
641 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
642 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
643 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
644 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
645 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
646 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
647 *p = (unsigned short) ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
648 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
649 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
650 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
651 case 'i': {/* signed int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
652 int *p = va_arg(*p_va, int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
653 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
654 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
655 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
656 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
657 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
658 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
659 else if (ival > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
660 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
661 "signed integer is greater than maximum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
662 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
663 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
664 else if (ival < INT_MIN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
665 PyErr_SetString(PyExc_OverflowError, |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
666 "signed integer is less than minimum"); |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
667 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
668 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
669 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
670 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
671 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
672 } |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
673 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
674 case 'I': { /* int sized bitfield, both signed and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
675 unsigned allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
676 unsigned int *p = va_arg(*p_va, unsigned int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
677 unsigned int ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
678 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
679 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
680 ival = (unsigned int)PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
681 if (ival == (unsigned int)-1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
682 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
683 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
684 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
685 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
686 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
687 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
688 case 'n': /* Py_ssize_t */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
689 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
690 PyObject *iobj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
691 Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
692 Py_ssize_t ival = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
693 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
694 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
695 iobj = PyNumber_Index(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
696 if (iobj != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
697 ival = PyLong_AsSsize_t(iobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
698 Py_DECREF(iobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
699 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
700 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
701 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
702 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
703 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
704 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
705 case 'l': {/* long int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
706 long *p = va_arg(*p_va, long *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
707 long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
708 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
709 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
710 ival = PyLong_AsLong(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
711 if (ival == -1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
712 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
713 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
714 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
715 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
716 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
717 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
718 case 'k': { /* long sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
719 unsigned long *p = va_arg(*p_va, unsigned long *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
720 unsigned long ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
721 if (PyLong_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
722 ival = PyLong_AsUnsignedLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
723 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
724 return converterr("integer<k>", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
725 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
726 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
727 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
728 |
|
9949
98e37347378b
Change rare occurrences of #if HAVE_LONG_LONG to #ifdef.
Guido van Rossum <guido@python.org>
parents:
9306
diff
changeset
|
729 #ifdef HAVE_LONG_LONG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
730 case 'L': {/* PY_LONG_LONG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
731 PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
732 PY_LONG_LONG ival; |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
733 if (float_argument_error(arg)) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
734 RETURN_ERR_OCCURRED; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
735 ival = PyLong_AsLongLong(arg); |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
736 if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
737 RETURN_ERR_OCCURRED; |
|
62221
fe5ed70283ef
Issue #8950: Make PyArg_Parse* with 'L' code raise for float inputs,
Mark Dickinson <dickinsm@gmail.com>
parents:
62202
diff
changeset
|
738 else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
739 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
740 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
741 } |
|
28652
28a2975514cd
SF # 595026: support for masks in getargs.c.
Thomas Heller <theller@ctypes.org>
parents:
28437
diff
changeset
|
742 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
743 case 'K': { /* long long sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
744 unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
745 unsigned PY_LONG_LONG ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
746 if (PyLong_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
747 ival = PyLong_AsUnsignedLongLongMask(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
748 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
749 return converterr("integer<K>", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
750 *p = ival; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
751 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
752 } |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
8358
diff
changeset
|
753 #endif |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
754 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
755 case 'f': {/* float */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
756 float *p = va_arg(*p_va, float *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
757 double dval = PyFloat_AsDouble(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
758 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
759 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
760 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
761 *p = (float) dval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
762 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
763 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
764 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
765 case 'd': {/* double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
766 double *p = va_arg(*p_va, double *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
767 double dval = PyFloat_AsDouble(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
768 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
769 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
770 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
771 *p = dval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
772 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
773 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
774 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
775 case 'D': {/* complex double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
776 Py_complex *p = va_arg(*p_va, Py_complex *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
777 Py_complex cval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
778 cval = PyComplex_AsCComplex(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
779 if (PyErr_Occurred()) |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
780 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
781 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
782 *p = cval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
783 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
784 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
785 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
786 case 'c': {/* char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
787 char *p = va_arg(*p_va, char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
788 if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
789 *p = PyBytes_AS_STRING(arg)[0]; |
|
71543
536fccc75f5a
Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format.
Eli Bendersky <eliben@gmail.com>
parents:
68809
diff
changeset
|
790 else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1) |
|
536fccc75f5a
Issue #12380: PyArg_ParseTuple now accepts a bytearray for the 'c' format.
Eli Bendersky <eliben@gmail.com>
parents:
68809
diff
changeset
|
791 *p = PyByteArray_AS_STRING(arg)[0]; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
792 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
793 return converterr("a byte string of length 1", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
794 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
795 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
796 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
797 case 'C': {/* unicode char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
798 int *p = va_arg(*p_va, int *); |
|
72679
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
799 int kind; |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
800 void *data; |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
801 |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
802 if (!PyUnicode_Check(arg)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
803 return converterr("a unicode character", arg, msgbuf, bufsize); |
|
72679
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
804 |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
805 if (PyUnicode_READY(arg)) |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
806 RETURN_ERR_OCCURRED; |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
807 |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
808 if (PyUnicode_GET_LENGTH(arg) != 1) |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
809 return converterr("a unicode character", arg, msgbuf, bufsize); |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
810 |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
811 kind = PyUnicode_KIND(arg); |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
812 data = PyUnicode_DATA(arg); |
|
b66033a0f140
Fix usage og PyUnicode_READY()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
813 *p = PyUnicode_READ(kind, data, 0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
814 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
815 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
816 |
|
62202
d7113cacd428
Issue #8838, #8339: Remove codecs.charbuffer_encode() and "t#" parsing format
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62197
diff
changeset
|
817 /* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
818 need to be cleaned up! */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
819 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
820 case 'y': {/* any buffer-like object, but not PyUnicode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
821 void **p = (void **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
822 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
823 Py_ssize_t count; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
824 if (*format == '*') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
825 if (getbuffer(arg, (Py_buffer*)p, &buf) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
826 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
827 format++; |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
828 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
829 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
830 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
831 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
832 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
833 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
834 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
835 count = convertbuffer(arg, p, &buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
836 if (count < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
837 return converterr(buf, arg, msgbuf, bufsize); |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
838 if (*format == '#') { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
839 FETCH_SIZE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
840 STORE_SIZE(count); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
841 format++; |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
842 } else { |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
843 if (strlen(*p) != count) |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
844 return converterr( |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
845 "bytes without null bytes", |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
846 arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
847 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
848 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
849 } |
|
41611
c48fe4dc34a9
Change UnicodeDecodeError objects so that the 'object' attribute
Walter Dörwald <walter@livinglogic.de>
parents:
41596
diff
changeset
|
850 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
851 case 's': /* text string */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
852 case 'z': /* text string or None */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
853 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
854 if (*format == '*') { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
855 /* "s*" or "z*" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
856 Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
857 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
858 if (c == 'z' && arg == Py_None) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
859 PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
860 else if (PyUnicode_Check(arg)) { |
| 72475 | 861 Py_ssize_t len; |
| 862 sarg = PyUnicode_AsUTF8AndSize(arg, &len); | |
| 863 if (sarg == NULL) | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
864 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
865 arg, msgbuf, bufsize); |
| 72475 | 866 PyBuffer_FillInfo(p, arg, sarg, len, 1, 0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
867 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
868 else { /* any buffer-like object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
869 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
870 if (getbuffer(arg, p, &buf) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
871 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
872 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
873 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
874 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
875 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
876 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
877 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
878 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
879 } else if (*format == '#') { /* any buffer-like object */ |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
880 /* "s#" or "z#" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
881 void **p = (void **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
882 FETCH_SIZE; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
883 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
884 if (c == 'z' && arg == Py_None) { |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
885 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
886 STORE_SIZE(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
887 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
888 else if (PyUnicode_Check(arg)) { |
| 72475 | 889 Py_ssize_t len; |
| 890 sarg = PyUnicode_AsUTF8AndSize(arg, &len); | |
| 891 if (sarg == NULL) | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
892 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
893 arg, msgbuf, bufsize); |
| 72475 | 894 *p = sarg; |
| 895 STORE_SIZE(len); | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
896 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
897 else { /* any buffer-like object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
898 /* XXX Really? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
899 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
900 Py_ssize_t count = convertbuffer(arg, p, &buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
901 if (count < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
902 return converterr(buf, arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
903 STORE_SIZE(count); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
904 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
905 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
906 } else { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
907 /* "s" or "z" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
908 char **p = va_arg(*p_va, char **); |
| 72475 | 909 Py_ssize_t len; |
| 910 sarg = NULL; | |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
911 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
912 if (c == 'z' && arg == Py_None) |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
913 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
914 else if (PyUnicode_Check(arg)) { |
| 72475 | 915 sarg = PyUnicode_AsUTF8AndSize(arg, &len); |
| 916 if (sarg == NULL) | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
917 return converterr(CONV_UNICODE, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
918 arg, msgbuf, bufsize); |
| 72475 | 919 *p = sarg; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
920 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
921 else |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
922 return converterr(c == 'z' ? "str or None" : "str", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
923 arg, msgbuf, bufsize); |
| 72475 | 924 if (*p != NULL && sarg != NULL && (Py_ssize_t) strlen(*p) != len) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
925 return converterr( |
|
72915
9685f893fffe
convertsimple(): "str without bytes" => "str without characters"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72861
diff
changeset
|
926 c == 'z' ? "str without null characters or None" |
|
9685f893fffe
convertsimple(): "str without bytes" => "str without characters"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72861
diff
changeset
|
927 : "str without null characters", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
928 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
929 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
930 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
931 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
932 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
933 case 'u': /* raw unicode buffer (Py_UNICODE *) */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
934 case 'Z': /* raw unicode buffer or None */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
935 { |
|
68102
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
67346
diff
changeset
|
936 Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); |
|
e2f96bd29252
Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents:
67346
diff
changeset
|
937 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
938 if (*format == '#') { /* any buffer-like object */ |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
939 /* "s#" or "Z#" */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
940 FETCH_SIZE; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
941 |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
942 if (c == 'Z' && arg == Py_None) { |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
943 *p = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
944 STORE_SIZE(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
945 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
946 else if (PyUnicode_Check(arg)) { |
|
72861
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
947 Py_ssize_t len; |
|
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
948 *p = PyUnicode_AsUnicodeAndSize(arg, &len); |
| 72475 | 949 if (*p == NULL) |
| 950 RETURN_ERR_OCCURRED; | |
|
72861
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
951 STORE_SIZE(len); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
952 } |
|
62198
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
953 else |
|
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
954 return converterr("str or None", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
955 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
956 } else { |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
957 /* "s" or "Z" */ |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
958 if (c == 'Z' && arg == Py_None) |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
959 *p = NULL; |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
960 else if (PyUnicode_Check(arg)) { |
|
72861
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
961 Py_ssize_t len; |
|
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
962 *p = PyUnicode_AsUnicodeAndSize(arg, &len); |
| 72475 | 963 if (*p == NULL) |
| 964 RETURN_ERR_OCCURRED; | |
|
72861
6358e5d29dea
Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE()
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72679
diff
changeset
|
965 if (Py_UNICODE_strlen(*p) != len) |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
966 return converterr( |
|
72915
9685f893fffe
convertsimple(): "str without bytes" => "str without characters"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72861
diff
changeset
|
967 "str without null characters or None", |
|
62322
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
968 arg, msgbuf, bufsize); |
|
b32a2816f6e9
Issue #8592: PyArg_Parse*() functions raise a TypeError for "y", "u" and "Z"
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62221
diff
changeset
|
969 } else |
|
62478
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
970 return converterr(c == 'Z' ? "str or None" : "str", |
|
893970141608
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62476
diff
changeset
|
971 arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
972 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
973 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
974 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
975 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
976 case 'e': {/* encoded string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
977 char **buffer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
978 const char *encoding; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
979 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
980 int recode_strings; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
981 Py_ssize_t size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
982 const char *ptr; |
| 12051 | 983 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
984 /* Get 'e' parameter: the encoding name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
985 encoding = (const char *)va_arg(*p_va, const char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
986 if (encoding == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
987 encoding = PyUnicode_GetDefaultEncoding(); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
988 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
989 /* Get output buffer parameter: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
990 's' (recode all objects via Unicode) or |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
991 't' (only recode non-string objects) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
992 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
993 if (*format == 's') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
994 recode_strings = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
995 else if (*format == 't') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
996 recode_strings = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
997 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
998 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
999 "(unknown parser marker combination)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1000 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1001 buffer = (char **)va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1002 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1003 if (buffer == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1004 return converterr("(buffer is NULL)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1005 arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1006 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1007 /* Encode object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1008 if (!recode_strings && |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1009 (PyBytes_Check(arg) || PyByteArray_Check(arg))) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1010 s = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1011 Py_INCREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1012 if (PyObject_AsCharBuffer(s, &ptr, &size) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1013 return converterr("(AsCharBuffer failed)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1014 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1015 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1016 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1017 PyObject *u; |
|
19343
7257e87e0720
Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents:
18887
diff
changeset
|
1018 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1019 /* Convert object to Unicode */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1020 u = PyUnicode_FromObject(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1021 if (u == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1022 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1023 "string or unicode or text buffer", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1024 arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1025 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1026 /* Encode object; use default error handling */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1027 s = PyUnicode_AsEncodedString(u, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1028 encoding, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1029 NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1030 Py_DECREF(u); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1031 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1032 return converterr("(encoding failed)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1033 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1034 if (!PyBytes_Check(s)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1035 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1036 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1037 "(encoder failed to return bytes)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1038 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1039 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1040 size = PyBytes_GET_SIZE(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1041 ptr = PyBytes_AS_STRING(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1042 if (ptr == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1043 ptr = ""; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1044 } |
| 12051 | 1045 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1046 /* Write output; output is guaranteed to be 0-terminated */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1047 if (*format == '#') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1048 /* Using buffer length parameter '#': |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1049 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1050 - if *buffer is NULL, a new buffer of the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1051 needed size is allocated and the data |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1052 copied into it; *buffer is updated to point |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1053 to the new buffer; the caller is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1054 responsible for PyMem_Free()ing it after |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1055 usage |
| 12051 | 1056 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1057 - if *buffer is not NULL, the data is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1058 copied to *buffer; *buffer_len has to be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1059 set to the size of the buffer on input; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1060 buffer overflow is signalled with an error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1061 buffer has to provide enough room for the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1062 encoded string plus the trailing 0-byte |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1063 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1064 - in both cases, *buffer_len is updated to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1065 the size of the buffer /excluding/ the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1066 trailing 0-byte |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1067 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1068 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1069 FETCH_SIZE; |
| 12051 | 1070 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1071 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1072 if (q == NULL && q2 == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1073 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1074 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1075 "(buffer_len is NULL)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1076 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1077 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1078 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1079 *buffer = PyMem_NEW(char, size + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1080 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1081 Py_DECREF(s); |
|
62151
c3f2ed4d8e65
convertsimple(): call PyErr_NoMemory() on PyMem_NEW() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62149
diff
changeset
|
1082 PyErr_NoMemory(); |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1083 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1084 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1085 if (addcleanup(*buffer, freelist, cleanup_ptr)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1086 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1087 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1088 "(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1089 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1090 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1091 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1092 if (size + 1 > BUFFER_LEN) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1093 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1094 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1095 "(buffer overflow)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1096 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1097 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1098 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1099 memcpy(*buffer, ptr, size+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1100 STORE_SIZE(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1101 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1102 /* Using a 0-terminated buffer: |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1103 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1104 - the encoded string has to be 0-terminated |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1105 for this variant to work; if it is not, an |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1106 error raised |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1107 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1108 - a new buffer of the needed size is |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1109 allocated and the data copied into it; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1110 *buffer is updated to point to the new |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1111 buffer; the caller is responsible for |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1112 PyMem_Free()ing it after usage |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1113 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1114 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1115 if ((Py_ssize_t)strlen(ptr) != size) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1116 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1117 return converterr( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1118 "encoded string without NULL bytes", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1119 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1120 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1121 *buffer = PyMem_NEW(char, size + 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1122 if (*buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1123 Py_DECREF(s); |
|
62151
c3f2ed4d8e65
convertsimple(): call PyErr_NoMemory() on PyMem_NEW() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62149
diff
changeset
|
1124 PyErr_NoMemory(); |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1125 RETURN_ERR_OCCURRED; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1126 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1127 if (addcleanup(*buffer, freelist, cleanup_ptr)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1128 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1129 return converterr("(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1130 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1131 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1132 memcpy(*buffer, ptr, size+1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1133 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1134 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1135 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1136 } |
|
12570
3dbe41380266
Brian Hooper <brian_takashi@hotmail.com>:
Fred Drake <fdrake@acm.org>
parents:
12510
diff
changeset
|
1137 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1138 case 'S': { /* PyBytes object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1139 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1140 if (PyBytes_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1141 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1142 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1143 return converterr("bytes", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1144 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1145 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1146 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1147 case 'Y': { /* PyByteArray object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1148 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1149 if (PyByteArray_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1150 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1151 else |
|
62198
b2c1995633bd
Merged revisions 81849 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
1152 return converterr("bytearray", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1153 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1154 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1155 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1156 case 'U': { /* PyUnicode object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1157 PyObject **p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1158 if (PyUnicode_Check(arg)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1159 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1160 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1161 return converterr("str", arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1162 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1163 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1164 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1165 case 'O': { /* object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1166 PyTypeObject *type; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1167 PyObject **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1168 if (*format == '!') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1169 type = va_arg(*p_va, PyTypeObject*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1170 p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1171 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1172 if (PyType_IsSubtype(arg->ob_type, type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1173 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1174 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1175 return converterr(type->tp_name, arg, msgbuf, bufsize); |
|
8358
da4bdceeaad7
Another veeeeeery old patch...
Guido van Rossum <guido@python.org>
parents:
7982
diff
changeset
|
1176 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1177 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1178 else if (*format == '&') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1179 typedef int (*converter)(PyObject *, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1180 converter convert = va_arg(*p_va, converter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1181 void *addr = va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1182 int res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1183 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1184 if (! (res = (*convert)(arg, addr))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1185 return converterr("(unspecified)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1186 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1187 if (res == Py_CLEANUP_SUPPORTED && |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1188 addcleanup(addr, freelist, convert) == -1) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1189 return converterr("(cleanup problem)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1190 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1191 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1192 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1193 p = va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1194 *p = arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1195 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1196 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1197 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1198 |
|
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1199 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1200 case 'w': { /* "w*": memory buffer, read-write access */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1201 void **p = va_arg(*p_va, void **); |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1202 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1203 if (*format != '*') |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1204 return converterr( |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1205 "invalid use of 'w' format character", |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1206 arg, msgbuf, bufsize); |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1207 format++; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1208 |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1209 /* Caller is interested in Py_buffer, and the object |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1210 supports it directly. */ |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1211 if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1212 PyErr_Clear(); |
|
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1213 return converterr("read-write buffer", arg, msgbuf, bufsize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1214 } |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1215 if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) { |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1216 PyBuffer_Release((Py_buffer*)p); |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1217 return converterr("contiguous buffer", arg, msgbuf, bufsize); |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1218 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1219 if (addcleanup(p, freelist, cleanup_buffer)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1220 return converterr( |
|
62484
bcc0e825faa0
Issue #8850: Remove "w" and "w#" formats from PyArg_Parse*() functions, use
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62482
diff
changeset
|
1221 "(cleanup problem)", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1222 arg, msgbuf, bufsize); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1223 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1224 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1225 } |
|
9306
79439e4e9976
Implement new format character 't#'. This is like s#, accepting an
Guido van Rossum <guido@python.org>
parents:
9044
diff
changeset
|
1226 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1227 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1228 return converterr("impossible<bad format char>", arg, msgbuf, bufsize); |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1229 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1230 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1231 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1232 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1233 return NULL; |
|
67346
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1234 |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1235 #undef FETCH_SIZE |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1236 #undef STORE_SIZE |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1237 #undef BUFFER_LEN |
|
98c8aa237fc1
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Victor Stinner <victor.stinner@haypocalc.com>
parents:
67345
diff
changeset
|
1238 #undef RETURN_ERR_OCCURRED |
|
1913
8623aa3915db
* Python/{modsupport.c,getargs.c,Makefile.in},
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1239 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1240 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1241 static Py_ssize_t |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1242 convertbuffer(PyObject *arg, void **p, char **errmsg) |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1243 { |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1244 PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1245 Py_ssize_t count; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1246 Py_buffer view; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
42139
diff
changeset
|
1247 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1248 *errmsg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1249 *p = NULL; |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1250 if (pb != NULL && pb->bf_releasebuffer != NULL) { |
|
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1251 *errmsg = "read-only pinned buffer"; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1252 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1253 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
42139
diff
changeset
|
1254 |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1255 if (getbuffer(arg, &view, errmsg) < 0) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1256 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1257 count = view.len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1258 *p = view.buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1259 PyBuffer_Release(&view); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1260 return count; |
|
17996
5a9debb14440
Internal refactoring of convertsimple() and friends.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17857
diff
changeset
|
1261 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1262 |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1263 static int |
|
48848
5c75a33ef5b2
Merged revisions 66006 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
48683
diff
changeset
|
1264 getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1265 { |
|
63259
ac7eb6eaef68
Issue #8991: convertbuffer() rejects discontigious buffers
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62484
diff
changeset
|
1266 if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1267 *errmsg = "bytes or buffer"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1268 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1269 } |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1270 if (!PyBuffer_IsContiguous(view, 'C')) { |
|
62482
bb6222a4ed24
getbuffer(): release the buffer on error (if the buffer is not contiguous)
Victor Stinner <victor.stinner@haypocalc.com>
parents:
62478
diff
changeset
|
1271 PyBuffer_Release(view); |
|
62149
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1272 *errmsg = "contiguous buffer"; |
|
9d49b744078c
Simplify getbuffer(): convertbuffer() fails anyway if bf_getbuffer is NULL
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61972
diff
changeset
|
1273 return -1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1274 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1275 return 0; |
|
48683
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1276 } |
|
cd3b0b7fd8e1
Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
48660
diff
changeset
|
1277 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1278 /* Support for keyword arguments donated by |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1279 Geoff Philbrick <philbric@delphi.hks.com> */ |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1280 |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1281 /* Return false (0) for error, else true. */ |
|
20629
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1282 int |
|
acc7e3b4d042
Style conformance: function name begins a new line *consistently*.
Fred Drake <fdrake@acm.org>
parents:
20371
diff
changeset
|
1283 PyArg_ParseTupleAndKeywords(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1284 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1285 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1286 char **kwlist, ...) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1287 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1288 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1289 va_list va; |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1290 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1291 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1292 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1293 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1294 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1295 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1296 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1297 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1298 } |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1299 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1300 va_start(va, kwlist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1301 retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1302 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1303 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1304 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1305 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1306 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1307 _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1308 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1309 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1310 char **kwlist, ...) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1311 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1312 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1313 va_list va; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1314 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1315 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1316 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1317 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1318 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1319 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1320 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1321 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1322 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1323 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1324 va_start(va, kwlist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1325 retval = vgetargskeywords(args, keywords, format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1326 kwlist, &va, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1327 va_end(va); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1328 return retval; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1329 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1330 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1331 |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1332 int |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1333 PyArg_VaParseTupleAndKeywords(PyObject *args, |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1334 PyObject *keywords, |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1335 const char *format, |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36625
diff
changeset
|
1336 char **kwlist, va_list va) |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1337 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1338 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1339 va_list lva; |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1340 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1341 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1342 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1343 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1344 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1345 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1346 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1347 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1348 } |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1349 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
1350 Py_VA_COPY(lva, va); |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1351 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1352 retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1353 return retval; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1354 } |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1355 |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1356 int |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1357 _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1358 PyObject *keywords, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1359 const char *format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1360 char **kwlist, va_list va) |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1361 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1362 int retval; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1363 va_list lva; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1364 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1365 if ((args == NULL || !PyTuple_Check(args)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1366 (keywords != NULL && !PyDict_Check(keywords)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1367 format == NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1368 kwlist == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1369 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1370 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1371 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1372 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1373 |
|
63924
9108e7dcd7d8
Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
63259
diff
changeset
|
1374 Py_VA_COPY(lva, va); |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1375 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1376 retval = vgetargskeywords(args, keywords, format, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1377 kwlist, &lva, FLAG_SIZE_T); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1378 return retval; |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1379 } |
|
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1380 |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1381 int |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1382 PyArg_ValidateKeywordArguments(PyObject *kwargs) |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1383 { |
|
66220
379029714e24
handle dict subclasses gracefully in PyArg_ValidateKeywordArguments
Benjamin Peterson <benjamin@python.org>
parents:
63924
diff
changeset
|
1384 if (!PyDict_Check(kwargs)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1385 PyErr_BadInternalCall(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1386 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1387 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1388 if (!_PyDict_HasOnlyStringKeys(kwargs)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1389 PyErr_SetString(PyExc_TypeError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1390 "keyword arguments must be strings"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1391 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1392 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60931
diff
changeset
|
1393 return 1; |
|
60931
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1394 } |
|
79128efe8a99
prevent the dict constructor from accepting non-string keyword args #8419
Benjamin Peterson <benjamin@python.org>
parents:
60399
diff
changeset
|
1395 |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1396 #define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':') |
|
32606
cc1f74d19fcb
Add PyArg_VaParseTupleAndKeywords(). Document this function and
Brett Cannon <bcannon@gmail.com>
parents:
28952
diff
changeset
|
1397 |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1398 static int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1399 vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1400 char **kwlist, va_list *p_va, int flags) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1401 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1402 char msgbuf[512]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1403 int levels[32]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1404 const char *fname, *msg, *custom_msg, *keyword; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1405 int min = INT_MAX; |
|
75842
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1406 int max = INT_MAX; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1407 int i, len, nargs, nkeywords; |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1408 PyObject *current_arg; |
|
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1409 freelist_t freelist = {0, NULL}; |
|
20708
e912b683ed3e
vgetargskeywords(): remove test that can't succeed. Not a bugfix, just
Tim Peters <tim.peters@gmail.com>
parents:
20632
diff
changeset
|
1410 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1411 assert(args != NULL && PyTuple_Check(args)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1412 assert(keywords == NULL || PyDict_Check(keywords)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1413 assert(format != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1414 assert(kwlist != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1415 assert(p_va != NULL); |
|
20710
a44cc0c21cfe
PyArg_ParseTupleAndKeywords: do basic sanity checks on the arguments,
Tim Peters <tim.peters@gmail.com>
parents:
20709
diff
changeset
|
1416 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1417 /* grab the function name or custom error msg first (mutually exclusive) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1418 fname = strchr(format, ':'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1419 if (fname) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1420 fname++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1421 custom_msg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1422 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1423 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1424 custom_msg = strchr(format,';'); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1425 if (custom_msg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1426 custom_msg++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1427 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1428 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1429 /* scan kwlist and get greatest possible nbr of args */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1430 for (len=0; kwlist[len]; len++) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1431 continue; |
|
20711
2890769b1e69
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
Tim Peters <tim.peters@gmail.com>
parents:
20710
diff
changeset
|
1432 |
|
75747
212f20284724
use memory macros
Benjamin Peterson <benjamin@python.org>
parents:
75746
diff
changeset
|
1433 freelist.entries = PyMem_NEW(freelistentry_t, len); |
|
75746
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
1434 if (freelist.entries == NULL) { |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
1435 PyErr_NoMemory(); |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
1436 return 0; |
|
2b8994c2851a
check result of PyMem_New
Benjamin Peterson <benjamin@python.org>
parents:
75733
diff
changeset
|
1437 } |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1438 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1439 nargs = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1440 nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1441 if (nargs + nkeywords > len) { |
|
68809
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
1442 PyErr_Format(PyExc_TypeError, |
|
4c2135930882
Issue #10833: Use PyErr_Format() and PyUnicode_FromFormat() instead of
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68796
diff
changeset
|
1443 "%s%s takes at most %d argument%s (%d given)", |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1444 (fname == NULL) ? "function" : fname, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1445 (fname == NULL) ? "" : "()", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1446 len, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1447 (len == 1) ? "" : "s", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1448 nargs + nkeywords); |
|
75750
d08f0f3ab23e
plug memory leak (closes #14325)
Benjamin Peterson <benjamin@python.org>
parents:
75748
diff
changeset
|
1449 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1450 } |
| 20723 | 1451 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1452 /* convert tuple args and keyword args in same loop, using kwlist to drive process */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1453 for (i = 0; i < len; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1454 keyword = kwlist[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1455 if (*format == '|') { |
|
75842
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1456 if (min != INT_MAX) { |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1457 PyErr_SetString(PyExc_RuntimeError, |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1458 "Invalid format string (| specified twice)"); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1459 return cleanreturn(0, &freelist); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1460 } |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1461 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1462 min = i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1463 format++; |
|
75842
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1464 |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1465 if (max != INT_MAX) { |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1466 PyErr_SetString(PyExc_RuntimeError, |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1467 "Invalid format string ($ before |)"); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1468 return cleanreturn(0, &freelist); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1469 } |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1470 } |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1471 if (*format == '$') { |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1472 if (max != INT_MAX) { |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1473 PyErr_SetString(PyExc_RuntimeError, |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1474 "Invalid format string ($ specified twice)"); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1475 return cleanreturn(0, &freelist); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1476 } |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1477 |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1478 max = i; |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1479 format++; |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1480 |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1481 if (max < nargs) { |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1482 PyErr_Format(PyExc_TypeError, |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1483 "Function takes %s %d positional arguments" |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1484 " (%d given)", |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1485 (min != INT_MAX) ? "at most" : "exactly", |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1486 max, nargs); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1487 return cleanreturn(0, &freelist); |
|
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1488 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1489 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1490 if (IS_END_OF_FORMAT(*format)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1491 PyErr_Format(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1492 "More keyword list entries (%d) than " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1493 "format specifiers (%d)", len, i); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1494 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1495 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1496 current_arg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1497 if (nkeywords) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1498 current_arg = PyDict_GetItemString(keywords, keyword); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1499 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1500 if (current_arg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1501 --nkeywords; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1502 if (i < nargs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1503 /* arg present in tuple and in dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1504 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1505 "Argument given by name ('%s') " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1506 "and position (%d)", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1507 keyword, i+1); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1508 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1509 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1510 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1511 else if (nkeywords && PyErr_Occurred()) |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1512 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1513 else if (i < nargs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1514 current_arg = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1515 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1516 if (current_arg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1517 msg = convertitem(current_arg, &format, p_va, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1518 levels, msgbuf, sizeof(msgbuf), &freelist); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1519 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1520 seterror(i+1, msg, levels, fname, custom_msg); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1521 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1522 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1523 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1524 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1525 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1526 if (i < min) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1527 PyErr_Format(PyExc_TypeError, "Required argument " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1528 "'%s' (pos %d) not found", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1529 keyword, i+1); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1530 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1531 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1532 /* current code reports success when all required args |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1533 * fulfilled and no keyword args left, with no further |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1534 * validation. XXX Maybe skip this in debug build ? |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1535 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1536 if (!nkeywords) |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1537 return cleanreturn(1, &freelist); |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1538 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1539 /* We are into optional args, skip thru to any remaining |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1540 * keyword args */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1541 msg = skipitem(&format, p_va, flags); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1542 if (msg) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1543 PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1544 format); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1545 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1546 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1547 } |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1548 |
|
75842
052779d34945
Issue #14328: Add keyword-only parameters to PyArg_ParseTupleAndKeywords.
Larry Hastings <larry@hastings.org>
parents:
75750
diff
changeset
|
1549 if (!IS_END_OF_FORMAT(*format) && (*format != '|') && (*format != '$')) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1550 PyErr_Format(PyExc_RuntimeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1551 "more argument specifiers than keyword list entries " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1552 "(remaining format:'%s')", format); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1553 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1554 } |
| 20715 | 1555 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1556 /* make sure there are no extraneous keyword arguments */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1557 if (nkeywords > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1558 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1559 Py_ssize_t pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1560 while (PyDict_Next(keywords, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1561 int match = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1562 char *ks; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1563 if (!PyUnicode_Check(key)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1564 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1565 "keywords must be strings"); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1566 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1567 } |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1568 /* check that _PyUnicode_AsString() result is not NULL */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1569 ks = _PyUnicode_AsString(key); |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1570 if (ks != NULL) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1571 for (i = 0; i < len; i++) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1572 if (!strcmp(ks, kwlist[i])) { |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1573 match = 1; |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1574 break; |
|
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1575 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1576 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1577 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1578 if (!match) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1579 PyErr_Format(PyExc_TypeError, |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1580 "'%U' is an invalid keyword " |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1581 "argument for this function", |
|
61717
1504cc5a15a1
Issue #6697: Fix a crash if a keyword contains a surrogate
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61466
diff
changeset
|
1582 key); |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1583 return cleanreturn(0, &freelist); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1584 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1585 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1586 } |
| 20723 | 1587 |
|
75733
9fc456ac20cf
Issue #14325: Stop using python lists, capsules, and the garbage collector to deal with PyArg_Parse* cleanup.
Jean-Paul Calderone <exarkun@twistedmatrix.com>
parents:
72915
diff
changeset
|
1588 return cleanreturn(1, &freelist); |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1589 } |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1590 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1591 |
|
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1592 static char * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1593 skipitem(const char **p_format, va_list *p_va, int flags) |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1594 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1595 const char *format = *p_format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1596 char c = *format++; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1597 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1598 switch (c) { |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1599 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1600 /* simple codes |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1601 * The individual types (second arg of va_arg) are irrelevant */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1602 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1603 case 'b': /* byte -- very short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1604 case 'B': /* byte as bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1605 case 'h': /* short int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1606 case 'H': /* short int as bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1607 case 'i': /* int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1608 case 'I': /* int sized bitfield */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1609 case 'l': /* long int */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1610 case 'k': /* long int sized bitfield */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1611 #ifdef HAVE_LONG_LONG |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1612 case 'L': /* PY_LONG_LONG */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1613 case 'K': /* PY_LONG_LONG sized bitfield */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1614 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1615 case 'f': /* float */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1616 case 'd': /* double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1617 case 'D': /* complex double */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1618 case 'c': /* char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1619 case 'C': /* unicode char */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1620 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1621 (void) va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1622 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1623 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36345
diff
changeset
|
1624 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1625 case 'n': /* Py_ssize_t */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1626 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1627 (void) va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1628 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1629 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1630 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1631 /* string codes */ |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1632 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1633 case 'e': /* string with encoding */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1634 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1635 (void) va_arg(*p_va, const char *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1636 if (!(*format == 's' || *format == 't')) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1637 /* after 'e', only 's' and 't' is allowed */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1638 goto err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1639 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1640 /* explicit fallthrough to string cases */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1641 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1642 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1643 case 's': /* string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1644 case 'z': /* string or None */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1645 case 'y': /* bytes */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1646 case 'u': /* unicode string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1647 case 'w': /* buffer, read-write */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1648 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1649 (void) va_arg(*p_va, char **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1650 if (*format == '#') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1651 if (flags & FLAG_SIZE_T) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1652 (void) va_arg(*p_va, Py_ssize_t *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1653 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1654 (void) va_arg(*p_va, int *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1655 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1656 } else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1657 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1658 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1659 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1660 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1661 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1662 /* object codes */ |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1663 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1664 case 'S': /* string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1665 case 'Y': /* string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1666 case 'U': /* unicode string object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1667 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1668 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1669 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1670 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1671 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1672 case 'O': /* object */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1673 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1674 if (*format == '!') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1675 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1676 (void) va_arg(*p_va, PyTypeObject*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1677 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1678 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1679 else if (*format == '&') { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1680 typedef int (*converter)(PyObject *, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1681 (void) va_arg(*p_va, converter); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1682 (void) va_arg(*p_va, void *); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1683 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1684 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1685 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1686 (void) va_arg(*p_va, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1687 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1688 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1689 } |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1690 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1691 case '(': /* bypass tuple, not handled at all previously */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1692 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1693 char *msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1694 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1695 if (*format==')') |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1696 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1697 if (IS_END_OF_FORMAT(*format)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1698 return "Unmatched left paren in format " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1699 "string"; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1700 msg = skipitem(&format, p_va, flags); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1701 if (msg) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1702 return msg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1703 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1704 format++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1705 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1706 } |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1707 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1708 case ')': |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1709 return "Unmatched right paren in format string"; |
|
45548
8c3c5b4eef55
Merged revisions 61038,61042-61045,61047,61050,61053,61055-61056,61061-61062,61066,61068,61070,61081-61095 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45534
diff
changeset
|
1710 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1711 default: |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1712 err: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1713 return "impossible<bad format char>"; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1714 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1715 } |
|
35552
9b7d117eb4bc
Complete format code support in getargs.c::skipitem(), which is called when
Georg Brandl <georg@python.org>
parents:
35449
diff
changeset
|
1716 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1717 *p_format = format; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1718 return NULL; |
|
4026
6bbc13b7dca8
Support for keyword arguments (PyArg_ParseTupleAndKeywords) donated by
Guido van Rossum <guido@python.org>
parents:
3766
diff
changeset
|
1719 } |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1720 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1721 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1722 int |
|
36750
92ba72484ff3
Use Py_ssize_t for PyArg_UnpackTuple arguments.
Martin v. Löwis <martin@v.loewis.de>
parents:
36675
diff
changeset
|
1723 PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1724 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1725 Py_ssize_t i, l; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1726 PyObject **o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1727 va_list vargs; |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1728 |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1729 #ifdef HAVE_STDARG_PROTOTYPES |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1730 va_start(vargs, max); |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1731 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1732 va_start(vargs); |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1733 #endif |
|
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1734 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1735 assert(min >= 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1736 assert(min <= max); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1737 if (!PyTuple_Check(args)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1738 PyErr_SetString(PyExc_SystemError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1739 "PyArg_UnpackTuple() argument list is not a tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1740 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1741 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1742 l = PyTuple_GET_SIZE(args); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1743 if (l < min) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1744 if (name != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1745 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1746 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1747 "%s expected %s%zd arguments, got %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1748 name, (min == max ? "" : "at least "), min, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1749 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1750 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1751 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1752 "unpacked tuple should have %s%zd elements," |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1753 " but has %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1754 (min == max ? "" : "at least "), min, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1755 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1756 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1757 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1758 if (l > max) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1759 if (name != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1760 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1761 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1762 "%s expected %s%zd arguments, got %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1763 name, (min == max ? "" : "at most "), max, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1764 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1765 PyErr_Format( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1766 PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1767 "unpacked tuple should have %s%zd elements," |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1768 " but has %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1769 (min == max ? "" : "at most "), max, l); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1770 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1771 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1772 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1773 for (i = 0; i < l; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1774 o = va_arg(vargs, PyObject **); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1775 *o = PyTuple_GET_ITEM(args, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1776 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1777 va_end(vargs); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1778 return 1; |
|
20632
6c84d55abb58
PyArg_UnpackTuple(): New argument unpacking function suggested by Jim
Fred Drake <fdrake@acm.org>
parents:
20629
diff
changeset
|
1779 } |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1780 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1781 |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1782 /* For type constructors that don't take keyword args |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1783 * |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1784 * Sets a TypeError and returns 0 if the kwds dict is |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
1785 * not empty, returns 1 otherwise |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1786 */ |
|
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1787 int |
|
35999
9541369b0dca
Add const to several API functions that take char *.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35552
diff
changeset
|
1788 _PyArg_NoKeywords(const char *funcname, PyObject *kw) |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1789 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1790 if (kw == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1791 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1792 if (!PyDict_CheckExact(kw)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1793 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1794 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1795 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1796 if (PyDict_Size(kw) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1797 return 1; |
|
43777
0d462d789b18
Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents:
43651
diff
changeset
|
1798 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1799 PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1800 funcname); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57549
diff
changeset
|
1801 return 0; |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34846
diff
changeset
|
1802 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1803 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1804 }; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36988
diff
changeset
|
1805 #endif |
