aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lj_record.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index 207327b3..af12e256 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -821,6 +821,7 @@ int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)
821 } else if (tref_isudata(ix->tab)) { 821 } else if (tref_isudata(ix->tab)) {
822 int udtype = udataV(&ix->tabv)->udtype; 822 int udtype = udataV(&ix->tabv)->udtype;
823 mt = tabref(udataV(&ix->tabv)->metatable); 823 mt = tabref(udataV(&ix->tabv)->metatable);
824 mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_UDATA_META);
824 /* The metatables of special userdata objects are treated as immutable. */ 825 /* The metatables of special userdata objects are treated as immutable. */
825 if (udtype != UDTYPE_USERDATA) { 826 if (udtype != UDTYPE_USERDATA) {
826 cTValue *mo; 827 cTValue *mo;
@@ -834,6 +835,8 @@ int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)
834 } 835 }
835 immutable_mt: 836 immutable_mt:
836 mo = lj_tab_getstr(mt, mmname_str(J2G(J), mm)); 837 mo = lj_tab_getstr(mt, mmname_str(J2G(J), mm));
838 ix->mt = mix.tab;
839 ix->mtv = mt;
837 if (!mo || tvisnil(mo)) 840 if (!mo || tvisnil(mo))
838 return 0; /* No metamethod. */ 841 return 0; /* No metamethod. */
839 /* Treat metamethod or index table as immutable, too. */ 842 /* Treat metamethod or index table as immutable, too. */
@@ -841,11 +844,8 @@ int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm)
841 lj_trace_err(J, LJ_TRERR_BADTYPE); 844 lj_trace_err(J, LJ_TRERR_BADTYPE);
842 copyTV(J->L, &ix->mobjv, mo); 845 copyTV(J->L, &ix->mobjv, mo);
843 ix->mobj = lj_ir_kgc(J, gcV(mo), tvisfunc(mo) ? IRT_FUNC : IRT_TAB); 846 ix->mobj = lj_ir_kgc(J, gcV(mo), tvisfunc(mo) ? IRT_FUNC : IRT_TAB);
844 ix->mtv = mt;
845 ix->mt = TREF_NIL; /* Dummy value for comparison semantics. */
846 return 1; /* Got metamethod or index table. */ 847 return 1; /* Got metamethod or index table. */
847 } 848 }
848 mix.tab = emitir(IRT(IR_FLOAD, IRT_TAB), ix->tab, IRFL_UDATA_META);
849 } else { 849 } else {
850 /* Specialize to base metatable. Must flush mcode in lua_setmetatable(). */ 850 /* Specialize to base metatable. Must flush mcode in lua_setmetatable(). */
851 mt = tabref(basemt_obj(J2G(J), &ix->tabv)); 851 mt = tabref(basemt_obj(J2G(J), &ix->tabv));