return 0;
}
+#define ALIGN(p, s) (void *) ( ((intptr_t) (p) + ((s) - 1)) & ~((s) - 1) )
+
static int
wl_message_size_extra(const struct wl_message *message)
{
- int i, extra;
-
- for (i = 0, extra = 0; message->signature[i]; i++) {
+ char *extra;
+ int i;
+ for (i = 0, extra = NULL; message->signature[i]; i++) {
switch (message->signature[i]) {
case 's':
case 'o':
case 'n':
+ extra = ALIGN(extra, sizeof (void *));
extra += sizeof (void *);
break;
case 'a':
+ extra = ALIGN(extra, sizeof (void *));
extra += sizeof (void *) + sizeof (struct wl_array);
break;
case 'h':
+ extra = ALIGN(extra, sizeof (int));
extra += sizeof (int);
break;
default:
}
}
- return extra;
+ return (intptr_t) extra;
}
static int
*p++ = va_arg(ap, int32_t);
break;
case 's':
+ extra = ALIGN(extra, sizeof (void *));
closure->types[i] = &ffi_type_pointer;
closure->args[i] = extra;
sp = (const char **) extra;
p += aligned / sizeof *p;
break;
case 'o':
+ extra = ALIGN(extra, sizeof (void *));
closure->types[i] = &ffi_type_pointer;
closure->args[i] = extra;
objectp = (struct wl_object **) extra;
break;
case 'a':
+ extra = ALIGN(extra, sizeof (void *));
closure->types[i] = &ffi_type_pointer;
closure->args[i] = extra;
arrayp = (struct wl_array **) extra;
break;
case 'h':
+ extra = ALIGN(extra, sizeof (int));
closure->types[i] = &ffi_type_sint;
closure->args[i] = extra;
fd_ptr = (int *) extra;
goto err;
}
+ extra = ALIGN(extra, sizeof (void *));
s = (char **) extra;
extra += sizeof *s;
closure->args[i] = s;
break;
case 'o':
closure->types[i] = &ffi_type_pointer;
+ extra = ALIGN(extra, sizeof (void *));
id = (uint32_t **) extra;
extra += sizeof *id;
closure->args[i] = id;
break;
case 'n':
closure->types[i] = &ffi_type_pointer;
+ extra = ALIGN(extra, sizeof (void *));
id = (uint32_t **) extra;
extra += sizeof *id;
closure->args[i] = id;
goto err;
}
+ extra = ALIGN(extra, sizeof (void *));
array = (struct wl_array **) extra;
extra += sizeof *array;
closure->args[i] = array;
case 'h':
closure->types[i] = &ffi_type_sint;
+ extra = ALIGN(extra, sizeof (int));
fd = (int *) extra;
extra += sizeof *fd;
closure->args[i] = fd;