Added 'cy select' command
authorMark Florisson <eggy.nospam@gmail.com>
Sat, 13 Nov 2010 11:24:42 +0000 (12:24 +0100)
committerMark Florisson <eggy.nospam@gmail.com>
Sat, 13 Nov 2010 11:24:42 +0000 (12:24 +0100)
Cython/Debugger/libcython.py

index 1299abaa46ecd789879cd47225de311d76b7e4f5..f02817bd4d319acd3e418bb9f088a1ef6f08fc1e 100644 (file)
@@ -598,6 +598,7 @@ class CyCy(CythonCommand):
             finish = CyFinish.register(),
             up = CyUp.register(),
             down = CyDown.register(),
+            select = CySelect.register(),
             bt = CyBacktrace.register(),
             list = CyList.register(),
             print_ = CyPrint.register(),
@@ -949,6 +950,32 @@ class CyDown(CyUp):
     _command = 'down'
 
 
+class CySelect(CythonCodeStepper):
+    """
+    Select a frame. Use frame numbers as listed in `cy backtrace`.
+    This command is useful because `cy backtrace` prints a reversed backtrace.
+    """
+    
+    name = 'cy select'
+    
+    def invoke(self, stackno, from_tty):
+        try:
+            stackno = int(stackno)
+        except ValueError:
+            raise gdb.GdbError("Not a valid number: %r" % (stackno,))
+        
+        frame = gdb.selected_frame()
+        while frame.newer():
+            frame = frame.newer()
+        
+        stackdepth = self._stackdepth(frame)
+        
+        try:
+            gdb.execute('select %d' % (stackdepth - stackno - 1,))
+        except RuntimeError, e:
+            raise gdb.GdbError(*e.args)
+
+
 class CyBacktrace(CythonCommand):
     'Print the Cython stack'