diff options
author | Mike Pall <mike> | 2012-10-10 18:56:16 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-10-10 18:56:16 +0200 |
commit | 0b55e05d06bc760070b8ca9f99c01c3d8e67e7db (patch) | |
tree | 6b04f3e2ef0c59e51bb627312c464faad3952b9e /src | |
parent | 1c626112a06f1f69d3c22771c62d4ced1cfee356 (diff) | |
download | luajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.tar.gz luajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.tar.bz2 luajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.zip |
FFI: Compile ffi.gc().
Diffstat (limited to 'src')
-rw-r--r-- | src/lib_ffi.c | 2 | ||||
-rw-r--r-- | src/lj_crecord.c | 43 | ||||
-rw-r--r-- | src/lj_crecord.h | 1 |
3 files changed, 29 insertions, 17 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 689f7a9d..37e66245 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c | |||
@@ -762,7 +762,7 @@ LJLIB_CF(ffi_metatype) | |||
762 | 762 | ||
763 | LJLIB_PUSH(top-7) LJLIB_SET(!) /* Store reference to finalizer table. */ | 763 | LJLIB_PUSH(top-7) LJLIB_SET(!) /* Store reference to finalizer table. */ |
764 | 764 | ||
765 | LJLIB_CF(ffi_gc) | 765 | LJLIB_CF(ffi_gc) LJLIB_REC(.) |
766 | { | 766 | { |
767 | GCcdata *cd = ffi_checkcdata(L, 1); | 767 | GCcdata *cd = ffi_checkcdata(L, 1); |
768 | TValue *fin = lj_lib_checkany(L, 2); | 768 | TValue *fin = lj_lib_checkany(L, 2); |
diff --git a/src/lj_crecord.c b/src/lj_crecord.c index f9220322..9d361a7a 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c | |||
@@ -862,6 +862,25 @@ again: | |||
862 | } | 862 | } |
863 | } | 863 | } |
864 | 864 | ||
865 | /* Record setting a finalizer. */ | ||
866 | static void crec_finalizer(jit_State *J, TRef trcd, cTValue *fin) | ||
867 | { | ||
868 | TRef trlo = lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd); | ||
869 | TRef trhi = emitir(IRT(IR_ADD, IRT_P32), trlo, lj_ir_kint(J, 4)); | ||
870 | if (LJ_BE) { TRef tmp = trlo; trlo = trhi; trhi = tmp; } | ||
871 | if (tvisfunc(fin)) { | ||
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 { | ||
879 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
880 | } | ||
881 | J->needsnap = 1; | ||
882 | } | ||
883 | |||
865 | /* Record cdata allocation. */ | 884 | /* Record cdata allocation. */ |
866 | static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) | 885 | static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) |
867 | { | 886 | { |
@@ -955,22 +974,8 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) | |||
955 | } | 974 | } |
956 | /* Handle __gc metamethod. */ | 975 | /* Handle __gc metamethod. */ |
957 | fin = lj_ctype_meta(cts, id, MM_gc); | 976 | fin = lj_ctype_meta(cts, id, MM_gc); |
958 | if (fin) { | 977 | if (fin) |
959 | TRef trlo = lj_ir_call(J, IRCALL_lj_cdata_setfin, trcd); | 978 | crec_finalizer(J, trcd, fin); |
960 | TRef trhi = emitir(IRT(IR_ADD, IRT_P32), trlo, lj_ir_kint(J, 4)); | ||
961 | if (LJ_BE) { TRef tmp = trlo; trlo = trhi; trhi = tmp; } | ||
962 | if (tvisfunc(fin)) { | ||
963 | emitir(IRT(IR_XSTORE, IRT_P32), trlo, lj_ir_kfunc(J, funcV(fin))); | ||
964 | emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TFUNC)); | ||
965 | } else if (tviscdata(fin)) { | ||
966 | emitir(IRT(IR_XSTORE, IRT_P32), trlo, | ||
967 | lj_ir_kgc(J, obj2gco(cdataV(fin)), IRT_CDATA)); | ||
968 | emitir(IRTI(IR_XSTORE), trhi, lj_ir_kint(J, LJ_TCDATA)); | ||
969 | } else { | ||
970 | lj_trace_err(J, LJ_TRERR_BADTYPE); | ||
971 | } | ||
972 | J->needsnap = 1; | ||
973 | } | ||
974 | } | 979 | } |
975 | } | 980 | } |
976 | 981 | ||
@@ -1611,6 +1616,12 @@ void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd) | |||
1611 | J->base[0] = J->base[1] = J->base[2] = TREF_NIL; | 1616 | J->base[0] = J->base[1] = J->base[2] = TREF_NIL; |
1612 | } | 1617 | } |
1613 | 1618 | ||
1619 | void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd) | ||
1620 | { | ||
1621 | argv2cdata(J, J->base[0], &rd->argv[0]); | ||
1622 | crec_finalizer(J, J->base[0], &rd->argv[1]); | ||
1623 | } | ||
1624 | |||
1614 | /* -- Miscellaneous library functions ------------------------------------- */ | 1625 | /* -- Miscellaneous library functions ------------------------------------- */ |
1615 | 1626 | ||
1616 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) | 1627 | void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) |
diff --git a/src/lj_crecord.h b/src/lj_crecord.h index bd217651..c222d41e 100644 --- a/src/lj_crecord.h +++ b/src/lj_crecord.h | |||
@@ -24,6 +24,7 @@ LJ_FUNC void LJ_FASTCALL recff_ffi_typeof(jit_State *J, RecordFFData *rd); | |||
24 | LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); | 24 | LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); |
25 | LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); | 25 | LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); |
26 | LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd); | 26 | LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd); |
27 | LJ_FUNC void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd); | ||
27 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); | 28 | LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); |
28 | #endif | 29 | #endif |
29 | 30 | ||