summaryrefslogtreecommitdiff
path: root/src/lj_cdata.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-16 18:32:33 +0100
committerMike Pall <mike>2011-01-16 18:32:33 +0100
commit6f746577d087e39d72d9ce2bc61df27828c6422e (patch)
tree4575fd34dbd66f7cce2dd7ab6bf085432d1e0251 /src/lj_cdata.c
parent0fa32e5d3128bbbfc2419a2bd158d5a72f2cd15b (diff)
downloadluajit2-6f746577d087e39d72d9ce2bc61df27828c6422e.tar.gz
FFI: Allow indexing a struct constructor to get constants.
Specialize to the CTypeID held by a constructor in all cases.
Diffstat (limited to 'src/lj_cdata.c')
-rw-r--r--src/lj_cdata.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/lj_cdata.c b/src/lj_cdata.c
index 5bd55237..1d0aea85 100644
--- a/src/lj_cdata.c
+++ b/src/lj_cdata.c
@@ -127,6 +127,17 @@ collect_attrib:
return ct;
}
}
+ } else if (cd->typeid == CTID_CTYPEID) {
+ /* Allow indexing a (pointer to) struct constructor to get constants. */
+ CType *sct = ct = ctype_raw(cts, *(CTypeID *)p);
+ if (ctype_isptr(sct->info))
+ sct = ctype_rawchild(cts, sct);
+ if (ctype_isstruct(sct->info)) {
+ CTSize ofs;
+ CType *fct = lj_ctype_getfield(cts, sct, name, &ofs);
+ if (fct && ctype_isconstval(fct->info))
+ return fct;
+ }
}
{
GCstr *s = lj_ctype_repr(cts->L, ctype_typeid(cts, ct), NULL);