@@ -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