summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2012-05-08 18:34:12 +0200
committerMike Pall <mike>2012-05-08 18:34:12 +0200
commit886a450a3d3b47ebffb2b21334b872ebedf1e3c8 (patch)
treea36ede63e2501d410a7f9de436c6678c96819ed1
parent0d824b7d1417dbb89468d2b6093c2fad127fcc06 (diff)
downloadluajit2-886a450a3d3b47ebffb2b21334b872ebedf1e3c8.tar.gz
FFI: Allow 'typedef _Bool int BOOL;' to make Windows users happy.
-rw-r--r--src/lj_cconv.c14
-rw-r--r--src/lj_cparse.c9
-rw-r--r--src/lj_ctype.c2
3 files changed, 16 insertions, 9 deletions
diff --git a/src/lj_cconv.c b/src/lj_cconv.c
index 818c1f44..240a8d10 100644
--- a/src/lj_cconv.c
+++ b/src/lj_cconv.c
@@ -131,21 +131,23 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
/* Some basic sanity checks. */
lua_assert(!ctype_isnum(dinfo) || dsize > 0);
lua_assert(!ctype_isnum(sinfo) || ssize > 0);
- lua_assert(!ctype_isbool(dinfo) || dsize == 1);
- lua_assert(!ctype_isbool(sinfo) || ssize == 1);
+ lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);
+ lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);
lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);
lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);
switch (cconv_idx2(dinfo, sinfo)) {
/* Destination is a bool. */
case CCX(B, B):
- *dp = *sp; /* Source operand is already normalized. */
+ /* Source operand is already normalized. */
+ if (dsize == 1) *dp = *sp; else *(int *)dp = *sp;
break;
case CCX(B, I): {
MSize i;
uint8_t b = 0;
for (i = 0; i < ssize; i++) b |= sp[i];
- *dp = (b != 0);
+ b = (b != 0);
+ if (dsize == 1) *dp = b; else *(int *)dp = b;
break;
}
case CCX(B, F): {
@@ -153,7 +155,7 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
if (ssize == sizeof(double)) b = (*(double *)sp != 0);
else if (ssize == sizeof(float)) b = (*(float *)sp != 0);
else goto err_conv; /* NYI: long double. */
- *dp = b;
+ if (dsize == 1) *dp = b; else *(int *)dp = b;
break;
}
@@ -391,7 +393,7 @@ int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
lua_assert(tvisnum(o));
}
} else {
- uint32_t b = (*sp != 0);
+ uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);
setboolV(o, b);
setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */
}
diff --git a/src/lj_cparse.c b/src/lj_cparse.c
index 526332d4..ff5abc70 100644
--- a/src/lj_cparse.c
+++ b/src/lj_cparse.c
@@ -1502,8 +1502,13 @@ end_decl:
/* Determine type info and size. */
CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);
if ((cds & CDF_BOOL)) {
- info = CTINFO(CT_NUM, CTF_UNSIGNED|CTF_BOOL);
- lua_assert(sz == 1);
+ if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))
+ cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE);
+ info |= CTF_BOOL;
+ if (!sz) {
+ if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED;
+ sz = 1;
+ }
} else if ((cds & CDF_FP)) {
info = CTINFO(CT_NUM, CTF_FP);
if ((cds & CDF_LONG)) sz = sizeof(long double);
diff --git a/src/lj_ctype.c b/src/lj_ctype.c
index 353fe9e3..2ea08e25 100644
--- a/src/lj_ctype.c
+++ b/src/lj_ctype.c
@@ -43,7 +43,7 @@
#define CTKWDEF(_) \
/* Type specifiers. */ \
_("void", -1, CTOK_VOID) \
- _("_Bool", 1, CTOK_BOOL) \
+ _("_Bool", 0, CTOK_BOOL) \
_("bool", 1, CTOK_BOOL) \
_("char", 1, CTOK_CHAR) \
_("int", 4, CTOK_INT) \