aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python/py-mi-cmd.py
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.python/py-mi-cmd.py')
-rw-r--r--gdb/testsuite/gdb.python/py-mi-cmd.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-mi-cmd.py b/gdb/testsuite/gdb.python/py-mi-cmd.py
new file mode 100644
index 0000000..ffe27c5
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-mi-cmd.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2019-2022 Free Software Foundation, Inc.
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gdb
+
+
+class BadKey:
+ def __repr__(self):
+ return "Bad Key"
+
+
+class ReallyBadKey:
+ def __repr__(self):
+ return BadKey()
+
+
+class pycmd1(gdb.MICommand):
+ def invoke(self, argv):
+ if argv[0] == "int":
+ return {"result": 42}
+ elif argv[0] == "str":
+ return {"result": "Hello world!"}
+ elif argv[0] == "ary":
+ return {"result": ["Hello", 42]}
+ elif argv[0] == "dct":
+ return {"result": {"hello": "world", "times": 42}}
+ elif argv[0] == "bk1":
+ return {"result": {BadKey(): "world"}}
+ elif argv[0] == "bk2":
+ return {"result": {1: "world"}}
+ elif argv[0] == "bk3":
+ return {"result": {ReallyBadKey(): "world"}}
+ elif argv[0] == "tpl":
+ return {"result": (42, "Hello")}
+ elif argv[0] == "itr":
+ return {"result": iter([1, 2, 3])}
+ elif argv[0] == "nn1":
+ return None
+ elif argv[0] == "nn2":
+ return {"result": [None]}
+ elif argv[0] == "red":
+ pycmd2("-pycmd")
+ return None
+ elif argv[0] == "nd1":
+ return [1, 2, 3]
+ elif argv[0] == "nd2":
+ return 123
+ elif argv[0] == "nd3":
+ return "abc"
+ elif argv[0] == "ik1":
+ return {"xxx yyy": 123}
+ elif argv[0] == "ik2":
+ return {"result": {"xxx yyy": 123}}
+ elif argv[0] == "ik3":
+ return {"xxx+yyy": 123}
+ elif argv[0] == "ik4":
+ return {"xxx.yyy": 123}
+ elif argv[0] == "ik5":
+ return {"123xxxyyy": 123}
+ elif argv[0] == "empty_key":
+ return {"": 123}
+ elif argv[0] == "dash-key":
+ return {"the-key": 123}
+ elif argv[0] == "exp":
+ raise gdb.GdbError()
+ else:
+ raise gdb.GdbError("Invalid parameter: %s" % argv[0])
+
+
+class pycmd2(gdb.MICommand):
+ def invoke(self, argv):
+ if argv[0] == "str":
+ return {"result": "Ciao!"}
+ elif argv[0] == "red":
+ pycmd1("-pycmd")
+ raise gdb.GdbError("Command redefined but we failing anyway")
+ elif argv[0] == "new":
+ pycmd1("-pycmd-new")
+ return None
+ else:
+ raise gdb.GdbError("Invalid parameter: %s" % argv[0])
+
+
+# This class creates a command that returns a string, which is passed
+# when the command is created.
+class pycmd3(gdb.MICommand):
+ def __init__(self, name, msg, top_level):
+ super(pycmd3, self).__init__(name)
+ self._msg = msg
+ self._top_level = top_level
+
+ def invoke(self, args):
+ return {self._top_level: {"msg": self._msg}}
+
+
+# A command that is missing it's invoke method.
+class no_invoke(gdb.MICommand):
+ def __init__(self, name):
+ super(no_invoke, self).__init__(name)
+
+
+def free_invoke(obj, args):
+ return {"result": args}
+
+
+# Run some test involving catching exceptions. It's easier to write
+# these as a Python function which is then called from the exp script.
+def run_exception_tests():
+ print("PASS")