diff options
author | Mike Pall <mike> | 2010-03-10 22:13:23 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-03-10 22:13:23 +0100 |
commit | 4f19a15bd9dfbd4e5c3ffc6a70b72449fb79a7ee (patch) | |
tree | ed383a48acff753cab69c428e5f26df3603c9840 /src | |
parent | c56d791316c0bd4d6122a40eb416423f0deea796 (diff) | |
download | luajit-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.c | 16 |
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) | |||
333 | static BCReg cur_topslot(GCproto *pt, const BCIns *pc, uint32_t nres) | 333 | static 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 | ||