Debugger: Added 'cy set' command
authorMark Florisson <markflorisson88@gmail.com>
Fri, 25 Mar 2011 22:01:51 +0000 (23:01 +0100)
committerMark Florisson <markflorisson88@gmail.com>
Fri, 25 Mar 2011 22:01:51 +0000 (23:01 +0100)
Cython/Debugger/Tests/test_libcython_in_gdb.py
Cython/Debugger/libcython.py

index 46dba686f061851e5f768c8b8db383842de1a636..683f4c7c24f1447c6b7d1b6ed3061a053e0f1dd1 100644 (file)
@@ -379,6 +379,16 @@ class TestExec(DebugTestCase):
         self.assertEqual('14', self.eval_command('some_random_var'))
 
 
+class CySet(DebugTestCase):
+
+    def test_cyset(self):
+        self.break_and_run('os.path.join("foo", "bar")')
+
+        gdb.execute('cy set a = $cy_eval("{None: []}")')
+        stringvalue = self.read_var("a", cast_to=str)
+        self.assertEqual(stringvalue, "{None: []}")
+
+
 class TestCyEval(DebugTestCase):
     "Test the $cy_eval() gdb function."
 
index e242bada2c711b4da696b51d888008cd761a2082..fc6a777b2229a172ee84eb661eb3b609a7d10f90 100644 (file)
@@ -625,6 +625,7 @@ class CyCy(CythonCommand):
             globals = CyGlobals.register(),
             exec_ = libpython.FixGdbCommand('cy exec', '-cy-exec'),
             _exec = CyExec.register(),
+            set = CySet.register(),
 
             # GDB functions
             cy_cname = CyCName('cy_cname'),
@@ -1284,6 +1285,29 @@ class CyExec(CythonCommand, libpython.PyExec, EvaluateOrExecuteCodeMixin):
         executor.xdecref(self.evalcode(expr, executor.Py_single_input))
 
 
+class CySet(CythonCommand):
+    """
+    Set a Cython variable to a certain value
+
+        cy set my_cython_c_variable = 10
+        cy set my_cython_py_variable = $cy_eval("{'doner': 'kebab'}")
+    """
+
+    name = 'cy set'
+    command_class = gdb.COMMAND_DATA
+    completer_class = gdb.COMPLETE_NONE
+
+    @require_cython_frame
+    def invoke(self, expr, from_tty):
+        name_and_expr = expr.split('=', 1)
+        if len(name_and_expr) != 2:
+            raise gdb.GdbError("Invalid expression. Use 'cy set var = expr'.")
+
+        varname, expr = name_and_expr
+        cname = self.cy.cy_cname.invoke(varname.strip())
+        gdb.execute("set %s = %s" % (cname, expr))
+
+
 # Functions
 
 class CyCName(gdb.Function, CythonBase):