aboutsummaryrefslogtreecommitdiff
path: root/py/binary.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-08-10 20:16:39 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-08-10 23:21:08 +0300
commitecca53bd34d946f1015d2e8f4474bcd6a950cbee (patch)
tree4e0106591a08da1e670b2e2a5d7d9526613a481f /py/binary.c
parent2831a8f8007fc04feb00d9f2970c8e54470ec8c2 (diff)
py: binary.c: Properly implement alignment for native unpacked structs.
Diffstat (limited to 'py/binary.c')
-rw-r--r--py/binary.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/py/binary.c b/py/binary.c
index 3f1d7f286..65688272a 100644
--- a/py/binary.c
+++ b/py/binary.c
@@ -26,6 +26,7 @@
#include <stdint.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <assert.h>
@@ -37,6 +38,10 @@
// 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 size = 0;
int align = 1;
@@ -68,16 +73,20 @@ int mp_binary_get_size(char struct_type, char val_type, uint *palign) {
case 'b': case 'B':
align = size = 1; break;
case 'h': case 'H':
- align = size = sizeof(short); break;
+ align = alignof(short);
+ size = sizeof(short); break;
case 'i': case 'I':
- align = size = sizeof(int); break;
+ align = alignof(int);
+ size = sizeof(int); break;
case 'l': case 'L':
- align = size = sizeof(long); break;
+ align = alignof(long);
+ size = sizeof(long); break;
case 'q': case 'Q':
- // TODO: This is for x86
- align = sizeof(int); size = sizeof(long long); break;
+ align = alignof(long long);
+ size = sizeof(long long); break;
case 'P': case 'O': case 'S':
- align = size = sizeof(void*); break;
+ align = alignof(void*);
+ size = sizeof(void*); break;
}
}
}