aboutsummaryrefslogtreecommitdiff
path: root/src
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
parent0648fd47cb5560cf1a44a211a75997863e8470dd (diff)
downloadluajit-21cea85d922ecfe6e5317d3303549022f98d6826.tar.gz
luajit-21cea85d922ecfe6e5317d3303549022f98d6826.tar.bz2
luajit-21cea85d922ecfe6e5317d3303549022f98d6826.zip
FFI: Always resolve metamethods for pointers to structs.
Diffstat (limited to 'src')
-rw-r--r--src/lj_carith.c16
-rw-r--r--src/lj_crecord.c18
2 files changed, 24 insertions, 10 deletions
diff --git a/src/lj_carith.c b/src/lj_carith.c
index 8c76abe9..9ffafc2c 100644
--- a/src/lj_carith.c
+++ b/src/lj_carith.c
@@ -218,10 +218,18 @@ static int carith_int64(lua_State *L, CTState *cts, CDArith *ca, MMS mm)
218static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm) 218static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm)
219{ 219{
220 cTValue *tv = NULL; 220 cTValue *tv = NULL;
221 if (tviscdata(L->base)) 221 if (tviscdata(L->base)) {
222 tv = lj_ctype_meta(cts, cdataV(L->base)->ctypeid, mm); 222 CTypeID id = cdataV(L->base)->ctypeid;
223 if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) 223 CType *ct = ctype_raw(cts, id);
224 tv = lj_ctype_meta(cts, cdataV(L->base+1)->ctypeid, mm); 224 if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
225 tv = lj_ctype_meta(cts, id, mm);
226 }
227 if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) {
228 CTypeID id = cdataV(L->base+1)->ctypeid;
229 CType *ct = ctype_raw(cts, id);
230 if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
231 tv = lj_ctype_meta(cts, id, mm);
232 }
225 if (!tv) { 233 if (!tv) {
226 const char *repr[2]; 234 const char *repr[2];
227 int i, isenum = -1, isstr = -1; 235 int i, isenum = -1, isstr = -1;
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)
1081{ 1081{
1082 cTValue *tv = NULL; 1082 cTValue *tv = NULL;
1083 if (J->base[0]) { 1083 if (J->base[0]) {
1084 if (tviscdata(&rd->argv[0])) 1084 if (tviscdata(&rd->argv[0])) {
1085 tv = lj_ctype_meta(cts, argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid, 1085 CTypeID id = argv2cdata(J, J->base[0], &rd->argv[0])->ctypeid;
1086 (MMS)rd->data); 1086 CType *ct = ctype_raw(cts, id);
1087 if (!tv && J->base[1] && tviscdata(&rd->argv[1])) 1087 if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
1088 tv = lj_ctype_meta(cts, argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid, 1088 tv = lj_ctype_meta(cts, id, (MMS)rd->data);
1089 (MMS)rd->data); 1089 }
1090 if (!tv && J->base[1] && tviscdata(&rd->argv[1])) {
1091 CTypeID id = argv2cdata(J, J->base[1], &rd->argv[1])->ctypeid;
1092 CType *ct = ctype_raw(cts, id);
1093 if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
1094 tv = lj_ctype_meta(cts, id, (MMS)rd->data);
1095 }
1090 } 1096 }
1091 if (tv) { 1097 if (tv) {
1092 if (tvisfunc(tv)) { 1098 if (tvisfunc(tv)) {