aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-03-10 22:13:23 +0100
committerMike Pall <mike>2010-03-10 22:13:23 +0100
commit4f19a15bd9dfbd4e5c3ffc6a70b72449fb79a7ee (patch)
treeed383a48acff753cab69c428e5f26df3603c9840 /src
parentc56d791316c0bd4d6122a40eb416423f0deea796 (diff)
downloadluajit-4f19a15bd9dfbd4e5c3ffc6a70b72449fb79a7ee.tar.gz
luajit-4f19a15bd9dfbd4e5c3ffc6a70b72449fb79a7ee.tar.bz2
luajit-4f19a15bd9dfbd4e5c3ffc6a70b72449fb79a7ee.zip
Fix potential hang in UCLO redirection handling in hooks.
Diffstat (limited to 'src')
-rw-r--r--src/lj_dispatch.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c
index f956aa1b..30137ab2 100644
--- a/src/lj_dispatch.c
+++ b/src/lj_dispatch.c
@@ -333,15 +333,13 @@ static void callhook(lua_State *L, int event, BCLine line)
333static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres) 333static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres)
334{ 334{
335 BCIns ins = pc[-1]; 335 BCIns ins = pc[-1];
336 for (;;) { 336 if (bc_op(ins) == BC_UCLO)
337 switch (bc_op(ins)) { 337 ins = pc[bc_j(ins)];
338 case BC_UCLO: ins = pc[bc_j(ins)]; break; 338 switch (bc_op(ins)) {
339 case BC_CALLM: 339 case BC_CALLM: case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1;
340 case BC_CALLMT: return bc_a(ins) + bc_c(ins) + nres-1+1; 340 case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1;
341 case BC_RETM: return bc_a(ins) + bc_d(ins) + nres-1; 341 case BC_TSETM: return bc_a(ins) + nres-1;
342 case BC_TSETM: return bc_a(ins) + nres-1; 342 default: return pt->framesize;
343 default: return pt->framesize;
344 }
345 } 343 }
346} 344}
347 345