diff options
Diffstat (limited to 'src/lj_cconv.c')
-rw-r--r-- | src/lj_cconv.c | 14 |
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 | } |