py: binary.c: Properly implement alignment for native unpacked structs.

This commit is contained in:
Paul Sokolovsky 2014-08-10 20:16:39 +03:00
parent 2831a8f800
commit ecca53bd34
1 changed files with 15 additions and 6 deletions

View File

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