|
@@ -493,17 +493,19 @@ static void cconv_substruct_tab(CTState *cts, CType *d, uint8_t *dp,
|
|
id = df->sib;
|
|
id = df->sib;
|
|
if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {
|
|
if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {
|
|
TValue *tv;
|
|
TValue *tv;
|
|
- int32_t i = *ip;
|
|
|
|
|
|
+ int32_t i = *ip, iz = i;
|
|
if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
|
|
if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
|
|
if (i >= 0) {
|
|
if (i >= 0) {
|
|
retry:
|
|
retry:
|
|
tv = (TValue *)lj_tab_getint(t, i);
|
|
tv = (TValue *)lj_tab_getint(t, i);
|
|
if (!tv || tvisnil(tv)) {
|
|
if (!tv || tvisnil(tv)) {
|
|
if (i == 0) { i = 1; goto retry; } /* 1-based tables. */
|
|
if (i == 0) { i = 1; goto retry; } /* 1-based tables. */
|
|
|
|
+ if (iz == 0) { *ip = i = -1; goto tryname; } /* Init named fields. */
|
|
break; /* Stop at first nil. */
|
|
break; /* Stop at first nil. */
|
|
}
|
|
}
|
|
*ip = i + 1;
|
|
*ip = i + 1;
|
|
} else {
|
|
} else {
|
|
|
|
+ tryname:
|
|
tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name)));
|
|
tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name)));
|
|
if (!tv || tvisnil(tv)) continue;
|
|
if (!tv || tvisnil(tv)) continue;
|
|
}
|
|
}
|
|
@@ -524,7 +526,6 @@ static void cconv_struct_tab(CTState *cts, CType *d,
|
|
{
|
|
{
|
|
int32_t i = 0;
|
|
int32_t i = 0;
|
|
memset(dp, 0, d->size); /* Much simpler to clear the struct first. */
|
|
memset(dp, 0, d->size); /* Much simpler to clear the struct first. */
|
|
- if (t->hmask) i = -1; else if (t->asize == 0) return; /* Fast exit. */
|
|
|
|
cconv_substruct_tab(cts, d, dp, t, &i, flags);
|
|
cconv_substruct_tab(cts, d, dp, t, &i, flags);
|
|
}
|
|
}
|
|
|
|
|