Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3c9e6e9

Browse files
author
Victor Stinner
committed
PyArg_Parse*() functions: factorize code for s/z and u/Z formats
1 parent 4aae1eb commit 3c9e6e9

2 files changed

Lines changed: 26 additions & 97 deletions

File tree

Lib/test/test_pyexpat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def test_illegal(self):
184184
self.fail()
185185
except TypeError as e:
186186
self.assertEquals(str(e),
187-
'ParserCreate() argument 2 must be string or None, not int')
187+
'ParserCreate() argument 2 must be str or None, not int')
188188

189189
try:
190190
expat.ParserCreate(namespace_separator='too long')

Python/getargs.c

Lines changed: 25 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -853,70 +853,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
853853
/* XXX WAAAAH! 's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
854854
need to be cleaned up! */
855855

856-
case 's': {/* text string */
857-
if (*format == '*') {
858-
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
859-
860-
if (PyUnicode_Check(arg)) {
861-
uarg = UNICODE_DEFAULT_ENCODING(arg);
862-
if (uarg == NULL)
863-
return converterr(CONV_UNICODE,
864-
arg, msgbuf, bufsize);
865-
PyBuffer_FillInfo(p, arg,
866-
PyBytes_AS_STRING(uarg), PyBytes_GET_SIZE(uarg),
867-
1, 0);
868-
}
869-
else { /* any buffer-like object */
870-
char *buf;
871-
if (getbuffer(arg, p, &buf) < 0)
872-
return converterr(buf, arg, msgbuf, bufsize);
873-
}
874-
if (addcleanup(p, freelist, cleanup_buffer)) {
875-
return converterr(
876-
"(cleanup problem)",
877-
arg, msgbuf, bufsize);
878-
}
879-
format++;
880-
} else if (*format == '#') {
881-
void **p = (void **)va_arg(*p_va, char **);
882-
FETCH_SIZE;
883-
884-
if (PyUnicode_Check(arg)) {
885-
uarg = UNICODE_DEFAULT_ENCODING(arg);
886-
if (uarg == NULL)
887-
return converterr(CONV_UNICODE,
888-
arg, msgbuf, bufsize);
889-
*p = PyBytes_AS_STRING(uarg);
890-
STORE_SIZE(PyBytes_GET_SIZE(uarg));
891-
}
892-
else { /* any buffer-like object */
893-
/* XXX Really? */
894-
char *buf;
895-
Py_ssize_t count = convertbuffer(arg, p, &buf);
896-
if (count < 0)
897-
return converterr(buf, arg, msgbuf, bufsize);
898-
STORE_SIZE(count);
899-
}
900-
format++;
901-
} else {
902-
char **p = va_arg(*p_va, char **);
903-
904-
if (PyUnicode_Check(arg)) {
905-
uarg = UNICODE_DEFAULT_ENCODING(arg);
906-
if (uarg == NULL)
907-
return converterr(CONV_UNICODE,
908-
arg, msgbuf, bufsize);
909-
*p = PyBytes_AS_STRING(uarg);
910-
}
911-
else
912-
return converterr("string", arg, msgbuf, bufsize);
913-
if ((Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg))
914-
return converterr("string without null bytes",
915-
arg, msgbuf, bufsize);
916-
}
917-
break;
918-
}
919-
920856
case 'y': {/* any buffer-like object, but not PyUnicode */
921857
void **p = (void **)va_arg(*p_va, char **);
922858
char *buf;
@@ -948,11 +884,14 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
948884
break;
949885
}
950886

