Support new runtime with nim-gdb (#21400)

* Add support for orc strings

* Cleaned up testing script

Enums now printing properly

Merged both old and new strings into the one printer

Moving onto sets which seem kinda difficult

* Sets working

Instead of trying to imitate how Nim represents enums, I just call the dollar proc for each enum value

While this runs into problems if the user doesn't call the dollar proc anywhere, I believe its a decent tradeoff

I've cleaned up the error message for when it cannot find dollar proc (Might add in proper message on how to fix)

* Support sequences

V2 runtime seems to have sequences that don't have a len (Guessing its some kind of short seq optimisation?) but I've rolled
the implementation into normal sequences since the implementation is practically the same

* Clean up test program so it isn't using diff

Also don't redirect the first nim compile to /dev/null so that we can check for any compilation errors

I found the diff to be annoying to read (Seeing as the test script already performs diffing)

* Tables are now supported

* Add colours to test output

It was getting difficult to tell apart test output from GDB output so I added colour to better tell them apart

* Both old and new runtime are working

Set exit code in python test script so that this could possibly be added to the CI. Only issue is that it can be flaky (GDB crashes randomly for some reason)

* Remove old code that was commented out

If I need it later I'll just use git

* Remove branch that never runs

* Remove the old test output [skip ci]
This commit is contained in:
Jake Leahy 2023-02-21 07:19:46 +11:00 • committed by GitHub
commit c66dc913ce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 160 additions and 307 deletions

View file

@ -1,10 +1,13 @@
import gdb
import re
import sys
# this test should test the gdb pretty printers of the nim
# library. But be aware this test is not complete. It only tests the
# command line version of gdb. It does not test anything for the
# machine interface of gdb. This means if if this test passes gdb
# frontends might still be broken.
gdb.execute("set python print-stack full")
gdb.execute("source ../../../tools/nim-gdb.py")
# debug all instances of the generic function `myDebug`, should be 14
gdb.execute("rbreak myDebug")
@ -16,7 +19,7 @@ outputs = [
'"meTwo"',
'{meOne, meThree}',
'MyOtherEnum(1)',
'5',
'{MyOtherEnum(0), MyOtherEnum(2)}',
'array = {1, 2, 3, 4, 5}',
'seq(0, 0)',
'seq(0, 10)',
@ -28,13 +31,17 @@ outputs = [
'{a = 1, b = "some string"}'
]
argRegex = re.compile("^.* = (?:No suitable Nim \$ operator found for type: \w+\s*)*(.*)$")
# Remove this error message which can pop up
noSuitableRegex = re.compile("(No suitable Nim \$ operator found for type: \w+\s*)")
for i, expected in enumerate(outputs):
gdb.write(f"{i+1}) expecting: {expected}: ", gdb.STDLOG)
gdb.write(f"\x1b[38;5;105m{i+1}) expecting: {expected}: \x1b[0m", gdb.STDLOG)
gdb.flush()
functionSymbol = gdb.selected_frame().block().function
assert functionSymbol.line == 41, str(functionSymbol.line)
currFrame = gdb.selected_frame()
functionSymbol = currFrame.block().function
assert functionSymbol.line == 24, str(functionSymbol.line)
raw = ""
if i == 6:
# myArray is passed as pointer to int to myDebug. I look up myArray up in the stack
gdb.execute("up")
@ -44,10 +51,13 @@ for i, expected in enumerate(outputs):
gdb.execute("up")
raw = gdb.parse_and_eval("myOtherArray")
else:
raw = gdb.parse_and_eval("arg")
rawArg = re.sub(noSuitableRegex, "", gdb.execute("info args", to_string = True))
raw = rawArg.split("=", 1)[-1].strip()
output = str(raw)
assert output == expected, "{0} : output: ({1}) != expected: ({2})".format(i, output, expected)
gdb.write(f"passed\n", gdb.STDLOG)
if output != expected:
gdb.write(f"\x1b[38;5;196m ({output}) != expected: ({expected})\x1b[0m\n", gdb.STDERR)
gdb.execute("quit 1")
else:
gdb.write("\x1b[38;5;34mpassed\x1b[0m\n", gdb.STDLOG)
gdb.execute("continue")