summaryrefslogtreecommitdiff
path: root/src/lib_ffi.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-09-03 21:10:10 +0200
committerMike Pall <mike>2012-09-03 21:11:08 +0200
commit0648fd47cb5560cf1a44a211a75997863e8470dd (patch)
tree794077cf10c0f9dcb05c406904342880025311e3 /src/lib_ffi.c
parent90ec1f90d0c31ab9398e971665c1e33d3158f9c0 (diff)
downloadluajit-0648fd47cb5560cf1a44a211a75997863e8470dd.tar.gz
luajit-0648fd47cb5560cf1a44a211a75997863e8470dd.tar.bz2
luajit-0648fd47cb5560cf1a44a211a75997863e8470dd.zip
FFI: Handle __pairs/__ipairs metamethods for cdata objects.
Diffstat (limited to 'src/lib_ffi.c')
-rw-r--r--src/lib_ffi.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 24a6625c..69bebefc 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -323,6 +323,30 @@ checkgc:
323 return 1; 323 return 1;
324} 324}
325 325
326static int ffi_pairs(lua_State *L, MMS mm)
327{
328 CTState *cts = ctype_cts(L);
329 CTypeID id = ffi_checkcdata(L, 1)->ctypeid;
330 CType *ct = ctype_raw(cts, id);
331 cTValue *tv;
332 if (ctype_isptr(ct->info)) id = ctype_cid(ct->info);
333 tv = lj_ctype_meta(cts, id, mm);
334 if (!tv)
335 lj_err_callerv(L, LJ_ERR_FFI_BADMM, strdata(lj_ctype_repr(L, id, NULL)),
336 strdata(mmname_str(G(L), mm)));
337 return lj_meta_tailcall(L, tv);
338}
339
340LJLIB_CF(ffi_meta___pairs)
341{
342 return ffi_pairs(L, MM_pairs);
343}
344
345LJLIB_CF(ffi_meta___ipairs)
346{
347 return ffi_pairs(L, MM_ipairs);
348}
349
326LJLIB_PUSH("ffi") LJLIB_SET(__metatable) 350LJLIB_PUSH("ffi") LJLIB_SET(__metatable)
327 351
328#include "lj_libdef.h" 352#include "lj_libdef.h"