diff options
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r-- | src/lj_crecord.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index 04c962d5..83c57063 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
@@ -710,20 +710,20 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) | |||
710 | /* Handle __gc metamethod. */ | 710 | /* Handle __gc metamethod. */ |
711 | fin = lj_ctype_meta(cts, id, MM_gc); | 711 | fin = lj_ctype_meta(cts, id, MM_gc); |
712 | if (fin) { | 712 | if (fin) { |
713 | RecordIndex ix; | 713 | TRef trlo = lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd); |
714 | ix.idxchain = 0; | 714 | TRef trhi = emitir(IRT(IR_ADD, IRT_P32), trlo, lj_ir_kint(J, 4)); |
715 | settabV(J->L, &ix.tabv, cts->finalizer); | 715 | if (LJ_BE) { TRef tmp = trlo; trlo = trhi; trhi = tmp; } |
716 | ix.tab = lj_ir_ktab(J, cts->finalizer); | 716 | if (tvisfunc(fin)) { |
717 | setboolV(&ix.keyv, 0); /* The key is new. Dummy value is ok here. */ | 717 | emitir(IRT(IR_XSTORE, IRT_P32), trlo, lj_ir_kfunc(J, funcV(fin))); |
718 | ix.key = trcd; | 718 | emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TFUNC)); |
719 | copyTV(J->L, &ix.valv, fin); | 719 | } else if (tviscdata(fin)) { |
720 | if (tvisfunc(fin)) | 720 | emitir(IRT(IR_XSTORE, IRT_P32), trlo, |
721 | ix.val = lj_ir_kfunc(J, funcV(fin)); | 721 | lj_ir_kgc(J, obj2gco(cdataV(fin)), IRT_CDATA)); |
722 | else if (tviscdata(fin)) | 722 | emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TCDATA)); |
723 | ix.val = lj_ir_kgc(J, obj2gco(cdataV(fin)), IRT_CDATA); | 723 | } else { |
724 | else | ||
725 | lj_trace_err(J, LJ_TRERR_BADTYPE); | 724 | lj_trace_err(J, LJ_TRERR_BADTYPE); |
726 | lj_record_idx(J, &ix); | 725 | } |
726 | J->needsnap = 1; | ||
727 | } | 727 | } |
728 | } | 728 | } |
729 | } | 729 | } |