* [Tarantool-patches] [PATCH luajit] dbg: display fast function name along with ffid @ 2026-09-09 13:07 Mikhail Elhimov via Tarantool-patches 2026-09-22 9:16 ` Sergey Kaplun via Tarantool-patches 0 siblings, 1 reply; 6+ messages in thread From: Mikhail Elhimov via Tarantool-patches @ 2026-09-09 13:07 UTC (permalink / raw) To: Sergey Kaplun, Sergey Bronnikov, Evgeniy Temirgaleev; +Cc: tarantool-patches Part of tarantool/tarantool#4808 --- This patch is to be applied after the 'avoid hardcoded enums' patch. Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name Related issue: https://github.com/tarantool/tarantool/issues/4808 src/luajit_dbg.py | 17 +++++++++++------ .../debug-extension-tests.py | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py index 1ac1d275..262fdad1 100644 --- a/src/luajit_dbg.py +++ b/src/luajit_dbg.py @@ -1682,8 +1682,11 @@ def ir_kint64(ir): # Dumpers. +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', cut_prefix, 'FF_') + # GCobj dumpers. + def dump_lj_gco_str(gcobj): return 'string {body} @ {address}'.format( body=strdata(gcobj), @@ -1705,7 +1708,7 @@ def dump_lj_gco_proto(gcobj): def dump_lj_gco_func(gcobj): func = dbg.cast('struct GCfuncC *', gcobj) - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -1718,7 +1721,8 @@ def dump_lj_gco_func(gcobj): elif ffid == 1: return 'C function @ {}'.format(strx64(func['f'])) else: - return 'fast function #{}'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function #{}({})'.format(ffid, ffname) def dump_lj_gco_trace(gcobj): @@ -2068,7 +2072,7 @@ def dump_proto(proto): def dump_func(func): - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -2076,7 +2080,8 @@ def dump_func(func): elif ffid == 1: return 'C function @ {}\n'.format(strx64(func['f'])) else: - return 'fast function #{}\n'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function #{}({})\n'.format(ffid, ffname) # FFI dumpers. @@ -2702,7 +2707,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function #<ffid>(<ffname>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) @@ -2921,7 +2926,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function #<ffid>(<ffname>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py index 9989032b..40a27c3a 100644 --- a/test/tarantool-debugger-tests/debug-extension-tests.py +++ b/test/tarantool-debugger-tests/debug-extension-tests.py @@ -338,7 +338,7 @@ GCO_RX = ( r'thread @ ' + RX_ADDR + r'\n' r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' r'C function @ ' + RX_ADDR + r'\n' - r'fast function #[0-9]+\n' + r'fast function #[0-9]+\(\w+\)\n' r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' r'userdata @ ' + RX_ADDR + r'\n' -- 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH luajit] dbg: display fast function name along with ffid 2026-09-09 13:07 [Tarantool-patches] [PATCH luajit] dbg: display fast function name along with ffid Mikhail Elhimov via Tarantool-patches @ 2026-09-22 9:16 ` Sergey Kaplun via Tarantool-patches 2026-09-23 22:55 ` Mikhail Elhimov via Tarantool-patches 2026-09-24 16:48 ` [Tarantool-patches] [PATCH luajit v2] " Mikhail Elhimov via Tarantool-patches 0 siblings, 2 replies; 6+ messages in thread From: Sergey Kaplun via Tarantool-patches @ 2026-09-22 9:16 UTC (permalink / raw) To: Mikhail Elhimov; +Cc: tarantool-patches Hi, Mikhail! Thanks for the patch! Generally, LGTM, with minor suggestions below. On 09.09.26, Mikhail Elhimov wrote: > Part of tarantool/tarantool#4808 > --- > This patch is to be applied after the 'avoid hardcoded enums' patch. > > Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name > Related issue: https://github.com/tarantool/tarantool/issues/4808 > > src/luajit_dbg.py | 17 +++++++++++------ > .../debug-extension-tests.py | 2 +- > 2 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py > index 1ac1d275..262fdad1 100644 > --- a/src/luajit_dbg.py > +++ b/src/luajit_dbg.py > @@ -1682,8 +1682,11 @@ def ir_kint64(ir): > > # Dumpers. > > +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', cut_prefix, 'FF_') It would be nice to replace `_` in functions names to `.`. Resulting: math_min -> math.min Minor: I would rather placed it somewhere into the section: | # LuaJIT macro implementations and structure access. > + > # GCobj dumpers. > > + > def dump_lj_gco_str(gcobj): > return 'string {body} @ {address}'.format( > body=strdata(gcobj), > @@ -1705,7 +1708,7 @@ def dump_lj_gco_proto(gcobj): > > def dump_lj_gco_func(gcobj): > func = dbg.cast('struct GCfuncC *', gcobj) > - ffid = func['ffid'] > + ffid = int(func['ffid']) > > if ffid == 0: > pt = funcproto(func) > @@ -1718,7 +1721,8 @@ def dump_lj_gco_func(gcobj): > elif ffid == 1: > return 'C function @ {}'.format(strx64(func['f'])) > else: > - return 'fast function #{}'.format(int(ffid)) > + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" > + return 'fast function #{}({})'.format(ffid, ffname) I suggest the following format insted: | 'fast function {} (#{})'.format(ffname, ffid) Generally we needed ffid less then the function name. > > > def dump_lj_gco_trace(gcobj): > @@ -2068,7 +2072,7 @@ def dump_proto(proto): > > > def dump_func(func): > - ffid = func['ffid'] > + ffid = int(func['ffid']) > > if ffid == 0: > pt = funcproto(func) > @@ -2076,7 +2080,8 @@ def dump_func(func): > elif ffid == 1: > return 'C function @ {}\n'.format(strx64(func['f'])) > else: > - return 'fast function #{}\n'.format(int(ffid)) > + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" > + return 'fast function #{}({})\n'.format(ffid, ffname) I suggest the following format insted: | 'fast function {} (#{})\n'.format(ffname, ffid) Generally we needed ffid less then the function name. > > > # FFI dumpers. > @@ -2702,7 +2707,7 @@ the type and some info related to it. > * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> > <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> > <CFUNC>: C function <mcode address> > - <FFUNC>: fast function #<ffid> > + <FFUNC>: fast function #<ffid>(<ffname>) I suggest the following format instead: | <FFUNC>: fast function <ffname> (#<ffid>) > * LJ_TTRACE: trace <traceno> @ <gcr> > * LJ_TCDATA: cdata @ <gcr> > * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) > @@ -2921,7 +2926,7 @@ the type and some info related to it. > * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> > <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> > <CFUNC>: C function <mcode address> > - <FFUNC>: fast function #<ffid> I suggest the following format instead: | <FFUNC>: fast function <ffname> (#<ffid>) > + <FFUNC>: fast function #<ffid>(<ffname>) > * LJ_TTRACE: trace <traceno> @ <gcr> > * LJ_TCDATA: cdata @ <gcr> > * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) > diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py > index 9989032b..40a27c3a 100644 > --- a/test/tarantool-debugger-tests/debug-extension-tests.py > +++ b/test/tarantool-debugger-tests/debug-extension-tests.py > @@ -338,7 +338,7 @@ GCO_RX = ( > r'thread @ ' + RX_ADDR + r'\n' > r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' > r'C function @ ' + RX_ADDR + r'\n' > - r'fast function #[0-9]+\n' > + r'fast function #[0-9]+\(\w+\)\n' Lets check the specific name here. I suggest `math.min` to check the _ -> . mapping. > r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' > r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' > r'userdata @ ' + RX_ADDR + r'\n' > -- > 2.43.0 > -- Best regards, Sergey Kaplun ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH luajit] dbg: display fast function name along with ffid 2026-09-22 9:16 ` Sergey Kaplun via Tarantool-patches @ 2026-09-23 22:55 ` Mikhail Elhimov via Tarantool-patches 2026-09-24 16:48 ` [Tarantool-patches] [PATCH luajit v2] " Mikhail Elhimov via Tarantool-patches 1 sibling, 0 replies; 6+ messages in thread From: Mikhail Elhimov via Tarantool-patches @ 2026-09-23 22:55 UTC (permalink / raw) To: Sergey Kaplun; +Cc: tarantool-patches Hi, Sergey! Thanks for the review! See my comments below On 22.09.2026 12:16, Sergey Kaplun wrote: > Hi, Mikhail! > Thanks for the patch! > Generally, LGTM, with minor suggestions below. > > On 09.09.26, Mikhail Elhimov wrote: >> Part of tarantool/tarantool#4808 >> --- >> This patch is to be applied after the 'avoid hardcoded enums' patch. >> >> Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name >> Related issue: https://github.com/tarantool/tarantool/issues/4808 >> >> src/luajit_dbg.py | 17 +++++++++++------ >> .../debug-extension-tests.py | 2 +- >> 2 files changed, 12 insertions(+), 7 deletions(-) >> >> diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py >> index 1ac1d275..262fdad1 100644 >> --- a/src/luajit_dbg.py >> +++ b/src/luajit_dbg.py >> @@ -1682,8 +1682,11 @@ def ir_kint64(ir): >> >> # Dumpers. >> >> +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', cut_prefix, 'FF_') > It would be nice to replace `_` in functions names to `.`. > Resulting: math_min -> math.min Then what about these and similar ones (they have 3 underscores in a row): ffi_meta___index io_method___gc ? May be replace only first underscore? > Minor: I would rather placed it somewhere into the section: > | # LuaJIT macro implementations and structure access. Done >> + >> # GCobj dumpers. >> >> + >> def dump_lj_gco_str(gcobj): >> return 'string {body} @ {address}'.format( >> body=strdata(gcobj), >> @@ -1705,7 +1708,7 @@ def dump_lj_gco_proto(gcobj): >> >> def dump_lj_gco_func(gcobj): >> func = dbg.cast('struct GCfuncC *', gcobj) >> - ffid = func['ffid'] >> + ffid = int(func['ffid']) >> >> if ffid == 0: >> pt = funcproto(func) >> @@ -1718,7 +1721,8 @@ def dump_lj_gco_func(gcobj): >> elif ffid == 1: >> return 'C function @ {}'.format(strx64(func['f'])) >> else: >> - return 'fast function #{}'.format(int(ffid)) >> + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" >> + return 'fast function #{}({})'.format(ffid, ffname) > I suggest the following format insted: > | 'fast function {} (#{})'.format(ffname, ffid) > > Generally we needed ffid less then the function name. Done >> >> >> def dump_lj_gco_trace(gcobj): >> @@ -2068,7 +2072,7 @@ def dump_proto(proto): >> >> >> def dump_func(func): >> - ffid = func['ffid'] >> + ffid = int(func['ffid']) >> >> if ffid == 0: >> pt = funcproto(func) >> @@ -2076,7 +2080,8 @@ def dump_func(func): >> elif ffid == 1: >> return 'C function @ {}\n'.format(strx64(func['f'])) >> else: >> - return 'fast function #{}\n'.format(int(ffid)) >> + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" >> + return 'fast function #{}({})\n'.format(ffid, ffname) > I suggest the following format insted: > | 'fast function {} (#{})\n'.format(ffname, ffid) > > Generally we needed ffid less then the function name. Done >> >> >> # FFI dumpers. >> @@ -2702,7 +2707,7 @@ the type and some info related to it. >> * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> >> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> >> <CFUNC>: C function <mcode address> >> - <FFUNC>: fast function #<ffid> >> + <FFUNC>: fast function #<ffid>(<ffname>) > I suggest the following format instead: > > | <FFUNC>: fast function <ffname> (#<ffid>) Done >> * LJ_TTRACE: trace <traceno> @ <gcr> >> * LJ_TCDATA: cdata @ <gcr> >> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) >> @@ -2921,7 +2926,7 @@ the type and some info related to it. >> * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> >> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> >> <CFUNC>: C function <mcode address> >> - <FFUNC>: fast function #<ffid> > I suggest the following format instead: > > | <FFUNC>: fast function <ffname> (#<ffid>) Done >> + <FFUNC>: fast function #<ffid>(<ffname>) >> * LJ_TTRACE: trace <traceno> @ <gcr> >> * LJ_TCDATA: cdata @ <gcr> >> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) >> diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py >> index 9989032b..40a27c3a 100644 >> --- a/test/tarantool-debugger-tests/debug-extension-tests.py >> +++ b/test/tarantool-debugger-tests/debug-extension-tests.py >> @@ -338,7 +338,7 @@ GCO_RX = ( >> r'thread @ ' + RX_ADDR + r'\n' >> r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' >> r'C function @ ' + RX_ADDR + r'\n' >> - r'fast function #[0-9]+\n' >> + r'fast function #[0-9]+\(\w+\)\n' > Lets check the specific name here. I suggest `math.min` to check the > _ -> . mapping. No problem, but first we need to agree on how to handle underscores (see above comment about multiple undescores) > >> ing r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' >> r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' >> r'userdata @ ' + RX_ADDR + r'\n' >> -- >> 2.43.0 >> -- Best regards, Mikhail Elhimov ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Tarantool-patches] [PATCH luajit v2] dbg: display fast function name along with ffid 2026-09-22 9:16 ` Sergey Kaplun via Tarantool-patches 2026-09-23 22:55 ` Mikhail Elhimov via Tarantool-patches @ 2026-09-24 16:48 ` Mikhail Elhimov via Tarantool-patches 2026-09-24 20:14 ` [Tarantool-patches] [PATCH luajit v3] " Mikhail Elhimov via Tarantool-patches 1 sibling, 1 reply; 6+ messages in thread From: Mikhail Elhimov via Tarantool-patches @ 2026-09-24 16:48 UTC (permalink / raw) To: Sergey Kaplun, Sergey Bronnikov, Evgeniy Temirgaleev; +Cc: tarantool-patches Part of tarantool/tarantool#4808 --- Changes in v2: - Format is changed to 'ffname (#ffid)' - Replaced single '_' with '.' in ffname - Adjusted tests to check mapping This patch is to be applied after https://lists.tarantool.org/pipermail/tarantool-patches/2026-September/030791.html. Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name Related issue: https://github.com/tarantool/tarantool/issues/4808 src/luajit_dbg.py | 19 +++++++++++++------ .../debug-extension-tests.py | 6 ++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py index 5cd23a88..a564801b 100644 --- a/src/luajit_dbg.py +++ b/src/luajit_dbg.py @@ -1121,6 +1121,11 @@ def frames(L): # LuaJIT macro implementations and structure access. +# Get FastFunc enum members and replace any single '_' with '.'. +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', lambda x: + re.sub('(?<!_)_(?!_)', '.', cut_prefix(x, 'FF_'))) + + def mref(typename, obj): return dbg.cast(typename, obj['ptr64'] if LJ_GC64 else obj['ptr32']) @@ -1716,7 +1721,7 @@ def dump_lj_gco_proto(gcobj): def dump_lj_gco_func(gcobj): func = dbg.cast('struct GCfuncC *', gcobj) - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -1729,7 +1734,8 @@ def dump_lj_gco_func(gcobj): elif ffid == 1: return 'C function @ {}'.format(strx64(func['f'])) else: - return 'fast function #{}'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function {} (#{})'.format(ffname, ffid) def dump_lj_gco_trace(gcobj): @@ -2079,7 +2085,7 @@ def dump_proto(proto): def dump_func(func): - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -2087,7 +2093,8 @@ def dump_func(func): elif ffid == 1: return 'C function @ {}\n'.format(strx64(func['f'])) else: - return 'fast function #{}\n'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function {} (#{})\n'.format(ffname, ffid) # FFI dumpers. @@ -2713,7 +2720,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function <ffname> (#<ffid>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) @@ -2932,7 +2939,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function <ffname> (#<ffid>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py index 5e369f00..86954909 100644 --- a/test/tarantool-debugger-tests/debug-extension-tests.py +++ b/test/tarantool-debugger-tests/debug-extension-tests.py @@ -326,7 +326,7 @@ GCO_ARGS = ( 'coroutine.create(function() end),\n' 'function() end,\n' 'require,\n' - 'print,\n' + 'math.min,\n' 'ffi.new("int*"),\n' '{1},\n' 'newproxy(),\n' @@ -338,7 +338,7 @@ GCO_RX = ( r'thread @ ' + RX_ADDR + r'\n' r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' r'C function @ ' + RX_ADDR + r'\n' - r'fast function #[0-9]+\n' + r'fast function math.min (#[0-9]+)\n' r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' r'userdata @ ' + RX_ADDR + r'\n' @@ -367,6 +367,7 @@ class TestLJTV(TestCaseBase): # Sorted in LJT order. lua_script = ( 'local ffi = require("ffi")\n' + 'local math = require("math")\n' 'print(\n' ' nil,\n' ' false,\n' @@ -435,6 +436,7 @@ class TestLJGCo(TestCaseBase): lua_script = ( 'local ffi = require("ffi")\n' + 'local math = require("math")\n' 'print(\n' + GCO_ARGS + ' 1\n' # Stub for the pattern. -- 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Tarantool-patches] [PATCH luajit v3] dbg: display fast function name along with ffid 2026-09-24 16:48 ` [Tarantool-patches] [PATCH luajit v2] " Mikhail Elhimov via Tarantool-patches @ 2026-09-24 20:14 ` Mikhail Elhimov via Tarantool-patches 2026-09-28 13:02 ` Sergey Bronnikov via Tarantool-patches 0 siblings, 1 reply; 6+ messages in thread From: Mikhail Elhimov via Tarantool-patches @ 2026-09-24 20:14 UTC (permalink / raw) To: Sergey Kaplun, Sergey Bronnikov, Evgeniy Temirgaleev; +Cc: tarantool-patches Part of tarantool/tarantool#4808 --- Changes in v3: - Fixed fast function regexp in tests Changes in v2: - Format is changed to 'ffname (#ffid)' - Replaced single '_' with '.' in ffname - Adjusted tests to check mapping This patch is to be applied after https://lists.tarantool.org/pipermail/tarantool-patches/2026-September/030791.html. Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name Related issue: https://github.com/tarantool/tarantool/issues/4808 src/luajit_dbg.py | 19 +++++++++++++------ .../debug-extension-tests.py | 6 ++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py index 5cd23a88..a564801b 100644 --- a/src/luajit_dbg.py +++ b/src/luajit_dbg.py @@ -1121,6 +1121,11 @@ def frames(L): # LuaJIT macro implementations and structure access. +# Get FastFunc enum members and replace any single '_' with '.'. +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', lambda x: + re.sub('(?<!_)_(?!_)', '.', cut_prefix(x, 'FF_'))) + + def mref(typename, obj): return dbg.cast(typename, obj['ptr64'] if LJ_GC64 else obj['ptr32']) @@ -1716,7 +1721,7 @@ def dump_lj_gco_proto(gcobj): def dump_lj_gco_func(gcobj): func = dbg.cast('struct GCfuncC *', gcobj) - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -1729,7 +1734,8 @@ def dump_lj_gco_func(gcobj): elif ffid == 1: return 'C function @ {}'.format(strx64(func['f'])) else: - return 'fast function #{}'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function {} (#{})'.format(ffname, ffid) def dump_lj_gco_trace(gcobj): @@ -2079,7 +2085,7 @@ def dump_proto(proto): def dump_func(func): - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -2087,7 +2093,8 @@ def dump_func(func): elif ffid == 1: return 'C function @ {}\n'.format(strx64(func['f'])) else: - return 'fast function #{}\n'.format(int(ffid)) + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" + return 'fast function {} (#{})\n'.format(ffname, ffid) # FFI dumpers. @@ -2713,7 +2720,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function <ffname> (#<ffid>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) @@ -2932,7 +2939,7 @@ the type and some info related to it. * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> <CFUNC>: C function <mcode address> - <FFUNC>: fast function #<ffid> + <FFUNC>: fast function <ffname> (#<ffid>) * LJ_TTRACE: trace <traceno> @ <gcr> * LJ_TCDATA: cdata @ <gcr> * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py index 5e369f00..fe5e34f5 100644 --- a/test/tarantool-debugger-tests/debug-extension-tests.py +++ b/test/tarantool-debugger-tests/debug-extension-tests.py @@ -326,7 +326,7 @@ GCO_ARGS = ( 'coroutine.create(function() end),\n' 'function() end,\n' 'require,\n' - 'print,\n' + 'math.min,\n' 'ffi.new("int*"),\n' '{1},\n' 'newproxy(),\n' @@ -338,7 +338,7 @@ GCO_RX = ( r'thread @ ' + RX_ADDR + r'\n' r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' r'C function @ ' + RX_ADDR + r'\n' - r'fast function #[0-9]+\n' + r'fast function math.min \(#[0-9]+\)\n' r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' r'userdata @ ' + RX_ADDR + r'\n' @@ -367,6 +367,7 @@ class TestLJTV(TestCaseBase): # Sorted in LJT order. lua_script = ( 'local ffi = require("ffi")\n' + 'local math = require("math")\n' 'print(\n' ' nil,\n' ' false,\n' @@ -435,6 +436,7 @@ class TestLJGCo(TestCaseBase): lua_script = ( 'local ffi = require("ffi")\n' + 'local math = require("math")\n' 'print(\n' + GCO_ARGS + ' 1\n' # Stub for the pattern. -- 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Tarantool-patches] [PATCH luajit v3] dbg: display fast function name along with ffid 2026-09-24 20:14 ` [Tarantool-patches] [PATCH luajit v3] " Mikhail Elhimov via Tarantool-patches @ 2026-09-28 13:02 ` Sergey Bronnikov via Tarantool-patches 0 siblings, 0 replies; 6+ messages in thread From: Sergey Bronnikov via Tarantool-patches @ 2026-09-28 13:02 UTC (permalink / raw) To: Mikhail Elhimov, Sergey Kaplun, Evgeniy Temirgaleev; +Cc: tarantool-patches Hi, Mikhail, thanks for the patch! LGTM with minor comments below. Sergey On 9/24/26 23:14, Mikhail Elhimov wrote: > Part of tarantool/tarantool#4808 > --- > Changes in v3: > - Fixed fast function regexp in tests > > Changes in v2: > - Format is changed to 'ffname (#ffid)' > - Replaced single '_' with '.' in ffname > - Adjusted tests to check mapping > > This patch is to be applied after https://lists.tarantool.org/pipermail/tarantool-patches/2026-September/030791.html. > > Branch: https://github.com/tarantool/luajit/tree/elhimov/gh-4808-display-fast-function-name > Related issue: https://github.com/tarantool/tarantool/issues/4808 > > src/luajit_dbg.py | 19 +++++++++++++------ > .../debug-extension-tests.py | 6 ++++-- > 2 files changed, 17 insertions(+), 8 deletions(-) > > diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py > index 5cd23a88..a564801b 100644 > --- a/src/luajit_dbg.py > +++ b/src/luajit_dbg.py > @@ -1121,6 +1121,11 @@ def frames(L): > # LuaJIT macro implementations and structure access. > > > +# Get FastFunc enum members and replace any single '_' with '.'. > +FF_NAMES = EnumBasedList('FastFunc', 'FF__MAX', lambda x: > + re.sub('(?<!_)_(?!_)', '.', cut_prefix(x, 'FF_'))) > + > + > def mref(typename, obj): > return dbg.cast(typename, obj['ptr64'] if LJ_GC64 else obj['ptr32']) > > @@ -1716,7 +1721,7 @@ def dump_lj_gco_proto(gcobj): > > def dump_lj_gco_func(gcobj): > func = dbg.cast('struct GCfuncC *', gcobj) > - ffid = func['ffid'] > + ffid = int(func['ffid']) > > if ffid == 0: > pt = funcproto(func) > @@ -1729,7 +1734,8 @@ def dump_lj_gco_func(gcobj): > elif ffid == 1: > return 'C function @ {}'.format(strx64(func['f'])) > else: > - return 'fast function #{}'.format(int(ffid)) > + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" use single quotes > + return 'fast function {} (#{})'.format(ffname, ffid) > > > def dump_lj_gco_trace(gcobj): > @@ -2079,7 +2085,7 @@ def dump_proto(proto): > > > def dump_func(func): > - ffid = func['ffid'] > + ffid = int(func['ffid']) > > if ffid == 0: > pt = funcproto(func) > @@ -2087,7 +2093,8 @@ def dump_func(func): > elif ffid == 1: > return 'C function @ {}\n'.format(strx64(func['f'])) > else: > - return 'fast function #{}\n'.format(int(ffid)) > + ffname = FF_NAMES[ffid] if ffid < len(FF_NAMES) else "unknown" the same is used in dump_lj_gco_func(), I would create a helper for this > + return 'fast function {} (#{})\n'.format(ffname, ffid) > > > # FFI dumpers. > @@ -2713,7 +2720,7 @@ the type and some info related to it. > * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> > <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> > <CFUNC>: C function <mcode address> > - <FFUNC>: fast function #<ffid> > + <FFUNC>: fast function <ffname> (#<ffid>) > * LJ_TTRACE: trace <traceno> @ <gcr> > * LJ_TCDATA: cdata @ <gcr> > * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) > @@ -2932,7 +2939,7 @@ the type and some info related to it. > * LJ_TFUNC: <LFUNC|CFUNC|FFUNC> > <LFUNC>: Lua function @ <gcr>, <nupvals> upvalues, <chunk:line> > <CFUNC>: C function <mcode address> > - <FFUNC>: fast function #<ffid> > + <FFUNC>: fast function <ffname> (#<ffid>) > * LJ_TTRACE: trace <traceno> @ <gcr> > * LJ_TCDATA: cdata @ <gcr> > * LJ_TTAB: table @ <gcr> (asize: <asize>, hmask: <hmask>) > diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py > index 5e369f00..fe5e34f5 100644 > --- a/test/tarantool-debugger-tests/debug-extension-tests.py > +++ b/test/tarantool-debugger-tests/debug-extension-tests.py fallback "unknown" is not covered > @@ -326,7 +326,7 @@ GCO_ARGS = ( > 'coroutine.create(function() end),\n' > 'function() end,\n' > 'require,\n' > - 'print,\n' > + 'math.min,\n' > 'ffi.new("int*"),\n' > '{1},\n' > 'newproxy(),\n' added also tests for: getmetatable(io.stdout).__gc and getmetatable(io.stdout).__tostring to cover regexp > @@ -338,7 +338,7 @@ GCO_RX = ( > r'thread @ ' + RX_ADDR + r'\n' > r'Lua function @ ' + RX_ADDR + r', [0-9]+ upvalues, .+:[0-9]+\n' > r'C function @ ' + RX_ADDR + r'\n' > - r'fast function #[0-9]+\n' > + r'fast function math.min \(#[0-9]+\)\n' > r'cdata @ ' + RX_ADDR + r' \[\d+\] <int \*> 0x0\n' > r'table @ ' + RX_ADDR + r' \(asize: \d+, hmask: ' + RX_HASH + r'\)\n' > r'userdata @ ' + RX_ADDR + r'\n' > @@ -367,6 +367,7 @@ class TestLJTV(TestCaseBase): > # Sorted in LJT order. > lua_script = ( > 'local ffi = require("ffi")\n' > + 'local math = require("math")\n' > 'print(\n' > ' nil,\n' > ' false,\n' > @@ -435,6 +436,7 @@ class TestLJGCo(TestCaseBase): > > lua_script = ( > 'local ffi = require("ffi")\n' > + 'local math = require("math")\n' > 'print(\n' + > GCO_ARGS + > ' 1\n' # Stub for the pattern. add also a test with "lj-func" for any ffunc ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-28 13:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-09-09 13:07 [Tarantool-patches] [PATCH luajit] dbg: display fast function name along with ffid Mikhail Elhimov via Tarantool-patches 2026-09-22 9:16 ` Sergey Kaplun via Tarantool-patches 2026-09-23 22:55 ` Mikhail Elhimov via Tarantool-patches 2026-09-24 16:48 ` [Tarantool-patches] [PATCH luajit v2] " Mikhail Elhimov via Tarantool-patches 2026-09-24 20:14 ` [Tarantool-patches] [PATCH luajit v3] " Mikhail Elhimov via Tarantool-patches 2026-09-28 13:02 ` Sergey Bronnikov via Tarantool-patches
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox