Module: xenomai-forge Branch: master Commit: 75b416f0d03ffbed3dd179d007e11ec43748b91f URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=75b416f0d03ffbed3dd179d007e11ec43748b91f
Author: Philippe Gerum <r...@xenomai.org> Date: Mon May 5 09:28:54 2014 +0200 copperplate/heapobj: check sanity of ref-types at build time (C only) --- include/copperplate/heapobj.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/include/copperplate/heapobj.h b/include/copperplate/heapobj.h index 38deb89..6b5617c 100644 --- a/include/copperplate/heapobj.h +++ b/include/copperplate/heapobj.h @@ -324,21 +324,30 @@ static inline int pshared_check(void *heap, void *addr) return 0; } +#ifdef __cplusplus +#define __check_ref_width(__dst, __src) \ + ({ \ + assert(sizeof(__dst) >= sizeof(__src)); \ + (typeof(__dst))__src; \ + }) +#else +#define __check_ref_width(__dst, __src) \ + __builtin_choose_expr( \ + sizeof(__dst) >= sizeof(__src), (typeof(__dst))__src, \ + ((void)0)) +#endif + #define mainheap_ref(ptr, type) \ ({ \ type handle; \ - assert(__builtin_types_compatible_p(typeof(type), unsigned long) || \ - __builtin_types_compatible_p(typeof(type), uintptr_t)); \ + handle = __check_ref_width(handle, ptr); \ assert(ptr == NULL || __memchk(__main_heap, ptr)); \ - handle = (type)ptr; \ handle; \ }) #define mainheap_deref(handle, type) \ ({ \ type *ptr; \ - assert(__builtin_types_compatible_p(typeof(handle), unsigned long) || \ - __builtin_types_compatible_p(typeof(handle), uintptr_t)); \ - ptr = (type *)handle; \ + ptr = __check_ref_width(ptr, handle); \ ptr; \ }) _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git