[Python-checkins] CVS: python/dist/src/Python getargs.c,2.72,2.73
Tim Peters
tim_one@users.sourceforge.net
Fri, 26 Oct 2001 21:26:59 -0700
Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv3534/python/Python
Modified Files:
getargs.c
Log Message:
PyArg_ParseTupleAndKeywords: return false on internal error, not -1 (I
introduced this bug just a little while ago, when *adding* internal error
checks).
vgetargskeywords: Rewrote the section that crawls over the format string.
+ Added block comment so it won't take the next person 15 minutes to
reverse-engineer what it's doing.
+ Lined up the "else" clauses.
+ Rearranged the ifs in decreasing order of likelihood (for speed).
Index: getargs.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/getargs.c,v
retrieving revision 2.72
retrieving revision 2.73
diff -C2 -d -r2.72 -r2.73
*** getargs.c 2001/10/27 03:58:40 2.72
--- getargs.c 2001/10/27 04:26:57 2.73
***************
*** 998,1001 ****
--- 998,1002 ----
Geoff Philbrick <philbric@delphi.hks.com> */
+ /* Return false (0) for error, else true. */
int
PyArg_ParseTupleAndKeywords(PyObject *args,
***************
*** 1013,1017 ****
{
PyErr_BadInternalCall();
! return -1;
}
--- 1014,1018 ----
{
PyErr_BadInternalCall();
! return 0;
}
***************
*** 1029,1036 ****
char msgbuf[256];
int levels[32];
! char *fname = NULL;
! char *message = NULL;
! int min = -1;
! int max = 0;
char *formatsave = format;
int i, len, tplen, kwlen;
--- 1030,1035 ----
char msgbuf[256];
int levels[32];
! char *fname, *message;
! int min, max;
char *formatsave = format;
int i, len, tplen, kwlen;
***************
*** 1044,1078 ****
assert(kwlist != NULL);
assert(p_va != NULL);
-
- /* nested tuples cannot be parsed when using keyword arguments */
! for (;;) {
! int c = *format++;
! if (c == '(') {
! PyErr_SetString(PyExc_SystemError,
! "tuple found in format when using keyword arguments");
! return 0;
! }
! else if (c == '\0')
! break;
! else if (c == ':') {
fname = format;
break;
! } else if (c == ';') {
message = format;
break;
! } else if (c == 'e')
! ; /* Pass */
! else if (isalpha(c))
! max++;
! else if (c == '|')
! min = max;
}
!
! if (min < 0)
min = max;
!
format = formatsave;
!
if (!PyTuple_Check(args)) {
PyErr_SetString(PyExc_SystemError,
--- 1043,1082 ----
assert(kwlist != NULL);
assert(p_va != NULL);
! /* Search the format:
! message <- error msg, if any (else NULL).
! name <- routine name, if any (else NULL).
! min <- # of required arguments, or -1 if all are required.
! max <- most arguments (required + optional).
! Raise error if a tuple arg spec is found.
! */
! fname = message = NULL;
! min = -1;
! max = 0;
! while ((i = *format++) != '\0') {
! if (isalpha(i) && i != 'e')
! max++;
! else if (i == '|')
! min = max;
! else if (i == ':') {
fname = format;
break;
! }
! else if (i == ';') {
message = format;
break;
! }
! else if (i == '(') {
! PyErr_SetString(PyExc_SystemError,
! "tuple found in format when using keyword arguments");
! return 0;
! }
}
! if (min < 0) {
! /* All arguments are required. */
min = max;
! }
format = formatsave;
!
if (!PyTuple_Check(args)) {
PyErr_SetString(PyExc_SystemError,
***************
*** 1080,1086 ****
return 0;
}
!
tplen = PyTuple_GET_SIZE(args);
!
/* do a cursory check of the keywords just to see how many we got */
--- 1084,1090 ----
return 0;
}
!
tplen = PyTuple_GET_SIZE(args);
!
/* do a cursory check of the keywords just to see how many we got */