mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
FFI: Allow 'typedef _Bool int BOOL;' to make Windows users happy.
This commit is contained in:
parent
0d824b7d14
commit
886a450a3d
@ -131,21 +131,23 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
|
|||||||
/* Some basic sanity checks. */
|
/* Some basic sanity checks. */
|
||||||
lua_assert(!ctype_isnum(dinfo) || dsize > 0);
|
lua_assert(!ctype_isnum(dinfo) || dsize > 0);
|
||||||
lua_assert(!ctype_isnum(sinfo) || ssize > 0);
|
lua_assert(!ctype_isnum(sinfo) || ssize > 0);
|
||||||
lua_assert(!ctype_isbool(dinfo) || dsize == 1);
|
lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);
|
||||||
lua_assert(!ctype_isbool(sinfo) || ssize == 1);
|
lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);
|
||||||
lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);
|
lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);
|
||||||
lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);
|
lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);
|
||||||
|
|
||||||
switch (cconv_idx2(dinfo, sinfo)) {
|
switch (cconv_idx2(dinfo, sinfo)) {
|
||||||
/* Destination is a bool. */
|
/* Destination is a bool. */
|
||||||
case CCX(B, B):
|
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;
|
break;
|
||||||
case CCX(B, I): {
|
case CCX(B, I): {
|
||||||
MSize i;
|
MSize i;
|
||||||
uint8_t b = 0;
|
uint8_t b = 0;
|
||||||
for (i = 0; i < ssize; i++) b |= sp[i];
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case CCX(B, F): {
|
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);
|
if (ssize == sizeof(double)) b = (*(double *)sp != 0);
|
||||||
else if (ssize == sizeof(float)) b = (*(float *)sp != 0);
|
else if (ssize == sizeof(float)) b = (*(float *)sp != 0);
|
||||||
else goto err_conv; /* NYI: long double. */
|
else goto err_conv; /* NYI: long double. */
|
||||||
*dp = b;
|
if (dsize == 1) *dp = b; else *(int *)dp = b;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +393,7 @@ int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
|
|||||||
lua_assert(tvisnum(o));
|
lua_assert(tvisnum(o));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint32_t b = (*sp != 0);
|
uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);
|
||||||
setboolV(o, b);
|
setboolV(o, b);
|
||||||
setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */
|
setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */
|
||||||
}
|
}
|
||||||
|
@ -1502,8 +1502,13 @@ end_decl:
|
|||||||
/* Determine type info and size. */
|
/* Determine type info and size. */
|
||||||
CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);
|
CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);
|
||||||
if ((cds & CDF_BOOL)) {
|
if ((cds & CDF_BOOL)) {
|
||||||
info = CTINFO(CT_NUM, CTF_UNSIGNED|CTF_BOOL);
|
if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))
|
||||||
lua_assert(sz == 1);
|
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)) {
|
} else if ((cds & CDF_FP)) {
|
||||||
info = CTINFO(CT_NUM, CTF_FP);
|
info = CTINFO(CT_NUM, CTF_FP);
|
||||||
if ((cds & CDF_LONG)) sz = sizeof(long double);
|
if ((cds & CDF_LONG)) sz = sizeof(long double);
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
#define CTKWDEF(_) \
|
#define CTKWDEF(_) \
|
||||||
/* Type specifiers. */ \
|
/* Type specifiers. */ \
|
||||||
_("void", -1, CTOK_VOID) \
|
_("void", -1, CTOK_VOID) \
|
||||||
_("_Bool", 1, CTOK_BOOL) \
|
_("_Bool", 0, CTOK_BOOL) \
|
||||||
_("bool", 1, CTOK_BOOL) \
|
_("bool", 1, CTOK_BOOL) \
|
||||||
_("char", 1, CTOK_CHAR) \
|
_("char", 1, CTOK_CHAR) \
|
||||||
_("int", 4, CTOK_INT) \
|
_("int", 4, CTOK_INT) \
|
||||||
|
Loading…
Reference in New Issue
Block a user