diff --git a/configure.ac b/configure.ac index 2fb058ffdd72931a08204144c552ce94510636ad..51a3597af9683c11d414d132d49999a674f496ab 100644 --- a/configure.ac +++ b/configure.ac @@ -137,6 +137,7 @@ PKG_CHECK_MODULES(ICU, icu, have_icu=true, [ AC_SUBST(ICU_LIBS) fi ]) +have_icu=false if $have_icu; then AC_DEFINE(HAVE_ICU, 1, [Have ICU library]) fi diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index f4a2ba969090842b106347ca2cad52830df37195..5d90e5bdc1cdb04479e1cefcc4d037b96118b320 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -80,17 +80,25 @@ inline Type& StructAfter(TObject &X) */ /* Check _assertion in a method environment */ -#define _DEFINE_SIZE_ASSERTION(_assertion) \ - inline void _size_assertion (void) const \ - { ASSERT_STATIC (_assertion); } +#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \ + inline void _instance_assertion_on_line_##_line (void) const \ + { \ + ASSERT_STATIC (_assertion); \ + ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \ + } +# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion) +# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion) + /* Check that _code compiles in a method environment */ -#define _DEFINE_COMPILES_ASSERTION(_code) \ - inline void _compiles_assertion (void) const \ +#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \ + inline void _compiles_assertion_on_line_##_line (void) const \ { _code; } +# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code) +# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code) #define DEFINE_SIZE_STATIC(size) \ - _DEFINE_SIZE_ASSERTION (sizeof (*this) == (size)); \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \ static const unsigned int static_size = (size); \ static const unsigned int min_size = (size) @@ -98,21 +106,21 @@ inline Type& StructAfter(TObject &X) #define VAR 1 #define DEFINE_SIZE_UNION(size, _member) \ - _DEFINE_SIZE_ASSERTION (this->u._member.static_size == (size)); \ + DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \ static const unsigned int min_size = (size) #define DEFINE_SIZE_MIN(size) \ - _DEFINE_SIZE_ASSERTION (sizeof (*this) >= (size)); \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \ static const unsigned int min_size = (size) #define DEFINE_SIZE_ARRAY(size, array) \ - _DEFINE_SIZE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \ - _DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \ + DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \ static const unsigned int min_size = (size) #define DEFINE_SIZE_ARRAY2(size, array1, array2) \ - _DEFINE_SIZE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \ - _DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \ + DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \ + DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \ static const unsigned int min_size = (size) diff --git a/src/hb-private.hh b/src/hb-private.hh index 44b7314c0018268edd6d52670fd2a4433385d16c..8f821f2d6c6da34c682970f19fb91a97d39e9ab5 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -104,6 +104,30 @@ ASSERT_STATIC (sizeof (hb_position_t) == 4); ASSERT_STATIC (sizeof (hb_mask_t) == 4); ASSERT_STATIC (sizeof (hb_var_int_t) == 4); + +/* We like our types POD */ + +#define _ASSERT_TYPE_POD1(_line, _type) union _type_##_type##_on_line_##_line##_is_not_POD { _type instance; } +#define _ASSERT_TYPE_POD0(_line, _type) _ASSERT_TYPE_POD1 (_line, _type) +#define ASSERT_TYPE_POD(_type) _ASSERT_TYPE_POD0 (__LINE__, _type) + +#ifdef __GNUC__ +# define _ASSERT_INSTANCE_POD1(_line, _instance) union _type_of_instance_on_line_##_line##_is_not_POD { __typeof__(_instance) instance; } +#else +# define _ASSERT_INSTANCE_POD1(_line, _instance) typedef int _assertion_on_line_##_line##_not_tested +#endif +# define _ASSERT_INSTANCE_POD0(_line, _instance) _ASSERT_INSTANCE_POD1 (_line, _instance) +# define ASSERT_INSTANCE_POD(_instance) _ASSERT_INSTANCE_POD0 (__LINE__, _instance) + +/* Check _assertion in a method environment */ +#define _ASSERT_POD1(_line) \ + inline void _static_assertion_on_line_##_line (void) const \ + { _ASSERT_INSTANCE_POD1 (*this); /* Make sure it's POD. */ } +# define _ASSERT_POD0(_line) _ASSERT_POD1 (_line) +# define ASSERT_POD() _ASSERT_POD0 (__LINE__) + + + /* Misc */