py: binary.c: Properly implement alignment for native unpacked structs.
This commit is contained in:
parent
2831a8f800
commit
ecca53bd34
21
py/binary.c
21
py/binary.c
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
@ -37,6 +38,10 @@
|
||||||
|
|
||||||
// Helpers to work with binary-encoded data
|
// Helpers to work with binary-encoded data
|
||||||
|
|
||||||
|
#ifndef alignof
|
||||||
|
#define alignof(type) offsetof(struct { char c; type t; }, t)
|
||||||
|
#endif
|
||||||
|
|
||||||
int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
|
int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
int align = 1;
|
int align = 1;
|
||||||
|
@ -68,16 +73,20 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
|
||||||
case 'b': case 'B':
|
case 'b': case 'B':
|
||||||
align = size = 1; break;
|
align = size = 1; break;
|
||||||
case 'h': case 'H':
|
case 'h': case 'H':
|
||||||
align = size = sizeof(short); break;
|
align = alignof(short);
|
||||||
|
size = sizeof(short); break;
|
||||||
case 'i': case 'I':
|
case 'i': case 'I':
|
||||||
align = size = sizeof(int); break;
|
align = alignof(int);
|
||||||
|
size = sizeof(int); break;
|
||||||
case 'l': case 'L':
|
case 'l': case 'L':
|
||||||
align = size = sizeof(long); break;
|
align = alignof(long);
|
||||||
|
size = sizeof(long); break;
|
||||||
case 'q': case 'Q':
|
case 'q': case 'Q':
|
||||||
// TODO: This is for x86
|
align = alignof(long long);
|
||||||
align = sizeof(int); size = sizeof(long long); break;
|
size = sizeof(long long); break;
|
||||||
case 'P': case 'O': case 'S':
|
case 'P': case 'O': case 'S':
|
||||||
align = size = sizeof(void*); break;
|
align = alignof(void*);
|
||||||
|
size = sizeof(void*); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue