aboutsummaryrefslogtreecommitdiff
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)
downloadluajit-886a450a3d3b47ebffb2b21334b872ebedf1e3c8.tar.gz
luajit-886a450a3d3b47ebffb2b21334b872ebedf1e3c8.tar.bz2
luajit-886a450a3d3b47ebffb2b21334b872ebedf1e3c8.zip
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,
131 /* Some basic sanity checks. */ 131 /* Some basic sanity checks. */
132 lua_assert(!ctype_isnum(dinfo) || dsize > 0); 132 lua_assert(!ctype_isnum(dinfo) || dsize > 0);
133 lua_assert(!ctype_isnum(sinfo) || ssize > 0); 133 lua_assert(!ctype_isnum(sinfo) || ssize > 0);
134 lua_assert(!ctype_isbool(dinfo) || dsize == 1); 134 lua_assert(!ctype_isbool(dinfo) || dsize == 1 || dsize == 4);
135 lua_assert(!ctype_isbool(sinfo) || ssize == 1); 135 lua_assert(!ctype_isbool(sinfo) || ssize == 1 || ssize == 4);
136 lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize); 136 lua_assert(!ctype_isinteger(dinfo) || (1u<<lj_fls(dsize)) == dsize);
137 lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize); 137 lua_assert(!ctype_isinteger(sinfo) || (1u<<lj_fls(ssize)) == ssize);
138 138
139 switch (cconv_idx2(dinfo, sinfo)) { 139 switch (cconv_idx2(dinfo, sinfo)) {
140 /* Destination is a bool. */ 140 /* Destination is a bool. */
141 case CCX(B, B): 141 case CCX(B, B):
142 *dp = *sp; /* Source operand is already normalized. */ 142 /* Source operand is already normalized. */
143 if (dsize == 1) *dp = *sp; else *(int *)dp = *sp;
143 break; 144 break;
144 case CCX(B, I): { 145 case CCX(B, I): {
145 MSize i; 146 MSize i;
146 uint8_t b = 0; 147 uint8_t b = 0;
147 for (i = 0; i < ssize; i++) b |= sp[i]; 148 for (i = 0; i < ssize; i++) b |= sp[i];
148 *dp = (b != 0); 149 b = (b != 0);
150 if (dsize == 1) *dp = b; else *(int *)dp = b;
149 break; 151 break;
150 } 152 }
151 case CCX(B, F): { 153 case CCX(B, F): {
@@ -153,7 +155,7 @@ void lj_cconv_ct_ct(CTState *cts, CType *d, CType *s,
153 if (ssize == sizeof(double)) b = (*(double *)sp != 0); 155 if (ssize == sizeof(double)) b = (*(double *)sp != 0);
154 else if (ssize == sizeof(float)) b = (*(float *)sp != 0); 156 else if (ssize == sizeof(float)) b = (*(float *)sp != 0);
155 else goto err_conv; /* NYI: long double. */ 157 else goto err_conv; /* NYI: long double. */
156 *dp = b; 158 if (dsize == 1) *dp = b; else *(int *)dp = b;
157 break; 159 break;
158 } 160 }
159 161
@@ -391,7 +393,7 @@ int lj_cconv_tv_ct(CTState *cts, CType *s, CTypeID sid,
391 lua_assert(tvisnum(o)); 393 lua_assert(tvisnum(o));
392 } 394 }
393 } else { 395 } else {
394 uint32_t b = (*sp != 0); 396 uint32_t b = s->size == 1 ? (*sp != 0) : (*(int *)sp != 0);
395 setboolV(o, b); 397 setboolV(o, b);
396 setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */ 398 setboolV(&cts->g->tmptv2, b); /* Remember for trace recorder. */
397 } 399 }
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:
1502 /* Determine type info and size. */ 1502 /* Determine type info and size. */
1503 CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0); 1503 CTInfo info = CTINFO(CT_NUM, (cds & CDF_UNSIGNED) ? CTF_UNSIGNED : 0);
1504 if ((cds & CDF_BOOL)) { 1504 if ((cds & CDF_BOOL)) {
1505 info = CTINFO(CT_NUM, CTF_UNSIGNED|CTF_BOOL); 1505 if ((cds & ~(CDF_SCL|CDF_BOOL|CDF_INT|CDF_SIGNED|CDF_UNSIGNED)))
1506 lua_assert(sz == 1); 1506 cp_errmsg(cp, 0, LJ_ERR_FFI_INVTYPE);
1507 info |= CTF_BOOL;
1508 if (!sz) {
1509 if (!(cds & CDF_SIGNED)) info |= CTF_UNSIGNED;
1510 sz = 1;
1511 }
1507 } else if ((cds & CDF_FP)) { 1512 } else if ((cds & CDF_FP)) {
1508 info = CTINFO(CT_NUM, CTF_FP); 1513 info = CTINFO(CT_NUM, CTF_FP);
1509 if ((cds & CDF_LONG)) sz = sizeof(long double); 1514 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 @@
43#define CTKWDEF(_) \ 43#define CTKWDEF(_) \
44 /* Type specifiers. */ \ 44 /* Type specifiers. */ \
45 _("void", -1, CTOK_VOID) \ 45 _("void", -1, CTOK_VOID) \
46 _("_Bool", 1, CTOK_BOOL) \ 46 _("_Bool", 0, CTOK_BOOL) \
47 _("bool", 1, CTOK_BOOL) \ 47 _("bool", 1, CTOK_BOOL) \
48 _("char", 1, CTOK_CHAR) \ 48 _("char", 1, CTOK_CHAR) \
49 _("int", 4, CTOK_INT) \ 49 _("int", 4, CTOK_INT) \