summaryrefslogtreecommitdiff
path: root/src/lj_cconv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_cconv.c')
-rw-r--r--src/lj_cconv.c14
1 files changed, 8 insertions, 6 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 }