summaryrefslogtreecommitdiff
path: root/src/lj_ccallback.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-06-20 16:32:45 +0200
committerMike Pall <mike>2013-06-20 16:32:45 +0200
commit053041a9f47e3d341f98682ea1e4907a578e4920 (patch)
tree8821a1a6c9e6706346865aec2c68dd20ef2a9370 /src/lj_ccallback.c
parent9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5 (diff)
downloadluajit2-053041a9f47e3d341f98682ea1e4907a578e4920.tar.gz
FFI: Add missing GC steps for callback argument conversions.
Diffstat (limited to 'src/lj_ccallback.c')
-rw-r--r--src/lj_ccallback.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index 00109923..c975c88f 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -408,6 +408,7 @@ static void callback_conv_args(CTState *cts, lua_State *L)
intptr_t *stack = cts->cb.stack;
MSize slot = cts->cb.slot;
CTypeID id = 0, rid, fid;
+ int gcsteps = 0;
CType *ct;
GCfunc *fn;
MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;
@@ -475,7 +476,7 @@ static void callback_conv_args(CTState *cts, lua_State *L)
done:
if (LJ_BE && cta->size < CTSIZE_PTR)
sp = (void *)((uint8_t *)sp + CTSIZE_PTR-cta->size);
- lj_cconv_tv_ct(cts, cta, 0, o++, sp);
+ gcsteps += lj_cconv_tv_ct(cts, cta, 0, o++, sp);
}
fid = ctf->sib;
}
@@ -485,6 +486,8 @@ static void callback_conv_args(CTState *cts, lua_State *L)
if (ctype_cconv(ct->info) != CTCC_CDECL)
(L->base-2)->u32.hi |= (nsp << (16+2));
#endif
+ while (gcsteps-- > 0)
+ lj_gc_check(L);
}
/* Convert Lua object to callback result. */