@@ -283,13 +283,13 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(uctypes_struct_sizeof_obj, uctypes_struct_sizeo
283283
284284STATIC inline mp_obj_t get_unaligned (uint val_type , void * p , int big_endian ) {
285285 char struct_type = big_endian ? '>' : '<' ;
286- static const char type2char [8 ] = "BbHhIiQq" ;
286+ static const char type2char [16 ] = "BbHhIiQq------fd " ;
287287 return mp_binary_get_val (struct_type , type2char [val_type ], (byte * * )& p );
288288}
289289
290290STATIC inline void set_unaligned (uint val_type , byte * p , int big_endian , mp_obj_t val ) {
291291 char struct_type = big_endian ? '>' : '<' ;
292- static const char type2char [8 ] = "BbHhIiQq" ;
292+ static const char type2char [16 ] = "BbHhIiQq------fd " ;
293293 mp_binary_set_val (struct_type , type2char [val_type ], val , & p );
294294}
295295
@@ -349,6 +349,17 @@ STATIC mp_obj_t get_aligned(uint val_type, void *p, mp_int_t index) {
349349}
350350
351351STATIC void set_aligned (uint val_type , void * p , mp_int_t index , mp_obj_t val ) {
352+ #if MICROPY_PY_BUILTINS_FLOAT
353+ if (val_type == FLOAT32 || val_type == FLOAT64 ) {
354+ mp_float_t v = mp_obj_get_float (val );
355+ if (val_type == FLOAT32 ) {
356+ ((float * )p )[index ] = v ;
357+ } else {
358+ ((double * )p )[index ] = v ;
359+ }
360+ return ;
361+ }
362+ #endif
352363 mp_int_t v = mp_obj_get_int (val );
353364 switch (val_type ) {
354365 case UINT8 :
@@ -392,7 +403,7 @@ STATIC mp_obj_t uctypes_struct_attr_op(mp_obj_t self_in, qstr attr, mp_obj_t set
392403 offset &= VALUE_MASK (VAL_TYPE_BITS );
393404//printf("scalar type=%d offset=%x\n", val_type, offset);
394405
395- if (val_type <= INT64 ) {
406+ if (val_type <= INT64 || val_type == FLOAT32 || val_type == FLOAT64 ) {
396407// printf("size=%d\n", GET_SCALAR_SIZE(val_type));
397408 if (self -> flags == LAYOUT_NATIVE ) {
398409 if (set_val == MP_OBJ_NULL ) {
@@ -686,6 +697,11 @@ STATIC const mp_rom_map_elem_t mp_module_uctypes_globals_table[] = {
686697 { MP_ROM_QSTR (MP_QSTR_BF_POS ), MP_ROM_INT (17 ) },
687698 { MP_ROM_QSTR (MP_QSTR_BF_LEN ), MP_ROM_INT (22 ) },
688699
700+ #if MICROPY_PY_BUILTINS_FLOAT
701+ { MP_ROM_QSTR (MP_QSTR_FLOAT32 ), MP_ROM_INT (TYPE2SMALLINT (FLOAT32 , 4 )) },
702+ { MP_ROM_QSTR (MP_QSTR_FLOAT64 ), MP_ROM_INT (TYPE2SMALLINT (FLOAT64 , 4 )) },
703+ #endif
704+
689705 { MP_ROM_QSTR (MP_QSTR_PTR ), MP_ROM_INT (TYPE2SMALLINT (PTR , AGG_TYPE_BITS )) },
690706 { MP_ROM_QSTR (MP_QSTR_ARRAY ), MP_ROM_INT (TYPE2SMALLINT (ARRAY , AGG_TYPE_BITS )) },
691707};
0 commit comments