diff options
Diffstat (limited to 'Python/getargs.c')
| -rw-r--r-- | Python/getargs.c | 57 | 
1 files changed, 27 insertions, 30 deletions
| diff --git a/Python/getargs.c b/Python/getargs.c index 600941d..c3da368 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -310,20 +310,18 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)          if (max == 0) {              if (args == NULL)                  return 1; -            PyOS_snprintf(msgbuf, sizeof(msgbuf), -                          "%.200s%s takes no arguments", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()"); -            PyErr_SetString(PyExc_TypeError, msgbuf); +            PyErr_Format(PyExc_TypeError, +                         "%.200s%s takes no arguments", +                         fname==NULL ? "function" : fname, +                         fname==NULL ? "" : "()");              return 0;          }          else if (min == 1 && max == 1) {              if (args == NULL) { -                PyOS_snprintf(msgbuf, sizeof(msgbuf), -                      "%.200s%s takes at least one argument", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()"); -                PyErr_SetString(PyExc_TypeError, msgbuf); +                PyErr_Format(PyExc_TypeError, +                             "%.200s%s takes at least one argument", +                             fname==NULL ? "function" : fname, +                             fname==NULL ? "" : "()");                  return 0;              }              msg = convertitem(args, &format, p_va, flags, levels, @@ -349,20 +347,18 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)      len = PyTuple_GET_SIZE(args);      if (len < min || max < len) { -        if (message == NULL) { -            PyOS_snprintf(msgbuf, sizeof(msgbuf), -                          "%.150s%s takes %s %d argument%s " -                          "(%ld given)", -                          fname==NULL ? "function" : fname, -                          fname==NULL ? "" : "()", -                          min==max ? "exactly" -                          : len < min ? "at least" : "at most", -                          len < min ? min : max, -                          (len < min ? min : max) == 1 ? "" : "s", -                          Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); -            message = msgbuf; -        } -        PyErr_SetString(PyExc_TypeError, message); +        if (message == NULL) +            PyErr_Format(PyExc_TypeError, +                         "%.150s%s takes %s %d argument%s (%ld given)", +                         fname==NULL ? "function" : fname, +                         fname==NULL ? "" : "()", +                         min==max ? "exactly" +                         : len < min ? "at least" : "at most", +                         len < min ? min : max, +                         (len < min ? min : max) == 1 ? "" : "s", +                         Py_SAFE_DOWNCAST(len, Py_ssize_t, long)); +        else +            PyErr_SetString(PyExc_TypeError, message);          return 0;      } @@ -551,7 +547,7 @@ convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,  #define UNICODE_DEFAULT_ENCODING(arg) \ -    _PyUnicode_AsDefaultEncodedString(arg, NULL) +    _PyUnicode_AsDefaultEncodedString(arg)  /* Format an error message generated by convertsimple(). */ @@ -832,6 +828,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,          char *p = va_arg(*p_va, char *);          if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)              *p = PyBytes_AS_STRING(arg)[0]; +        else if (PyByteArray_Check(arg) && PyByteArray_Size(arg) == 1) +            *p = PyByteArray_AS_STRING(arg)[0];          else              return converterr("a byte string of length 1", arg, msgbuf, bufsize);          break; @@ -966,9 +964,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,      case 'u': /* raw unicode buffer (Py_UNICODE *) */      case 'Z': /* raw unicode buffer or None */      { +        Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); +          if (*format == '#') { /* any buffer-like object */              /* "s#" or "Z#" */ -            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);              FETCH_SIZE;              if (c == 'Z' && arg == Py_None) { @@ -984,8 +983,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,              format++;          } else {              /* "s" or "Z" */ -            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); -              if (c == 'Z' && arg == Py_None)                  *p = NULL;              else if (PyUnicode_Check(arg)) { @@ -1459,8 +1456,8 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,      nargs = PyTuple_GET_SIZE(args);      nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);      if (nargs + nkeywords > len) { -        PyErr_Format(PyExc_TypeError, "%s%s takes at most %d " -                     "argument%s (%d given)", +        PyErr_Format(PyExc_TypeError, +                     "%s%s takes at most %d argument%s (%d given)",                       (fname == NULL) ? "function" : fname,                       (fname == NULL) ? "" : "()",                       len, | 
