aboutsummaryrefslogtreecommitdiff
path: root/src/lib_ffi.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/lib_ffi.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/lib_ffi.c')
-rw-r--r--src/lib_ffi.c10
1 files changed, 1 insertions, 9 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 562255aa..3310b205 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -768,19 +768,11 @@ LJLIB_CF(ffi_gc) LJLIB_REC(.)
768 GCcdata *cd = ffi_checkcdata(L, 1); 768 GCcdata *cd = ffi_checkcdata(L, 1);
769 TValue *fin = lj_lib_checkany(L, 2); 769 TValue *fin = lj_lib_checkany(L, 2);
770 CTState *cts = ctype_cts(L); 770 CTState *cts = ctype_cts(L);
771 GCtab *t = cts->finalizer;
772 CType *ct = ctype_raw(cts, cd->ctypeid); 771 CType *ct = ctype_raw(cts, cd->ctypeid);
773 if (!(ctype_isptr(ct->info) || ctype_isstruct(ct->info) || 772 if (!(ctype_isptr(ct->info) || ctype_isstruct(ct->info) ||
774 ctype_isrefarray(ct->info))) 773 ctype_isrefarray(ct->info)))
775 lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE); 774 lj_err_arg(L, 1, LJ_ERR_FFI_INVTYPE);
776 if (gcref(t->metatable)) { /* Update finalizer table, if still enabled. */ 775 lj_cdata_setfin(L, cd, gcval(fin), itype(fin));
777 copyTV(L, lj_tab_set(L, t, L->base), fin);
778 lj_gc_anybarriert(L, t);
779 if (!tvisnil(fin))
780 cd->marked |= LJ_GC_CDATA_FIN;
781 else
782 cd->marked &= ~LJ_GC_CDATA_FIN;
783 }
784 L->top = L->base+1; /* Pass through the cdata object. */ 776 L->top = L->base+1; /* Pass through the cdata object. */
785 return 1; 777 return 1;
786} 778}