Skip to content

uctypes: Element assignment through PTR silently fails #17710

@jepler

Description

@jepler

Port, board and/or hardware

unix port, longlong build

MicroPython version

MicroPython v1.26.0-preview.391.gba3f9cacf0.dirty

Reproduction

import uctypes

# Find the size corresponding to a pointer
ptr_size = uctypes.sizeof((uctypes.PTR, uctypes.INT8))
assert ptr_size in (4, 8)
UINTPTR = uctypes.UINT64 if ptr_size == 8 else uctypes.UINT32

# This descriptor lets us store an address via val then dereference it via ptr
descr = {
    'ptr': (uctypes.PTR | 0, uctypes.INT8),
    'val': UINTPTR | 0
}

# Build the data. `x.ptr` points at b2.
b1 = bytearray(uctypes.sizeof(descr))
b2 = bytearray(8)
x = uctypes.struct(uctypes.addressof(b1), descr)
x.val = uctypes.addressof(b2)

# Optimization: avoid rebuilding the `x.ptr` struct object
# (this has no influence over the bug)
ptr = x.ptr

# Access the data...
print("Setting via uctypes ptr, reading via bytearray")
for i in range(8):
    ptr[i] = i
for i in range(8):
    print(b2[i], end=" ")
    #assert ptr[i] == i ## Assertion fails!
print()

print("Setting via bytearray, reading via ptr")
for i in range(8):
    b2[i] = 10 + i
for i in range(8):
    print(ptr[i], end=" ")
    assert ptr[i] == 10 + i
print()

Expected behaviour

The first line printed should say 0 1 2 3 4 5 6 7 (the values assigned by ptr[i] = i)

Observed behaviour

Instead, it says 0 0 0 0 0 0 0 , because the element assignment is silently ignored.

Additional Information

over in m68k-micropython I'm using this change:

         } else if (agg_type == PTR) {
             byte *p = *(void **)self->addr;
             if (mp_obj_is_small_int(t->items[1])) {
                 uint val_type = GET_TYPE(MP_OBJ_SMALL_INT_VALUE(t->items[1]), VAL_TYPE_BITS);
-                return get_aligned(val_type, p, index);
+                if (value == MP_OBJ_SENTINEL) {
+                    return get_aligned(val_type, p, index);
+                } else {
+                    set_aligned(val_type, p, index, value);
+                    return value; // just !MP_OBJ_NULL
+                }

I can submit this as a PR, but I wanted to make sure the functionality wasn't intentionally missing for some reason I wasn't aware of.

Code of Conduct

Yes, I agree

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy