summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-01-12 22:33:32 -0800
committerKaz Kylheku <kaz@kylheku.com>2015-01-12 22:33:32 -0800
commit0343c6f32c5bd8335e88595cb9d23506625b2586 (patch)
treefd166afd54a05efb0cb39aecfd02768da9d8153b /lib.h
parent3e313905ec6f7680c1408b12051cb81d46150083 (diff)
downloadtxr-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.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/lib.h b/lib.h
index a95c2e3f..e55a3516 100644
--- a/lib.h
+++ b/lib.h
@@ -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