From 886a450a3d3b47ebffb2b21334b872ebedf1e3c8 Mon Sep 17 00:00:00 2001 From: Mike Pall <mike> Date: Tue, 8 May 2012 18:34:12 +0200 Subject: FFI: Allow 'typedef _Bool int BOOL;' to make Windows users happy. --- src/lj_cconv.c | 14 ++++++++------ src/lj_cparse.c | 9 +++++++-- src/lj_ctype.c | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) (limited to 'src') 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) \ -- cgit v1.2.3-55-g6feb