diff options
author | Mike Pall <mike> | 2012-09-08 21:03:40 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-09-08 21:03:40 +0200 |
commit | 21cea85d922ecfe6e5317d3303549022f98d6826 (patch) | |
tree | 2774ed45078e00c303d692a2241fbdc4d53542fb /src | |
parent | 0648fd47cb5560cf1a44a211a75997863e8470dd (diff) | |
download | luajit-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.c | 16 | ||||
-rw-r--r-- | src/lj_crecord.c | 18 |
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) | |||
218 | static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm) | 218 | static 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)) { |