Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit