Merge pull request #7998 from tannewt/fix_mv_cast

Fix memoryview.cast over sliced memoryview
This commit is contained in:
Scott Shawcroft 2023-05-19 08:48:21 -07:00 committed by GitHub
commit 802628cedf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 38 deletions

View File

@ -165,11 +165,15 @@ msgstr ""
msgid "%q length must be >= %d" msgid "%q length must be >= %d"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/picodvi/Framebuffer.c py/argcheck.c #: py/argcheck.c
msgid "%q must be %d" msgid "%q must be %d"
msgstr "" msgstr ""
#: py/argcheck.c shared-bindings/displayio/Bitmap.c #: py/argcheck.c shared-bindings/displayio/Bitmap.c
#: shared-bindings/displayio/Display.c
#: shared-bindings/framebufferio/FramebufferDisplay.c
#: shared-bindings/is31fl3741/FrameBuffer.c
#: shared-bindings/rgbmatrix/RGBMatrix.c
msgid "%q must be %d-%d" msgid "%q must be %d-%d"
msgstr "" msgstr ""
@ -203,6 +207,7 @@ msgstr ""
#: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c #: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
#: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c #: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
#: shared-module/synthio/Synthesizer.c
msgid "%q must be of type %q or %q, not %q" msgid "%q must be of type %q or %q, not %q"
msgstr "" msgstr ""
@ -425,6 +430,7 @@ msgid "Address must be %d bytes long"
msgstr "" msgstr ""
#: ports/espressif/common-hal/memorymap/AddressRange.c #: ports/espressif/common-hal/memorymap/AddressRange.c
#: ports/nrf/common-hal/memorymap/AddressRange.c
msgid "Address range not allowed" msgid "Address range not allowed"
msgstr "" msgstr ""
@ -608,13 +614,6 @@ msgstr ""
msgid "Both pins must support hardware interrupts" msgid "Both pins must support hardware interrupts"
msgstr "" msgstr ""
#: shared-bindings/displayio/Display.c
#: shared-bindings/framebufferio/FramebufferDisplay.c
#: shared-bindings/is31fl3741/FrameBuffer.c
#: shared-bindings/rgbmatrix/RGBMatrix.c
msgid "Brightness must be 0-1.0"
msgstr ""
#: shared-bindings/displayio/Display.c #: shared-bindings/displayio/Display.c
#: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c
msgid "Brightness not adjustable" msgid "Brightness not adjustable"
@ -927,11 +926,6 @@ msgstr ""
msgid "EXTINT channel already in use" msgid "EXTINT channel already in use"
msgstr "" msgstr ""
#: shared-module/synthio/MidiTrack.c
#, c-format
msgid "Error in MIDI stream at position %d"
msgstr ""
#: extmod/modure.c #: extmod/modure.c
msgid "Error in regex" msgid "Error in regex"
msgstr "" msgstr ""
@ -1343,11 +1337,6 @@ msgstr ""
msgid "Mapping must be a tuple" msgid "Mapping must be a tuple"
msgstr "" msgstr ""
#: shared-module/displayio/Shape.c
#, c-format
msgid "Maximum x value when mirrored is %d"
msgstr ""
#: shared-bindings/audiobusio/PDMIn.c #: shared-bindings/audiobusio/PDMIn.c
msgid "Microphone startup delay must be in range 0.0 to 1.0" msgid "Microphone startup delay must be in range 0.0 to 1.0"
msgstr "" msgstr ""
@ -1441,6 +1430,10 @@ msgstr ""
msgid "Nimble out of memory" msgid "Nimble out of memory"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c
msgid "No %q pin"
msgstr ""
#: ports/espressif/common-hal/_bleio/Characteristic.c #: ports/espressif/common-hal/_bleio/Characteristic.c
#: ports/nrf/common-hal/_bleio/Characteristic.c #: ports/nrf/common-hal/_bleio/Characteristic.c
msgid "No CCCD for this Characteristic" msgid "No CCCD for this Characteristic"
@ -1489,14 +1482,12 @@ msgstr ""
msgid "No MOSI pin" msgid "No MOSI pin"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c
#: ports/espressif/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/UART.c
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c #: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "No RX pin" msgid "No RX pin"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c
#: ports/espressif/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/UART.c
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
#: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c #: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
@ -2123,8 +2114,8 @@ msgstr ""
msgid "UART de-init" msgid "UART de-init"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c ports/cxd56/common-hal/busio/UART.c #: ports/cxd56/common-hal/busio/UART.c ports/espressif/common-hal/busio/UART.c
#: ports/espressif/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c
msgid "UART init" msgid "UART init"
msgstr "" msgstr ""
@ -4342,18 +4333,10 @@ msgstr ""
msgid "wrong output type" msgid "wrong output type"
msgstr "" msgstr ""
#: shared-module/displayio/Shape.c
msgid "x value out of bounds"
msgstr ""
#: ports/espressif/common-hal/audiobusio/__init__.c #: ports/espressif/common-hal/audiobusio/__init__.c
msgid "xTaskCreate failed" msgid "xTaskCreate failed"
msgstr "" msgstr ""
#: shared-module/displayio/Shape.c
msgid "y value out of bounds"
msgstr ""
#: extmod/ulab/code/scipy/signal/signal.c #: extmod/ulab/code/scipy/signal/signal.c
msgid "zi must be an ndarray" msgid "zi must be an ndarray"
msgstr "" msgstr ""

View File

@ -241,7 +241,7 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
} }
if (usart_async_init(usart_desc_p, sercom, self->buffer, self->buffer_length, NULL) != ERR_NONE) { if (usart_async_init(usart_desc_p, sercom, self->buffer, self->buffer_length, NULL) != ERR_NONE) {
mp_raise_RuntimeError(translate("UART init")); mp_raise_RuntimeError(NULL);
} }
// usart_async_init() sets a number of defaults based on a prototypical SERCOM // usart_async_init() sets a number of defaults based on a prototypical SERCOM
@ -396,7 +396,7 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
// Read characters. // Read characters.
size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) {
if (self->rx_pin == NO_PIN) { if (self->rx_pin == NO_PIN) {
mp_raise_ValueError(translate("No RX pin")); mp_raise_ValueError_varg(translate("No %q pin"), MP_QSTR_rx);
} }
// This assignment is only here because the usart_async routines take a *const argument. // This assignment is only here because the usart_async routines take a *const argument.
@ -453,7 +453,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t
// Write characters. // Write characters.
size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) { size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) {
if (self->tx_pin == NO_PIN) { if (self->tx_pin == NO_PIN) {
mp_raise_ValueError(translate("No TX pin")); mp_raise_ValueError_varg(translate("No %q pin"), MP_QSTR_tx);
} }
// This assignment is only here because the usart_async routines take a *const argument. // This assignment is only here because the usart_async routines take a *const argument.

View File

@ -716,7 +716,7 @@ MP_NOINLINE int main_(int argc, char **argv) {
} }
#if !MICROPY_VFS #if !MICROPY_VFS
uint mp_import_stat(const char *path) { mp_import_stat_t mp_import_stat(const char *path) {
struct stat st; struct stat st;
if (stat(path, &st) == 0) { if (stat(path, &st) == 0) {
if (S_ISDIR(st.st_mode)) { if (S_ISDIR(st.st_mode)) {

View File

@ -254,12 +254,14 @@ STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args,
STATIC mp_obj_t memoryview_cast(const mp_obj_t self_in, const mp_obj_t typecode_in) { STATIC mp_obj_t memoryview_cast(const mp_obj_t self_in, const mp_obj_t typecode_in) {
mp_obj_array_t *self = MP_OBJ_TO_PTR(self_in); mp_obj_array_t *self = MP_OBJ_TO_PTR(self_in);
const char *typecode = mp_obj_str_get_str(typecode_in); const char *typecode = mp_obj_str_get_str(typecode_in);
size_t element_size = mp_binary_get_size('@', typecode[0], NULL); size_t new_element_size = mp_binary_get_size('@', typecode[0], NULL);
size_t bytelen = self->len * mp_binary_get_size('@', self->typecode & ~MP_OBJ_ARRAY_TYPECODE_FLAG_RW, NULL); size_t old_element_size = mp_binary_get_size('@', self->typecode & ~MP_OBJ_ARRAY_TYPECODE_FLAG_RW, NULL);
if (bytelen % element_size != 0) { size_t bytelen = self->len * old_element_size;
if (bytelen % new_element_size != 0) {
mp_raise_TypeError(MP_ERROR_TEXT("memoryview: length is not a multiple of itemsize")); mp_raise_TypeError(MP_ERROR_TEXT("memoryview: length is not a multiple of itemsize"));
} }
mp_obj_array_t *result = MP_OBJ_TO_PTR(mp_obj_new_memoryview(*typecode, bytelen / element_size, self->items)); mp_obj_array_t *result = MP_OBJ_TO_PTR(mp_obj_new_memoryview(*typecode, bytelen / new_element_size, self->items));
result->memview_offset = (self->memview_offset * old_element_size) / new_element_size;
// test if the object can be written to // test if the object can be written to
if (self->typecode & MP_OBJ_ARRAY_TYPECODE_FLAG_RW) { if (self->typecode & MP_OBJ_ARRAY_TYPECODE_FLAG_RW) {

View File

@ -0,0 +1,21 @@
try:
memoryview(b'a').cast
except:
print("SKIP")
raise SystemExit
b = bytearray(range(16))
def print_memview(mv):
print(", ".join(hex(v) for v in mv))
mv = memoryview(b)
print_memview(mv)
print_memview(mv[4:])
words = mv.cast("I")
print_memview(words)
print_memview(mv[4:].cast("I"))
print_memview(words[1:])
print_memview(words.cast("B"))