951-
case 'z': {/* like 's' or 's#', but None is okay, stored as NULL */
887+
case 's': /* text string */
888+
case 'z': /* text string or None */
889+
{
952890
if (*format == '*') {
891+
/* "s*" or "z*" */
953892
Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);
954893

955-
if (arg == Py_None)
894+
if (c == 'z' && arg == Py_None)
956895
PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
957896
else if (PyUnicode_Check(arg)) {
958897
uarg = UNICODE_DEFAULT_ENCODING(arg);
@@ -975,11 +914,12 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
975914
}
976915
format++;
977916
} else if (*format == '#') { /* any buffer-like object */
917+
/* "s#" or "z#" */
978918
void **p = (void **)va_arg(*p_va, char **);
979919
FETCH_SIZE;
980920

981-
if (arg == Py_None) {
982-
*p = 0;
921+
if (c == 'z' && arg == Py_None) {
922+
*p = NULL;
983923
STORE_SIZE(0);
984924
}
985925
else if (PyUnicode_Check(arg)) {
@@ -1000,11 +940,12 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
1000940
}
1001941
format++;
1002942
} else {
943+
/* "s" or "z" */
1003944
char **p = va_arg(*p_va, char **);
1004945
uarg = NULL;
1005946

1006-
if (arg == Py_None)
1007-
*p = 0;
947+
if (c == 'z' && arg == Py_None)
948+
*p = NULL;
1008949
else if (PyUnicode_Check(arg)) {
1009950
uarg = UNICODE_DEFAULT_ENCODING(arg);
1010951
if (uarg == NULL)
@@ -1013,24 +954,28 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
1013954
*p = PyBytes_AS_STRING(uarg);
1014955
}
1015956
else
1016-
return converterr("string or None",
957+
return converterr(c == 'z' ? "str or None" : "str",
1017958
arg, msgbuf, bufsize);
1018959
if (*p != NULL && uarg != NULL &&
1019960
(Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg))
1020961
return converterr(
1021-
"string without null bytes or None",
962+
c == 'z' ? "str without null bytes or None"
963+
: "str without null bytes",
1022964
arg, msgbuf, bufsize);
1023965
}
1024966
break;
1025967
}
1026968

1027-
case 'Z': {/* unicode, may be NULL (None) */
969+
case 'u': /* raw unicode buffer (Py_UNICODE *) */
970+
case 'Z': /* raw unicode buffer or None */
971+
{
1028972
if (*format == '#') { /* any buffer-like object */
973+
/* "s#" or "Z#" */
1029974
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
1030975
FETCH_SIZE;
1031976

1032-
if (arg == Py_None) {
1033-
*p = 0;
977+
if (c == 'Z' && arg == Py_None) {
978+
*p = NULL;
1034979
STORE_SIZE(0);
1035980
}
1036981
else if (PyUnicode_Check(arg)) {
@@ -1041,18 +986,20 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
1041986
return converterr("str or None", arg, msgbuf, bufsize);
1042987
format++;
1043988
} else {
989+
/* "s" or "Z" */
1044990
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
1045991

1046-
if (arg == Py_None)
1047-
*p = 0;
992+
if (c == 'Z' && arg == Py_None)
993+
*p = NULL;
1048994
else if (PyUnicode_Check(arg)) {
1049995
*p = PyUnicode_AS_UNICODE(arg);
1050996
if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg))
1051997
return converterr(
1052998
"str without null character or None",
1053999
arg, msgbuf, bufsize);
10541000
} else
1055-
return converterr("str or None", arg, msgbuf, bufsize);
1001+
return converterr(c == 'Z' ? "str or None" : "str",
1002+
arg, msgbuf, bufsize);
10561003
}
10571004
break;
10581005
}
@@ -1222,24 +1169,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
12221169
break;
12231170
}
12241171

1225-
case 'u': {/* raw unicode buffer (Py_UNICODE *) */
1226-
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
1227-
if (!PyUnicode_Check(arg))
1228-
return converterr("str", arg, msgbuf, bufsize);
1229-
*p = PyUnicode_AS_UNICODE(arg);
1230-
if (*format == '#') { /* store pointer and size */
1231-
FETCH_SIZE;
1232-
STORE_SIZE(PyUnicode_GET_SIZE(arg));
1233-
format++;
1234-
} else {
1235-
if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg))
1236-
return converterr(
1237-
"str without null character",
1238-
arg, msgbuf, bufsize);
1239-
}
1240-
break;
1241-
}
1242-
12431172
case 'S': { /* PyBytes object */
12441173
PyObject **p = va_arg(*p_va, PyObject **);
12451174
if (PyBytes_Check(arg))

0 commit comments

Comments
 (0)