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) static int lj_carith_meta(lua_State *L, CTState *cts, CDArith *ca, MMS mm) { cTValue *tv = NULL; - if (tviscdata(L->base)) - tv = lj_ctype_meta(cts, cdataV(L->base)->ctypeid, mm); - if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) - tv = lj_ctype_meta(cts, cdataV(L->base+1)->ctypeid, mm); + if (tviscdata(L->base)) { + CTypeID id = cdataV(L->base)->ctypeid; + CType *ct = ctype_raw(cts, id); + if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); + tv = lj_ctype_meta(cts, id, mm); + } + if (!tv && L->base+1 < L->top && tviscdata(L->base+1)) { + CTypeID id = cdataV(L->base+1)->ctypeid; + CType *ct = ctype_raw(cts, id); + if (ctype_isptr(ct->info)) id = ctype_cid(ct->info); + tv = lj_ctype_meta(cts, id, mm); + } if (!tv) { const char *repr[2]; 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) { 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)) {