summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-05-24 17:44:55 +0200
committerMike Pall <mike>2013-05-24 17:44:55 +0200
commit992f7d4b71d0f39266c9b2d7f8ce28c278afb667 (patch)
treef12f1ec3a7df3dee5035b499a98292a2f78aa8f1 /src/lj_crecord.c
parent4c1f9dd0f7fdbf79ed62588c64417d6238fd5c51 (diff)
downloadluajit-992f7d4b71d0f39266c9b2d7f8ce28c278afb667.tar.gz
luajit-992f7d4b71d0f39266c9b2d7f8ce28c278afb667.tar.bz2
luajit-992f7d4b71d0f39266c9b2d7f8ce28c278afb667.zip
FFI: Refactor ffi.gc()/__gc. Compile ffi.gc(cdata, nil), too.
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index ef6e5f82..c3b01f63 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -863,21 +863,17 @@ again:
863} 863}
864 864
865/* Record setting a finalizer. */ 865/* Record setting a finalizer. */
866static void crec_finalizer(jit_State *J, TRef trcd, cTValue *fin) 866static void crec_finalizer(jit_State *J, TRef trcd, TRef trfin, cTValue *fin)
867{ 867{
868 TRef trlo = lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd); 868 if (tvisgcv(fin)) {
869 TRef trhi = emitir(IRT(IR_ADD, IRT_P32), trlo, lj_ir_kint(J, 4)); 869 if (!trfin) trfin = lj_ir_kptr(J, gcval(fin));
870 if (LJ_BE) { TRef tmp = trlo; trlo = trhi; trhi = tmp; } 870 } else if (tvisnil(fin)) {
871 if (tvisfunc(fin)) { 871 trfin = lj_ir_kptr(J, NULL);
872 emitir(IRT(IR_XSTORE, IRT_P32), trlo, lj_ir_kfunc(J, funcV(fin)));
873 emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TFUNC));
874 } else if (tviscdata(fin)) {
875 emitir(IRT(IR_XSTORE, IRT_P32), trlo,
876 lj_ir_kgc(J, obj2gco(cdataV(fin)), IRT_CDATA));
877 emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TCDATA));
878 } else { 872 } else {
879 lj_trace_err(J, LJ_TRERR_BADTYPE); 873 lj_trace_err(J, LJ_TRERR_BADTYPE);
880 } 874 }
875 lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd,
876 trfin, lj_ir_kint(J, (int32_t)itype(fin)));
881 J->needsnap = 1; 877 J->needsnap = 1;
882} 878}
883 879
@@ -1001,7 +997,7 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)
1001 /* Handle __gc metamethod. */ 997 /* Handle __gc metamethod. */
1002 fin = lj_ctype_meta(cts, id, MM_gc); 998 fin = lj_ctype_meta(cts, id, MM_gc);
1003 if (fin) 999 if (fin)
1004 crec_finalizer(J, trcd, fin); 1000 crec_finalizer(J, trcd, 0, fin);
1005} 1001}
1006 1002
1007/* Record argument conversions. */ 1003/* Record argument conversions. */
@@ -1648,7 +1644,9 @@ void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd)
1648void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd) 1644void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd)
1649{ 1645{
1650 argv2cdata(J, J->base[0], &rd->argv[0]); 1646 argv2cdata(J, J->base[0], &rd->argv[0]);
1651 crec_finalizer(J, J->base[0], &rd->argv[1]); 1647 if (!J->base[1])
1648 lj_trace_err(J, LJ_TRERR_BADTYPE);
1649 crec_finalizer(J, J->base[0], J->base[1], &rd->argv[1]);
1652} 1650}
1653 1651
1654/* -- 64 bit bit.* library functions -------------------------------------- */ 1652/* -- 64 bit bit.* library functions -------------------------------------- */