<HTML><BODY><div><div>Hi!</div><div>Thanks for the patch!</div><div>LGTM</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;">Четверг, 14 июля 2022, 18:43 +03:00 от Sergey Kaplun <skaplun@tarantool.org>:<br> <div id=""><div class="js-helper js-readmsg-msg"><div><div id="style_16578134100924981904_BODY">Hi, Maxim!<br><br>Thanks for the review!<br><br>On 04.07.22, Maxim Kokryashkin wrote:<br>><br>> Hi, Sergey!<br>> Thanks for the patch!<br>>  <br>> Please consider my comments below.<br><br>Fixed, see iterative patches below.<br>Branch is force-pushed.<br><br>Side note: I've fixed you suggestions from the last one to the top one,<br>so don't be confused by diff in them.<br><br>>  <br>> ><br>> >diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py<br>> >index 779a25f8..339b57ed 100644<br>> >--- a/src/luajit-gdb.py<br>> >+++ b/src/luajit-gdb.py<br>> <snipped><br>> >+___ = 0<br>> >+BC_NAME = 0<br>> >+BC_A = 1<br>> >+BC_B = 2<br>> >+BC_CD = 3<br>> >+BC_MM = 4<br>> >+<br>> >+BYTECODES = [<br>> >+ # Comparison ops. ORDER OPR.<br>> >+ ['ISLT', 'var', ___, 'var', 'lt'],<br><br><snipped><br><br>> >+ ['FUNCCW', 'rbase', ___, ___, ___],<br>> >+]<br>> I suggest rewriting that chunk with named tuple[1]. That is more readable<br>> and more pythonic way of doing stuff like this.<br><br>I've rewrited it with tuple (instead namedtuple) to avoid usage of<br>"collections", also it helps to read each bytecode declaration.<br><br>See the iterative patch below.<br><br>===================================================================<br>diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py<br>index be86f599..98feebec 100644<br>--- a/src/luajit-gdb.py<br>+++ b/src/luajit-gdb.py<br>@@ -129,136 +129,131 @@ def bc_d(ins):<br>     return int(ins) >> 16<br> <br> ___ = 0<br>-BC_NAME = 0<br>-BC_A = 1<br>-BC_B = 2<br>-BC_CD = 3<br>-BC_MM = 4<br> <br> BYTECODES = [<br>     # Comparison ops. ORDER OPR.<br>- ['ISLT', 'var', ___, 'var', 'lt'],<br>- ['ISGE', 'var', ___, 'var', 'lt'],<br>- ['ISLE', 'var', ___, 'var', 'le'],<br>- ['ISGT', 'var', ___, 'var', 'le'],<br>-<br>- ['ISEQV', 'var', ___, 'var', 'eq'],<br>- ['ISNEV', 'var', ___, 'var', 'eq'],<br>- ['ISEQS', 'var', ___, 'str', 'eq'],<br>- ['ISNES', 'var', ___, 'str', 'eq'],<br>- ['ISEQN', 'var', ___, 'num', 'eq'],<br>- ['ISNEN', 'var', ___, 'num', 'eq'],<br>- ['ISEQP', 'var', ___, 'pri', 'eq'],<br>- ['ISNEP', 'var', ___, 'pri', 'eq'],<br>+ {'name': 'ISLT', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'lt'},<br>+ {'name': 'ISGE', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'lt'},<br>+ {'name': 'ISLE', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'le'},<br>+ {'name': 'ISGT', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'le'},<br>+<br>+ {'name': 'ISEQV', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'eq'},<br>+ {'name': 'ISNEV', 'ra': 'var', 'rb': ___, 'rcd': 'var', 'mm': 'eq'},<br>+ {'name': 'ISEQS', 'ra': 'var', 'rb': ___, 'rcd': 'str', 'mm': 'eq'},<br>+ {'name': 'ISNES', 'ra': 'var', 'rb': ___, 'rcd': 'str', 'mm': 'eq'},<br>+ {'name': 'ISEQN', 'ra': 'var', 'rb': ___, 'rcd': 'num', 'mm': 'eq'},<br>+ {'name': 'ISNEN', 'ra': 'var', 'rb': ___, 'rcd': 'num', 'mm': 'eq'},<br>+ {'name': 'ISEQP', 'ra': 'var', 'rb': ___, 'rcd': 'pri', 'mm': 'eq'},<br>+ {'name': 'ISNEP', 'ra': 'var', 'rb': ___, 'rcd': 'pri', 'mm': 'eq'},<br> <br>     # Unary test and copy ops.<br>- ['ISTC', 'dst', ___, 'var', ___],<br>- ['ISFC', 'dst', ___, 'var', ___],<br>- ['IST', ___, ___, 'var', ___],<br>- ['ISF', ___, ___, 'var', ___],<br>- ['ISTYPE', 'var', ___, 'lit', ___],<br>- ['ISNUM', 'var', ___, 'lit', ___],<br>- ['MOV', 'dst', ___, 'var', ___],<br>- ['NOT', 'dst', ___, 'var', ___],<br>- ['UNM', 'dst', ___, 'var', 'unm'],<br>- ['LEN', 'dst', ___, 'var', 'len'],<br>- ['ADDVN', 'dst', 'var', 'num', 'add'],<br>- ['SUBVN', 'dst', 'var', 'num', 'sub'],<br>- ['MULVN', 'dst', 'var', 'num', 'mul'],<br>- ['DIVVN', 'dst', 'var', 'num', 'div'],<br>- ['MODVN', 'dst', 'var', 'num', 'mod'],<br>+ {'name': 'ISTC', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'ISFC', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'IST', 'ra': ___, 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'ISF', 'ra': ___, 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'ISTYPE', 'ra': 'var', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'ISNUM', 'ra': 'var', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'MOV', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'NOT', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'UNM', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': 'unm'},<br>+ {'name': 'LEN', 'ra': 'dst', 'rb': ___, 'rcd': 'var', 'mm': 'len'},<br>+ {'name': 'ADDVN', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'add'},<br>+ {'name': 'SUBVN', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'sub'},<br>+ {'name': 'MULVN', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'mul'},<br>+ {'name': 'DIVVN', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'div'},<br>+ {'name': 'MODVN', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'mod'},<br> <br>     # Binary ops. ORDER OPR.<br>- ['ADDNV', 'dst', 'var', 'num', 'add'],<br>- ['SUBNV', 'dst', 'var', 'num', 'sub'],<br>- ['MULNV', 'dst', 'var', 'num', 'mul'],<br>- ['DIVNV', 'dst', 'var', 'num', 'div'],<br>- ['MODNV', 'dst', 'var', 'num', 'mod'],<br>+ {'name': 'ADDNV', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'add'},<br>+ {'name': 'SUBNV', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'sub'},<br>+ {'name': 'MULNV', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'mul'},<br>+ {'name': 'DIVNV', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'div'},<br>+ {'name': 'MODNV', 'ra': 'dst', 'rb': 'var', 'rcd': 'num', 'mm': 'mod'},<br> <br>- ['ADDVV', 'dst', 'var', 'var', 'add'],<br>- ['SUBVV', 'dst', 'var', 'var', 'sub'],<br>- ['MULVV', 'dst', 'var', 'var', 'mul'],<br>- ['DIVVV', 'dst', 'var', 'var', 'div'],<br>- ['MODVV', 'dst', 'var', 'var', 'mod'],<br>+ {'name': 'ADDVV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'add'},<br>+ {'name': 'SUBVV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'sub'},<br>+ {'name': 'MULVV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'mul'},<br>+ {'name': 'DIVVV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'div'},<br>+ {'name': 'MODVV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'mod'},<br> <br>- ['POW', 'dst', 'var', 'var', 'pow'],<br>- ['CAT', 'dst', 'rbase', 'rbase', 'concat'],<br>+ {'name': 'POW', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'pow'},<br>+ {'name': 'CAT', 'ra': 'dst', 'rb': 'rbase', 'rcd': 'rbase', 'mm': 'concat'},<br> <br>     # Constant ops.<br>- ['KSTR', 'dst', ___, 'str', ___],<br>- ['KCDATA', 'dst', ___, 'cdata', ___],<br>- ['KSHORT', 'dst', ___, 'lits', ___],<br>- ['KNUM', 'dst', ___, 'num', ___],<br>- ['KPRI', 'dst', ___, 'pri', ___],<br>- ['KNIL', 'base', ___, 'base', ___],<br>+ {'name': 'KSTR', 'ra': 'dst', 'rb': ___, 'rcd': 'str', 'mm': ___},<br>+ {'name': 'KCDATA', 'ra': 'dst', 'rb': ___, 'rcd': 'cdata', 'mm': ___},<br>+ {'name': 'KSHORT', 'ra': 'dst', 'rb': ___, 'rcd': 'lits', 'mm': ___},<br>+ {'name': 'KNUM', 'ra': 'dst', 'rb': ___, 'rcd': 'num', 'mm': ___},<br>+ {'name': 'KPRI', 'ra': 'dst', 'rb': ___, 'rcd': 'pri', 'mm': ___},<br>+ {'name': 'KNIL', 'ra': 'base', 'rb': ___, 'rcd': 'base', 'mm': ___},<br> <br>     # Upvalue and function ops.<br>- ['UGET', 'dst', ___, 'uv', ___],<br>- ['USETV', 'uv', ___, 'var', ___],<br>- ['USETS', 'uv', ___, 'str', ___],<br>- ['USETN', 'uv', ___, 'num', ___],<br>- ['USETP', 'uv', ___, 'pri', ___],<br>- ['UCLO', 'rbase', ___, 'jump', ___],<br>- ['FNEW', 'dst', ___, 'func', ___],<br>+ {'name': 'UGET', 'ra': 'dst', 'rb': ___, 'rcd': 'uv', 'mm': ___},<br>+ {'name': 'USETV', 'ra': 'uv', 'rb': ___, 'rcd': 'var', 'mm': ___},<br>+ {'name': 'USETS', 'ra': 'uv', 'rb': ___, 'rcd': 'str', 'mm': ___},<br>+ {'name': 'USETN', 'ra': 'uv', 'rb': ___, 'rcd': 'num', 'mm': ___},<br>+ {'name': 'USETP', 'ra': 'uv', 'rb': ___, 'rcd': 'pri', 'mm': ___},<br>+ {'name': 'UCLO', 'ra': 'rbase', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'FNEW', 'ra': 'dst', 'rb': ___, 'rcd': 'func', 'mm': ___},<br> <br>     # Table ops.<br>- ['TNEW', 'dst', ___, 'lit', ___],<br>- ['TDUP', 'dst', ___, 'tab', ___],<br>- ['GGET', 'dst', ___, 'str', 'index'],<br>- ['GSET', 'var', ___, 'str', 'newindex'],<br>- ['TGETV', 'dst', 'var', 'var', 'index'],<br>- ['TGETS', 'dst', 'var', 'str', 'index'],<br>- ['TGETB', 'dst', 'var', 'lit', 'index'],<br>- ['TGETR', 'dst', 'var', 'var', 'index'],<br>- ['TSETV', 'var', 'var', 'var', 'newindex'],<br>- ['TSETS', 'var', 'var', 'str', 'newindex'],<br>- ['TSETB', 'var', 'var', 'lit', 'newindex'],<br>- ['TSETM', 'base', ___, 'num', 'newindex'],<br>- ['TSETR', 'var', 'var', 'var', 'newindex'],<br>+ {'name': 'TNEW', 'ra': 'dst', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'TDUP', 'ra': 'dst', 'rb': ___, 'rcd': 'tab', 'mm': ___},<br>+ {'name': 'GGET', 'ra': 'dst', 'rb': ___, 'rcd': 'str', 'mm': 'index'},<br>+ {'name': 'GSET', 'ra': 'var', 'rb': ___, 'rcd': 'str', 'mm': 'newindex'},<br>+ {'name': 'TGETV', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'index'},<br>+ {'name': 'TGETS', 'ra': 'dst', 'rb': 'var', 'rcd': 'str', 'mm': 'index'},<br>+ {'name': 'TGETB', 'ra': 'dst', 'rb': 'var', 'rcd': 'lit', 'mm': 'index'},<br>+ {'name': 'TGETR', 'ra': 'dst', 'rb': 'var', 'rcd': 'var', 'mm': 'index'},<br>+ {'name': 'TSETV', 'ra': 'var', 'rb': 'var', 'rcd': 'var', 'mm': 'newindex'},<br>+ {'name': 'TSETS', 'ra': 'var', 'rb': 'var', 'rcd': 'str', 'mm': 'newindex'},<br>+ {'name': 'TSETB', 'ra': 'var', 'rb': 'var', 'rcd': 'lit', 'mm': 'newindex'},<br>+ {'name': 'TSETM', 'ra': 'base', 'rb': ___, 'rcd': 'num', 'mm': 'newindex'},<br>+ {'name': 'TSETR', 'ra': 'var', 'rb': 'var', 'rcd': 'var', 'mm': 'newindex'},<br> <br>     # Calls and vararg handling. T = tail call.<br>- ['CALLM', 'base', 'lit', 'lit', 'call'],<br>- ['CALL', 'base', 'lit', 'lit', 'call'],<br>- ['CALLMT', 'base', ___, 'lit', 'call'],<br>- ['CALLT', 'base', ___, 'lit', 'call'],<br>- ['ITERC', 'base', 'lit', 'lit', 'call'],<br>- ['ITERN', 'base', 'lit', 'lit', 'call'],<br>- ['VARG', 'base', 'lit', 'lit', ___],<br>- ['ISNEXT', 'base', ___, 'jump', ___],<br>+ {'name': 'CALLM', 'ra': 'base', 'rb': 'lit', 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'CALL', 'ra': 'base', 'rb': 'lit', 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'CALLMT', 'ra': 'base', 'rb': ___, 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'CALLT', 'ra': 'base', 'rb': ___, 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'ITERC', 'ra': 'base', 'rb': 'lit', 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'ITERN', 'ra': 'base', 'rb': 'lit', 'rcd': 'lit', 'mm': 'call'},<br>+ {'name': 'VARG', 'ra': 'base', 'rb': 'lit', 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'ISNEXT', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br> <br>     # Returns.<br>- ['RETM', 'base', ___, 'lit', ___],<br>- ['RET', 'rbase', ___, 'lit', ___],<br>- ['RET0', 'rbase', ___, 'lit', ___],<br>- ['RET1', 'rbase', ___, 'lit', ___],<br>+ {'name': 'RETM', 'ra': 'base', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'RET', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'RET0', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'RET1', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br> <br>     # Loops and branches. I/J = interp/JIT, I/C/L = init/call/loop.<br>- ['FORI', 'base', ___, 'jump', ___],<br>- ['JFORI', 'base', ___, 'jump', ___],<br>+ {'name': 'FORI', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'JFORI', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br> <br>- ['FORL', 'base', ___, 'jump', ___],<br>- ['IFORL', 'base', ___, 'jump', ___],<br>- ['JFORL', 'base', ___, 'lit', ___],<br>+ {'name': 'FORL', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'IFORL', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'JFORL', 'ra': 'base', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br> <br>- ['ITERL', 'base', ___, 'jump', ___],<br>- ['IITERL', 'base', ___, 'jump', ___],<br>- ['JITERL', 'base', ___, 'lit', ___],<br>+ {'name': 'ITERL', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'IITERL', 'ra': 'base', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'JITERL', 'ra': 'base', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br> <br>- ['LOOP', 'rbase', ___, 'jump', ___],<br>- ['ILOOP', 'rbase', ___, 'jump', ___],<br>- ['JLOOP', 'rbase', ___, 'lit', ___],<br>+ {'name': 'LOOP', 'ra': 'rbase', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'ILOOP', 'ra': 'rbase', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br>+ {'name': 'JLOOP', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br> <br>- ['JMP', 'rbase', ___, 'jump', ___],<br>+ {'name': 'JMP', 'ra': 'rbase', 'rb': ___, 'rcd': 'jump', 'mm': ___},<br> <br>     # Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func.<br>- ['FUNCF', 'rbase', ___, ___, ___],<br>- ['IFUNCF', 'rbase', ___, ___, ___],<br>- ['JFUNCF', 'rbase', ___, 'lit', ___],<br>- ['FUNCV', 'rbase', ___, ___, ___],<br>- ['IFUNCV', 'rbase', ___, ___, ___],<br>- ['JFUNCV', 'rbase', ___, 'lit', ___],<br>- ['FUNCC', 'rbase', ___, ___, ___],<br>- ['FUNCCW', 'rbase', ___, ___, ___],<br>+ {'name': 'FUNCF', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br>+ {'name': 'IFUNCF', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br>+ {'name': 'JFUNCF', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'FUNCV', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br>+ {'name': 'IFUNCV', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br>+ {'name': 'JFUNCV', 'ra': 'rbase', 'rb': ___, 'rcd': 'lit', 'mm': ___},<br>+ {'name': 'FUNCC', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br>+ {'name': 'FUNCCW', 'ra': 'rbase', 'rb': ___, 'rcd': ___, 'mm': ___},<br> ]<br> <br> def proto_bc(proto):<br>@@ -725,8 +720,7 @@ def funcuvname(pt, idx):<br> <br>     return str(cast('char *', uvinfo))<br> <br>-def dump_reg(bc, reg, value, jmp_format=None, jmp_ctx=None):<br>- rtype = bc[reg]<br>+def dump_reg(rtype, value, jmp_format=None, jmp_ctx=None):<br>     is_jmp = rtype == 'jump'<br> <br>     if rtype == 'jump':<br>@@ -745,8 +739,7 @@ def dump_reg(bc, reg, value, jmp_format=None, jmp_ctx=None):<br>         value = value,<br>     )<br> <br>-def dump_kc(bc, reg, value, proto):<br>- rtype = bc[reg]<br>+def dump_kc(rtype, value, proto):<br>     kc = ''<br>     if proto:<br>         if rtype == 'str' or rtype == 'func':<br>@@ -766,23 +759,21 @@ def dump_bc(ins, jmp_format=None, jmp_ctx=None, proto=None):<br>         return 'INVALID'<br> <br>     bc = BYTECODES[op]<br>- bc_name = bc[BC_NAME]<br> <br>- bc_hasa = bc[BC_A]<br>- bc_hasb = bc[BC_B]<br>-<br>- kca = dump_kc(bc, BC_A, bc_a(ins), proto) if bc_hasa else ''<br>- kcc = dump_kc(bc, BC_CD, bc_c(ins) if bc_hasb else bc_d(ins), proto) if bc[BC_CD] else ''<br>+ kca = dump_kc(bc['ra'], bc_a(ins), proto) if bc['ra'] else ''<br>+ kcc = dump_kc(<br>+ bc['rcd'], bc_c(ins) if bc['rb'] else bc_d(ins), proto<br>+ ) if bc['rcd'] else ''<br> <br>     return '{name:6} {ra}{rb}{rcd}{kc}'.format(<br>- name = bc_name,<br>- ra = dump_reg(bc, BC_A, bc_a(ins)) + ' ' if bc_hasa else '',<br>- rb = dump_reg(bc, BC_B, bc_b(ins)) + ' ' if bc_hasb else '',<br>+ name = bc['name'],<br>+ ra = dump_reg(bc['ra'], bc_a(ins)) + ' ' if bc['ra'] else '',<br>+ rb = dump_reg(bc['rb'], bc_b(ins)) + ' ' if bc['rb'] else '',<br>         rcd = dump_reg(<br>- bc, BC_CD, bc_c(ins) if bc_hasb else bc_d(ins),<br>+ bc['rcd'], bc_c(ins) if bc['rb'] else bc_d(ins),<br>             jmp_format=jmp_format, jmp_ctx=jmp_ctx<br>- ) if bc[BC_CD] else '',<br>- kc=kca+kcc<br>+ ) if bc['rcd'] else '',<br>+ kc = kca + kcc<br>     )<br> <br> def dump_proto(proto):<br>===================================================================<br><br>>  <br>> <snipped><br>> >+def dump_reg(bc, reg, value, jmp_format=None, jmp_ctx=None):<br>> >+ rtype = bc[reg]<br>> >+ is_jmp = rtype == 'jump'<br>> >+ padding = ':' + ' ' * (5 - len(rtype))<br>> >+<br>> >+ if rtype == 'jump':<br>> >+ # Destination of jump instruction encoded as offset from BCBIAS_J.<br>> >+ delta = value - 0x7fff<br>> >+ if jmp_format:<br>> >+ value = jmp_format(jmp_ctx, delta)<br>> >+ else:<br>> >+ prefix = '+' if delta >= 0 else ''<br>> >+ value = prefix + str(delta)<br>> >+ else:<br>> >+ value = '{:3d}'.format(value)<br>> >+<br>> >+ return '{rtype}{padding} {value}'.format(<br>> >+ rtype = rtype,<br>> >+ padding = padding,<br>> >+ value = value,<br>> >+ )<br>> The padding variable is unnecessary. You can use format-string<br>> width specifier[2] instead.<br><br>Fixed! Thanks! See the iterative patch below.<br><br>===================================================================<br>diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py<br>index 0827ad45..be86f599 100644<br>--- a/src/luajit-gdb.py<br>+++ b/src/luajit-gdb.py<br>@@ -728,7 +728,6 @@ def funcuvname(pt, idx):<br> def dump_reg(bc, reg, value, jmp_format=None, jmp_ctx=None):<br>     rtype = bc[reg]<br>     is_jmp = rtype == 'jump'<br>- padding = ':' + ' ' * (5 - len(rtype))<br> <br>     if rtype == 'jump':<br>         # Destination of jump instruction encoded as offset from BCBIAS_J.<br>@@ -741,9 +740,8 @@ def dump_reg(bc, reg, value, jmp_format=None, jmp_ctx=None):<br>     else:<br>         value = '{:3d}'.format(value)<br> <br>- return '{rtype}{padding} {value}'.format(<br>- rtype = rtype,<br>- padding = padding,<br>+ return '{rtype:6} {value}'.format(<br>+ rtype = rtype + ':',<br>         value = value,<br>     )<br> <br>@@ -769,7 +767,6 @@ def dump_bc(ins, jmp_format=None, jmp_ctx=None, proto=None):<br> <br>     bc = BYTECODES[op]<br>     bc_name = bc[BC_NAME]<br>- name_padding = ' ' * (6 - len(bc_name))<br> <br>     bc_hasa = bc[BC_A]<br>     bc_hasb = bc[BC_B]<br>@@ -777,9 +774,8 @@ def dump_bc(ins, jmp_format=None, jmp_ctx=None, proto=None):<br>     kca = dump_kc(bc, BC_A, bc_a(ins), proto) if bc_hasa else ''<br>     kcc = dump_kc(bc, BC_CD, bc_c(ins) if bc_hasb else bc_d(ins), proto) if bc[BC_CD] else ''<br> <br>- return '{name}{npad} {ra}{rb}{rcd}{kc}'.format(<br>+ return '{name:6} {ra}{rb}{rcd}{kc}'.format(<br>         name = bc_name,<br>- npad = name_padding,<br>         ra = dump_reg(bc, BC_A, bc_a(ins)) + ' ' if bc_hasa else '',<br>         rb = dump_reg(bc, BC_B, bc_b(ins)) + ' ' if bc_hasb else '',<br>         rcd = dump_reg(<br>~<br>===================================================================<br><br>>  <br>> <snipped><br>> ><br>> >+class LJDumpFunc(LJBase):<br>> >+ '''<br>> >+lj-funcl <GCfunc *><br>> Typo: s/lj-funcl/lj-func<br><br>Fixed! Thanks! See the iterative patch below.<br><br>===================================================================<br>diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py<br>index f976b758..0827ad45 100644<br>--- a/src/luajit-gdb.py<br>+++ b/src/luajit-gdb.py<br>@@ -1051,7 +1051,7 @@ The constants or upvalues of the prototype are decoded after ';'.<br> <br> class LJDumpFunc(LJBase):<br>     '''<br>-lj-funcl <GCfunc *><br>+lj-func <GCfunc *><br> <br> The command receives a <gcr> of the corresponding GCfunc object and dumps<br> the chunk name, where the corresponding function is defined, corresponding<br>===================================================================<br><br>>  <br>> <snipped><br>>  <br>> Side note:<br>> In the present moment, passing an invalid pointer to `lj-func`/`lj-proto` results in empty<br>> output, which is not a gdb-way (and not a UNIX-way either) of reporting errors.<br>> Maybe it is a good idea to check the type of the  value under the pointer and<br>> report corresponding errors. <br><br>Yes, maybe. But I suggest now just use the same interface as for other<br>lj-* dumpers. We can refactor them later.<br><br>>  <br>> [1]:  <a href="https://docs.python.org/3/library/collections.html#collections.namedtuple" target="_blank">https://docs.python.org/3/library/collections.html#collections.namedtuple</a><br>> [2]:  <a href="https://docs.python.org/3/library/string.html#format-examples" target="_blank">https://docs.python.org/3/library/string.html#format-examples</a><br>>  <br>> --<br>> Best regards,<br>> Maxim Kokryashkin<br><br>--<br>Best regards,<br>Sergey Kaplun</div></div></div></div></blockquote><div> </div></BODY></HTML>