<HTML><BODY><div><div>Hi, Sergey!</div><div>Thanks for the review!</div><div>Fixed your comment, branch is force-pushed.</div></div><div> </div><div> </div><div data-signature-widget="container"><div data-signature-widget="content"><div>--<br>Best regards,</div><div>Maxim Kokryashkin</div></div></div><div> </div><div> </div><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">Вторник, 3 октября 2023, 21:54 +03:00 от Sergey Bronnikov <sergeyb@tarantool.org>:<br> <div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_16963592630290790361_BODY">Hi, Max<br><br>please see my comment below<br><br><br>On 9/29/23 09:20, Maxim Kokryashkin wrote:<br>> This reverts commit 97699d9ee2467389b6aea21a098e38aff3469b5f.<br>><br>> As was mentioned in tarantool/tarantool#6189, throwing an error<br>> not on the currently executed coroutine is a violation of the<br>> Lua/C API.<br><br>Could you add a source of this statement?<br><br>There is a section "3.6 – Error Handling in C" in Lua 5.1 Reference Manual,<br><br>but there is no such statement there [1]. Could you clarify?<br><br>1. <a href="https://www.lua.org/manual/5.1/manual.html" target="_blank">https://www.lua.org/manual/5.1/manual.html</a><br><br>> This patch is a part of the patchset that supports<br>> this violation and is reverted because of it.<br>><br>> Part of tarantool/tarantool#6323<br>> ---<br>> src/vm_x64.dasc | 9 ++++-----<br>> src/vm_x86.dasc | 8 ++++----<br>> 2 files changed, 8 insertions(+), 9 deletions(-)<br>><br>> diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc<br>> index 09bf67e5..116716ac 100644<br>> --- a/src/vm_x64.dasc<br>> +++ b/src/vm_x64.dasc<br>> @@ -533,11 +533,11 @@ static void build_subroutines(BuildCtx *ctx)<br>> | mov eax, CARG2d // Error return status for vm_pcall.<br>> | mov rsp, CARG1<br>> |->vm_unwind_c_eh: // Landing pad for external unwinder.<br>> - | mov L:DISPATCH, SAVE_L<br>> - | mov GL:RB, L:DISPATCH->glref<br>> - | mov GL:RB->cur_L, L:DISPATCH<br>> + | mov L:RB, SAVE_L<br>> + | mov GL:RB, L:RB->glref<br>> + | mov [GL:RB->cur_L], L:RB<br>> | mov dword GL:RB->vmstate, ~LJ_VMST_CFUNC<br>> - | mov DISPATCH, L:DISPATCH->glref // Setup pointer to dispatch table.<br>> + | mov DISPATCH, GL:RB // Setup pointer to dispatch table.<br>> | add DISPATCH, GG_G2DISP<br>> | jmp ->vm_leave_unw<br>> |<br>> @@ -561,7 +561,6 @@ static void build_subroutines(BuildCtx *ctx)<br>> | add DISPATCH, GG_G2DISP<br>> | mov PC, [BASE-8] // Fetch PC of previous frame.<br>> | mov_false RA<br>> - | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB<br>> | mov RB, [BASE]<br>> | mov [BASE-16], RA // Prepend false to error message.<br>> | mov [BASE-8], RB<br>> diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc<br>> index f16ade1a..e3fbf751 100644<br>> --- a/src/vm_x86.dasc<br>> +++ b/src/vm_x86.dasc<br>> @@ -681,11 +681,11 @@ static void build_subroutines(BuildCtx *ctx)<br>> |.endif<br>> |.endif<br>> |->vm_unwind_c_eh: // Landing pad for external unwinder.<br>> - | mov L:DISPATCH, SAVE_L<br>> - | mov GL:RB, L:DISPATCH->glref<br>> - | mov dword GL:RB->cur_L, L:DISPATCH<br>> + | mov L:RB, SAVE_L<br>> + | mov GL:RB, L:RB->glref<br>> + | mov dword GL:RB->cur_L, L:RB<br>> | mov dword GL:RB->vmstate, ~LJ_VMST_CFUNC<br>> - | mov DISPATCH, L:DISPATCH->glref // Setup pointer to dispatch table.<br>> + | mov DISPATCH, GL:RB // Setup pointer to dispatch table.<br>> | add DISPATCH, GG_G2DISP<br>> | jmp ->vm_leave_unw<br>> |</div></div></div></div></blockquote><div> </div></BODY></HTML>