mirror of
https://github.com/nim-lang/Nim.git
synced 2026-08-28 01:21:40 +00:00
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
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/debug/nim-gdb.py")
|
|
# debug all instances of the generic function `myDebug`, should be 14
|
|
gdb.execute("rbreak myDebug")
|
|
gdb.execute("run")
|
|
|
|
outputs = [
|
|
'meTwo',
|
|
'""',
|
|
'"meTwo"',
|
|
'{meOne, meThree}',
|
|
'MyOtherEnum(1)',
|
|
'{MyOtherEnum(0), MyOtherEnum(2)}',
|
|
'array = {1, 2, 3, 4, 5}',
|
|
'seq(0, 0)',
|
|
'seq(0, 10)',
|
|
'array = {"one", "two"}',
|
|
'seq(3, 3) = {1, 2, 3}',
|
|
'seq(3, 3) = {"one", "two", "three"}',
|
|
'Table(3, 64) = {[4] = "four", [5] = "five", [6] = "six"}',
|
|
'Table(3, 8) = {["two"] = 2, ["three"] = 3, ["one"] = 1}',
|
|
'{a = 1, b = "some string"}',
|
|
'("hello", 42)'
|
|
]
|
|
|
|
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"\x1b[38;5;105m{i+1}) expecting: {expected}: \x1b[0m", gdb.STDLOG)
|
|
gdb.flush()
|
|
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")
|
|
raw = gdb.parse_and_eval("myArray")
|
|
elif i == 9:
|
|
# myOtherArray is passed as pointer to int to myDebug. I look up myOtherArray up in the stack
|
|
gdb.execute("up")
|
|
raw = gdb.parse_and_eval("myOtherArray")
|
|
else:
|
|
rawArg = re.sub(noSuitableRegex, "", gdb.execute("info args", to_string = True))
|
|
raw = rawArg.split("=", 1)[-1].strip()
|
|
output = str(raw)
|
|
|
|
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")
|