Skip to content

Commit 26ed001

Browse files
Anton-2pfalcon
authored andcommitted
uctypes: Implement assignment for scalar array
1 parent 8212d97 commit 26ed001

1 file changed

Lines changed: 23 additions & 8 deletions

File tree

extmod/moductypes.c

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
512512
if (value == MP_OBJ_NULL) {
513513
// delete
514514
return MP_OBJ_NULL; // op not supported
515-
} else if (value == MP_OBJ_SENTINEL) {
516-
// load
515+
} else {
516+
// load / store
517517
if (!MP_OBJ_IS_TYPE(self->desc, &mp_type_tuple)) {
518518
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "struct: cannot index"));
519519
}
@@ -533,9 +533,24 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
533533
}
534534

535535
if (t->len == 2) {
536-
byte *p = self->addr + GET_SCALAR_SIZE(val_type) * index;
537-
return get_unaligned(val_type, p, self->flags);
538-
} else {
536+
// array of scalars
537+
if (self->flags == LAYOUT_NATIVE) {
538+
if (value == MP_OBJ_SENTINEL) {
539+
return get_aligned(val_type, self->addr, index);
540+
} else {
541+
set_aligned(val_type, self->addr, index, value);
542+
return value; // just !MP_OBJ_NULL
543+
}
544+
} else {
545+
byte *p = self->addr + GET_SCALAR_SIZE(val_type) * index;
546+
if (value == MP_OBJ_SENTINEL) {
547+
return get_unaligned(val_type, p, self->flags);
548+
} else {
549+
set_unaligned(val_type, p, self->flags, value);
550+
return value; // just !MP_OBJ_NULL
551+
}
552+
}
553+
} else if (value == MP_OBJ_SENTINEL) {
539554
mp_uint_t dummy = 0;
540555
mp_uint_t size = uctypes_struct_size(t->items[2], self->flags, &dummy);
541556
mp_obj_uctypes_struct_t *o = m_new_obj(mp_obj_uctypes_struct_t);
@@ -544,7 +559,10 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
544559
o->addr = self->addr + size * index;
545560
o->flags = self->flags;
546561
return MP_OBJ_FROM_PTR(o);
562+
} else {
563+
return MP_OBJ_NULL; // op not supported
547564
}
565+
548566
} else if (agg_type == PTR) {
549567
byte *p = *(void**)self->addr;
550568
if (MP_OBJ_IS_SMALL_INT(t->items[1])) {
@@ -564,9 +582,6 @@ STATIC mp_obj_t uctypes_struct_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_ob
564582

565583
assert(0);
566584
return MP_OBJ_NULL;
567-
} else {
568-
// store
569-
return MP_OBJ_NULL; // op not supported
570585
}
571586
}
572587

0 commit comments

Comments
 (0)