Author: Armin Rigo <ar...@tunes.org>
Branch: reverse-debugger
Changeset: r85466:506d89aa4799
Date: 2016-06-30 08:52 +0200
http://bitbucket.org/pypy/pypy/changeset/506d89aa4799/

Log:    make compiling watch points a separate phase, returning a marshalled
        code

diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py
--- a/rpython/rlib/revdb.py
+++ b/rpython/rlib/revdb.py
@@ -16,8 +16,9 @@
 CMD_BREAKPOINTS = 4
 CMD_STACKID     = 5
 CMD_ATTACHID    = 6
-CMD_CHECKWATCH  = 7
-CMD_WATCHVALUES = 8
+CMD_COMPILEWATCH= 7
+CMD_CHECKWATCH  = 8
+CMD_WATCHVALUES = 9
 ANSWER_LINECACHE= 19
 ANSWER_TEXT     = 20
 ANSWER_STACKID  = 21
diff --git a/rpython/translator/revdb/interact.py 
b/rpython/translator/revdb/interact.py
--- a/rpython/translator/revdb/interact.py
+++ b/rpython/translator/revdb/interact.py
@@ -120,32 +120,40 @@
         lst = [str(n) for n in sorted(self.pgroup.paused)]
         print ', '.join(lst)
 
-    def _bp_kind(self, name):
+    def _bp_kind(self, num):
+        name = self.pgroup.all_breakpoints.num2name.get(num, '??')
         if name[0] == 'B':
-            return 'breakpoint'
+            kind = 'breakpoint'
+            name = name[1:]
         elif name[0] == 'W':
-            return 'watchpoint'
+            kind = 'watchpoint'
+            name = self.pgroup.all_breakpoints.sources.get(num, '??')
         else:
-            return '?????point'
+            kind = '?????point'
+            name = repr(name)
+        return kind, name
 
-    def _bp_new(self, break_at, nids=None):
+    def _bp_new(self, break_at, nids=None, source_expr=None):
         b = self.pgroup.edit_breakpoints()
         new = 1
         while new in b.num2name:
             new += 1
         b.num2name[new] = break_at
+        b.sources[new] = source_expr
         if break_at.startswith('W'):
             b.watchvalues[new] = ''
             if nids:
                 b.watchuids[new] = self.pgroup.nids_to_uids(nids)
-        print "%s %d added" % (self._bp_kind(break_at).capitalize(), new)
+        kind, name = self._bp_kind(new)
+        print "%s %d added" % (kind.capitalize(), new)
 
     def cmd_info_breakpoints(self):
         """List current breakpoints and watchpoints"""
-        lst = self.pgroup.all_breakpoints.num2name.items()
+        lst = self.pgroup.all_breakpoints.num2name.keys()
         if lst:
-            for num, name in sorted(lst):
-                print '\t%s %d: %s' % (self._bp_kind(name), num, name[1:])
+            for num in sorted(lst):
+                kind, name = self._bp_kind(num)
+                print '\t%s %d: %s' % (kind, num, name)
         else:
             print 'no breakpoints.'
     cmd_info_watchpoints = cmd_info_breakpoints
@@ -171,10 +179,9 @@
 
     def hit_breakpoint(self, b, backward=False):
         if b.num != -1:
-            name = self.pgroup.all_breakpoints.num2name.get(b.num, '??')
-            kind = self._bp_kind(name)
+            kind, name = self._bp_kind(d.num)
             self.print_extra_pending_info = 'Hit %s %d: %s' % (kind, b.num,
-                                                               name[1:])
+                                                               name)
         elif backward:
             b.time -= 1
         if self.pgroup.get_current_time() != b.time:
@@ -307,22 +314,31 @@
         if arg not in b.num2name:
             print "No breakpoint/watchpoint number %d" % (arg,)
         else:
-            name = b.num2name.pop(arg)
+            kind, name = self._bp_kind(arg)
+            b.num2name.pop(arg, '')
+            b.sources.pop(arg, '')
             b.watchvalues.pop(arg, '')
             b.watchuids.pop(arg, '')
-            kind = self._bp_kind(name)
-            print "%s %d deleted: %s" % (kind.capitalize(), arg, name[1:])
+            print "%s %d deleted: %s" % (kind.capitalize(), arg, name)
 
     def command_watch(self, argument):
         """Add a watchpoint (use $NUM in the expression to watch)"""
         if not argument:
             print "Watch what?"
             return
+        #
+        ok_flag, compiled_code = self.pgroup.compile_watchpoint_expr(argument)
+        if not ok_flag:
+            print compiled_code     # the error message
+            print 'Watchpoint not added'
+            return
+        #
         nids = map(int, r_dollar_num.findall(argument))
-        ok_flag, text = self.pgroup.check_watchpoint_expr(argument, nids)
+        ok_flag, text = self.pgroup.check_watchpoint_expr(compiled_code, nids)
         if not ok_flag:
             print text
             print 'Watchpoint not added'
-        else:
-            self._bp_new('W' + argument, nids=nids)
-            self.pgroup.update_watch_values()
+            return
+        #
+        self._bp_new('W' + compiled_code, nids=nids, source_expr=argument)
+        self.pgroup.update_watch_values()
diff --git a/rpython/translator/revdb/message.py 
b/rpython/translator/revdb/message.py
--- a/rpython/translator/revdb/message.py
+++ b/rpython/translator/revdb/message.py
@@ -18,8 +18,9 @@
                        #         extra="\0-separated names")
 CMD_STACKID     = 5    # Message(CMD_STACKID, parent-flag)
 CMD_ATTACHID    = 6    # Message(CMD_ATTACHID, small-num, unique-id)
-CMD_CHECKWATCH  = 7    # Message(CMD_CHECKWATCH, extra=expression)
-CMD_WATCHVALUES = 8    # Message(CMD_WATCHVALUES, extra=texts)
+CMD_COMPILEWATCH= 7    # Message(CMD_COMPILEWATCH, extra=expression)
+CMD_CHECKWATCH  = 8    # Message(CMD_CHECKWATCH, extra=compiled_code)
+CMD_WATCHVALUES = 9    # Message(CMD_WATCHVALUES, extra=texts)
 
 
 # the first message sent by the first child:
@@ -67,6 +68,8 @@
 #    Message(ANSWER_NEXTNID, unique-id)
 ANSWER_NEXTNID    = 22
 
+# sent after CMD_COMPILEWATCH:
+#    Message(ANSWER_WATCH, ok_flag, extra=marshalled_code)
 # sent after CMD_CHECKWATCH:
 #    Message(ANSWER_WATCH, ok_flag, extra=result_of_expr)
 ANSWER_WATCH      = 23
diff --git a/rpython/translator/revdb/process.py 
b/rpython/translator/revdb/process.py
--- a/rpython/translator/revdb/process.py
+++ b/rpython/translator/revdb/process.py
@@ -17,6 +17,7 @@
 
     def __init__(self):
         self.num2name = {}     # {small number: break/watchpoint}
+        self.sources = {}      # {small number: src text or None}
         self.watchvalues = {}  # {small number: resulting text}
         self.watchuids = {}    # {small number: [uid...]}
         self.stack_id = 0      # breaks when leaving/entering a frame from/to
@@ -402,11 +403,17 @@
                 seen.add(num)
         assert set(self.all_breakpoints.watchvalues) == seen
 
-    def check_watchpoint_expr(self, expr, nids=None):
+    def compile_watchpoint_expr(self, expr):
+        self.active.send(Message(CMD_COMPILEWATCH, extra=expr))
+        msg = self.active.expect(ANSWER_WATCH, Ellipsis, extra=Ellipsis)
+        self.active.expect_ready()
+        return msg.arg1, msg.extra
+
+    def check_watchpoint_expr(self, compiled_code, nids=None):
         if nids:
             uids = self.nids_to_uids(nids)
             self.attach_printed_objects(uids, watch_env=True)
-        self.active.send(Message(CMD_CHECKWATCH, extra=expr))
+        self.active.send(Message(CMD_CHECKWATCH, extra=compiled_code))
         msg = self.active.expect(ANSWER_WATCH, Ellipsis, extra=Ellipsis)
         self.active.expect_ready()
         return msg.arg1, msg.extra
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to