diff options
-rw-r--r-- | src/lj_cconv.c | 14 | ||||
-rw-r--r-- | src/lj_cparse.c | 9 | ||||
-rw-r--r-- | src/lj_ctype.c | 2 |
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) \ |