diff options
author | Mike Pall <mike> | 2021-03-23 02:35:07 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2021-03-23 02:35:07 +0100 |
commit | ad65934fa08a65bfb0eb9528731a4394842cc173 (patch) | |
tree | f58aaa42a9a8923b655a993e63f6c8cd53b4aa60 /src | |
parent | ebc4919affbc0f9e8adfb5dede378017c7dd1fdd (diff) | |
download | luajit-ad65934fa08a65bfb0eb9528731a4394842cc173.tar.gz luajit-ad65934fa08a65bfb0eb9528731a4394842cc173.tar.bz2 luajit-ad65934fa08a65bfb0eb9528731a4394842cc173.zip |
FFI: Handle zero-fill of struct-of-NYI.
Diffstat (limited to 'src')
-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; |