diff options
author | Mike Pall <mike> | 2013-05-24 17:44:55 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-05-24 17:44:55 +0200 |
commit | 992f7d4b71d0f39266c9b2d7f8ce28c278afb667 (patch) | |
tree | f12f1ec3a7df3dee5035b499a98292a2f78aa8f1 /src/lj_crecord.c | |
parent | 4c1f9dd0f7fdbf79ed62588c64417d6238fd5c51 (diff) | |
download | luajit-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.c | 24 |
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. */ |
866 | static void crec_finalizer(jit_State *J, TRef trcd, cTValue *fin) | 866 | static 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) | |||
1648 | void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd) | 1644 | void 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 -------------------------------------- */ |