modstruct: Add 'O' typecode for passing mp_obj_t.
Useful as callback data, etc.
This commit is contained in:
parent
4e4fa94c4c
commit
0f836ef893
16
py/binary.c
16
py/binary.c
@ -49,6 +49,8 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
|
|||||||
case 'q': case 'Q':
|
case 'q': case 'Q':
|
||||||
// TODO: This is for x86
|
// TODO: This is for x86
|
||||||
align = sizeof(int); size = sizeof(long long); break;
|
align = sizeof(int); size = sizeof(long long); break;
|
||||||
|
case 'P': case 'O':
|
||||||
|
align = size = sizeof(void*); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,7 +133,9 @@ mp_obj_t mp_binary_get_val(char struct_type, char val_type, byte **ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
*ptr += size;
|
*ptr += size;
|
||||||
if (is_signed(val_type)) {
|
if (val_type == 'O') {
|
||||||
|
return (mp_obj_t)val;
|
||||||
|
} else if (is_signed(val_type)) {
|
||||||
return mp_obj_new_int(val);
|
return mp_obj_new_int(val);
|
||||||
} else {
|
} else {
|
||||||
return mp_obj_new_int_from_uint(val);
|
return mp_obj_new_int_from_uint(val);
|
||||||
@ -156,8 +160,16 @@ void mp_binary_set_val(char struct_type, char val_type, mp_obj_t val_in, byte **
|
|||||||
#if MP_ENDIANNESS_BIG
|
#if MP_ENDIANNESS_BIG
|
||||||
#error Not implemented
|
#error Not implemented
|
||||||
#endif
|
#endif
|
||||||
machine_int_t val = mp_obj_get_int(val_in);
|
machine_int_t val;
|
||||||
byte *in = (byte*)&val;
|
byte *in = (byte*)&val;
|
||||||
|
switch (val_type) {
|
||||||
|
case 'O':
|
||||||
|
in = (byte*)&val_in;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
val = mp_obj_get_int(val_in);
|
||||||
|
}
|
||||||
|
|
||||||
int in_delta, out_delta;
|
int in_delta, out_delta;
|
||||||
uint val_sz = MIN(size, sizeof(val));
|
uint val_sz = MIN(size, sizeof(val));
|
||||||
if (struct_type == '>') {
|
if (struct_type == '>') {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user