diff options
| -rw-r--r-- | src/lj_crecord.c | 20 |
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; |
