mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
Closes #22668: Merge from 3.4.
This commit is contained in:
commit
f5324d7074
5 changed files with 78 additions and 9 deletions
|
@ -1132,6 +1132,51 @@ get_native_fmtchar(char *result, const char *fmt)
|
|||
return -1;
|
||||
}
|
||||
|
||||
Py_LOCAL_INLINE(char *)
|
||||
get_native_fmtstr(const char *fmt)
|
||||
{
|
||||
int at = 0;
|
||||
|
||||
if (fmt[0] == '@') {
|
||||
at = 1;
|
||||
fmt++;
|
||||
}
|
||||
if (fmt[0] == '\0' || fmt[1] != '\0') {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define RETURN(s) do { return at ? "@" s : s; } while (0)
|
||||
|
||||
switch (fmt[0]) {
|
||||
case 'c': RETURN("c");
|
||||
case 'b': RETURN("b");
|
||||
case 'B': RETURN("B");
|
||||
case 'h': RETURN("h");
|
||||
case 'H': RETURN("H");
|
||||
case 'i': RETURN("i");
|
||||
case 'I': RETURN("I");
|
||||
case 'l': RETURN("l");
|
||||
case 'L': RETURN("L");
|
||||
#ifdef HAVE_LONG_LONG
|
||||
case 'q': RETURN("q");
|
||||
case 'Q': RETURN("Q");
|
||||
#endif
|
||||
case 'n': RETURN("n");
|
||||
case 'N': RETURN("N");
|
||||
case 'f': RETURN("f");
|
||||
case 'd': RETURN("d");
|
||||
#ifdef HAVE_C99_BOOL
|
||||
case '?': RETURN("?");
|
||||
#else
|
||||
case '?': RETURN("?");
|
||||
#endif
|
||||
case 'P': RETURN("P");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Cast a memoryview's data type to 'format'. The input array must be
|
||||
C-contiguous. At least one of input-format, output-format must have
|
||||
byte size. The output array is 1-D, with the same byte length as the
|
||||
|
@ -1181,10 +1226,13 @@ cast_to_1D(PyMemoryViewObject *mv, PyObject *format)
|
|||
goto out;
|
||||
}
|
||||
|
||||
strncpy(mv->format, PyBytes_AS_STRING(asciifmt),
|
||||
_Py_MEMORYVIEW_MAX_FORMAT);
|
||||
mv->format[_Py_MEMORYVIEW_MAX_FORMAT-1] = '\0';
|
||||
view->format = mv->format;
|
||||
view->format = get_native_fmtstr(PyBytes_AS_STRING(asciifmt));
|
||||
if (view->format == NULL) {
|
||||
/* NOT_REACHED: get_native_fmtchar() already validates the format. */
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"memoryview: internal error");
|
||||
goto out;
|
||||
}
|
||||
view->itemsize = itemsize;
|
||||
|
||||
view->ndim = 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue