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