aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-10-10 18:56:16 +0200
committerMike Pall <mike>2012-10-10 18:56:16 +0200
commit0b55e05d06bc760070b8ca9f99c01c3d8e67e7db (patch)
tree6b04f3e2ef0c59e51bb627312c464faad3952b9e /src
parent1c626112a06f1f69d3c22771c62d4ced1cfee356 (diff)
downloadluajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.tar.gz
luajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.tar.bz2
luajit-0b55e05d06bc760070b8ca9f99c01c3d8e67e7db.zip
FFI: Compile ffi.gc().
Diffstat (limited to 'src')
-rw-r--r--src/lib_ffi.c2
-rw-r--r--src/lj_crecord.c43
-rw-r--r--src/lj_crecord.h1
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
763LJLIB_PUSH(top-7) LJLIB_SET(!) /* Store reference to finalizer table. */ 763LJLIB_PUSH(top-7) LJLIB_SET(!) /* Store reference to finalizer table. */
764 764
765LJLIB_CF(ffi_gc) 765LJLIB_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. */
866static 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. */
866static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id) 885static 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
1619void 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
1616void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd) 1627void 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);
24LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd); 24LJ_FUNC void LJ_FASTCALL recff_ffi_istype(jit_State *J, RecordFFData *rd);
25LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd); 25LJ_FUNC void LJ_FASTCALL recff_ffi_abi(jit_State *J, RecordFFData *rd);
26LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd); 26LJ_FUNC void LJ_FASTCALL recff_ffi_xof(jit_State *J, RecordFFData *rd);
27LJ_FUNC void LJ_FASTCALL recff_ffi_gc(jit_State *J, RecordFFData *rd);
27LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd); 28LJ_FUNC void LJ_FASTCALL lj_crecord_tonumber(jit_State *J, RecordFFData *rd);
28#endif 29#endif
29 30