aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_crecord.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index c7b60b3a..be23cd62 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1024,8 +1024,26 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)
1024 crec_ct_tv(J, dc, dp, sp, sval); 1024 crec_ct_tv(J, dc, dp, sp, sval);
1025 } 1025 }
1026 } else if (ctype_isstruct(d->info)) { 1026 } else if (ctype_isstruct(d->info)) {
1027 CTypeID fid = d->sib; 1027 CTypeID fid;
1028 MSize i = 1; 1028 MSize i = 1;
1029 if (!J->base[1]) { /* Handle zero-fill of struct-of-NYI. */
1030 fid = d->sib;
1031 while (fid) {
1032 CType *df = ctype_get(cts, fid);
1033 fid = df->sib;
1034 if (ctype_isfield(df->info)) {
1035 CType *dc;
1036 if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
1037 dc = ctype_rawchild(cts, df); /* Field type. */
1038 if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info) ||
1039 ctype_isenum(dc->info)))
1040 goto special;
1041 } else if (!ctype_isconstval(df->info)) {
1042 goto special;
1043 }
1044 }
1045 }
1046 fid = d->sib;
1029 while (fid) { 1047 while (fid) {
1030 CType *df = ctype_get(cts, fid); 1048 CType *df = ctype_get(cts, fid);
1031 fid = df->sib; 1049 fid = df->sib;