summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-09-08 21:03:40 +0200
committerMike Pall <mike>2012-09-08 21:03:40 +0200
commit21cea85d922ecfe6e5317d3303549022f98d6826 (patch)
tree2774ed45078e00c303d692a2241fbdc4d53542fb /src/lj_crecord.c
parent0648fd47cb5560cf1a44a211a75997863e8470dd (diff)
downloadluajit2-21cea85d922ecfe6e5317d3303549022f98d6826.tar.gz
FFI: Always resolve metamethods for pointers to structs.
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 82cb8503..5e91737c 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1081,12 +1081,18 @@ static void crec_arith_meta(jit_State *J, CTState *cts, RecordFFData *rd)
{
cTValue *tv = NULL;
if (J->base[0]) {
- if (tviscdata(&rd->argv[0]))
- tv = lj_ctype_meta(cts, argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid,
- (MMS)rd->data);
- if (!tv && J->base[1] && tviscdata(&rd->argv[1]))
- tv = lj_ctype_meta(cts, argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid,
- (MMS)rd->data);
+ if (tviscdata(&rd->argv[0])) {
+ CTypeID id = argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid;
+ CType *ct = ctype_raw(cts, id);
+ if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
+ tv = lj_ctype_meta(cts, id, (MMS)rd->data);
+ }
+ if (!tv && J->base[1] && tviscdata(&rd->argv[1])) {
+ CTypeID id = argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid;
+ CType *ct = ctype_raw(cts, id);
+ if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
+ tv = lj_ctype_meta(cts, id, (MMS)rd->data);
+ }
}
if (tv) {
if (tvisfunc(tv)) {