diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-01-12 22:33:32 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-01-12 22:33:32 -0800 |
commit | 0343c6f32c5bd8335e88595cb9d23506625b2586 (patch) | |
tree | fd166afd54a05efb0cb39aecfd02768da9d8153b /lib.h | |
parent | 3e313905ec6f7680c1408b12051cb81d46150083 (diff) | |
download | txr-0343c6f32c5bd8335e88595cb9d23506625b2586.tar.gz txr-0343c6f32c5bd8335e88595cb9d23506625b2586.tar.bz2 txr-0343c6f32c5bd8335e88595cb9d23506625b2586.zip |
Fix for LLVM wchar_t literals not being four byte
aligned, affecting OS X port.
* configure: Detect a SIZEOF_WCHAR_T when detecting integer
type that will hold a pointer. In the lit_align test,
if we are on Apple Mac OSX, use a lit_align of 2,
so the logic kicks in for padding literals and handling
misalignment.
* lib.h (litptr): Add a case for LIT_ALIGN < 4 and
SIZEOF_WCHAR_T == 4. In this case we do the arithmetic
on the pointer using short *, and then convert to
wchar_t.
* HACKING: New section 2.4.3 about new wchar_t hack.
Diffstat (limited to 'lib.h')
-rw-r--r-- | lib.h | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -327,9 +327,12 @@ INLINE val static_str(const wchli_t *str) INLINE wchar_t *litptr(val obj) { -#if LIT_ALIGN < 4 +#if LIT_ALIGN < 4 && SIZEOF_WCHAR_T < 4 wchar_t *ret = coerce(wchar_t *, (coerce(cnum, obj) & ~TAG_MASK)); return (*ret == 0) ? ret + 1 : ret; +#elif LIT_ALIGN < 4 && SIZEOF_WCHAR_T == 4 + short *ret = coerce(short *, (coerce(cnum, obj) & ~TAG_MASK)); + return coerce(wchar_t *, (*ret == 0) ? ret + 1 : ret); #else return coerce(wchar_t *, coerce(cnum, obj) & ~TAG_MASK); #endif |