diff options
author | Mike Pall <mike> | 2012-09-03 21:10:10 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-09-03 21:11:08 +0200 |
commit | 0648fd47cb5560cf1a44a211a75997863e8470dd (patch) | |
tree | 794077cf10c0f9dcb05c406904342880025311e3 /src/lib_base.c | |
parent | 90ec1f90d0c31ab9398e971665c1e33d3158f9c0 (diff) | |
download | luajit-0648fd47cb5560cf1a44a211a75997863e8470dd.tar.gz luajit-0648fd47cb5560cf1a44a211a75997863e8470dd.tar.bz2 luajit-0648fd47cb5560cf1a44a211a75997863e8470dd.zip |
FFI: Handle __pairs/__ipairs metamethods for cdata objects.
Diffstat (limited to 'src/lib_base.c')
-rw-r--r-- | src/lib_base.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/lib_base.c b/src/lib_base.c index 9702c5b4..824fc0e7 100644 --- a/src/lib_base.c +++ b/src/lib_base.c | |||
@@ -278,12 +278,16 @@ LJLIB_ASM(next) | |||
278 | return FFH_UNREACHABLE; | 278 | return FFH_UNREACHABLE; |
279 | } | 279 | } |
280 | 280 | ||
281 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | 281 | #if defined(LUAJIT_ENABLE_LUA52COMPAT) || LJ_HASFFI |
282 | static int ffh_pairs(lua_State *L, MMS mm) | 282 | static int ffh_pairs(lua_State *L, MMS mm) |
283 | { | 283 | { |
284 | TValue *o = lj_lib_checkany(L, 1); | 284 | TValue *o = lj_lib_checkany(L, 1); |
285 | cTValue *mo = lj_meta_lookup(L, o, mm); | 285 | cTValue *mo = lj_meta_lookup(L, o, mm); |
286 | if (!tvisnil(mo)) { | 286 | if ( |
287 | #if !defined(LUAJIT_ENABLE_LUA52COMPAT) | ||
288 | tviscdata(o) && | ||
289 | #endif | ||
290 | !tvisnil(mo)) { | ||
287 | L->top = o+1; /* Only keep one argument. */ | 291 | L->top = o+1; /* Only keep one argument. */ |
288 | copyTV(L, L->base-1, mo); /* Replace callable. */ | 292 | copyTV(L, L->base-1, mo); /* Replace callable. */ |
289 | return FFH_TAILCALL; | 293 | return FFH_TAILCALL; |