Author: Armin Rigo <ar...@tunes.org> Branch: reverse-debugger Changeset: r85349:f48e08e15ad8 Date: 2016-06-23 10:19 +0200 http://bitbucket.org/pypy/pypy/changeset/f48e08e15ad8/
Log: tweaks diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py --- a/rpython/rlib/revdb.py +++ b/rpython/rlib/revdb.py @@ -106,11 +106,11 @@ ll_callback = llhelper(_CALLBACK_GCREF_FNPTR, callback) llop.revdb_track_object(lltype.Void, unique_id, ll_callback) -def save_state(): - return llop.revdb_save_state(lltype.Bool) +def watch_save_state(): + return llop.revdb_watch_save_state(lltype.Bool) -def restore_state(): - llop.revdb_restore_state(lltype.Void) +def watch_restore_state(any_watch_point): + llop.revdb_watch_restore_state(lltype.Void, any_watch_point) # ____________________________________________________________ diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py --- a/rpython/rtyper/lltypesystem/lloperation.py +++ b/rpython/rtyper/lltypesystem/lloperation.py @@ -570,8 +570,8 @@ 'revdb_breakpoint': LLOp(), 'revdb_get_value': LLOp(sideeffects=False), 'revdb_get_unique_id': LLOp(sideeffects=False), - 'revdb_save_state': LLOp(), - 'revdb_restore_state': LLOp(), + 'revdb_watch_save_state': LLOp(), + 'revdb_watch_restore_state': LLOp(), } # ***** Run test_lloperation after changes. ***** 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 @@ -126,6 +126,8 @@ b.num2name[new] = break_at if break_at.startswith('W'): b.watchvalues[new] = '' + nids = map(int, r_dollar_num.findall(break_at[1:])) + b.watchdollars[new] = nids print "%s %d added" % (self._bp_kind(break_at).capitalize(), new) def cmd_info_breakpoints(self): @@ -275,6 +277,7 @@ else: name = b.num2name.pop(arg) b.watchvalues.pop(arg, '') + b.watchdollars.pop(arg, '') kind = self._bp_kind(name) print "%s %d deleted: %s" % (kind.capitalize(), arg, name[1:]) 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 @@ -20,6 +20,7 @@ def __init__(self): self.num2name = {} # {small number: break/watchpoint} self.watchvalues = {} # {small number: resulting text} + self.watchdollars = {} # {small number: [nids]} self.stack_depth = 0 # breaks if the depth becomes lower than this def __repr__(self): @@ -75,7 +76,7 @@ return ''.join(pieces) def send(self, msg): - #print 'SENT:', self.pid, msg + print 'SENT:', self.pid, msg binary = struct.pack("iIqqq", msg.cmd, len(msg.extra), msg.arg1, msg.arg2, msg.arg3) self.control_socket.sendall(binary + msg.extra) @@ -85,7 +86,7 @@ cmd, size, arg1, arg2, arg3 = struct.unpack("iIqqq", binary) extra = self._recv_all(size) msg = Message(cmd, arg1, arg2, arg3, extra) - #print 'RECV:', self.pid, msg + print 'RECV:', self.pid, msg return msg def expect(self, cmd, arg1=0, arg2=0, arg3=0, extra=""): diff --git a/rpython/translator/revdb/src-revdb/revdb.c b/rpython/translator/revdb/src-revdb/revdb.c --- a/rpython/translator/revdb/src-revdb/revdb.c +++ b/rpython/translator/revdb/src-revdb/revdb.c @@ -552,6 +552,7 @@ last_recorded_breakpoint_loc = 0; pending_after_forward = &answer_recorded_breakpoint; } + rpy_revdb.watch_enabled = (breakpoint_mode != 'i'); } static void command_future_ids(rpy_revdb_command_t *cmd, char *extra) @@ -602,6 +603,7 @@ stopped_time = rpy_revdb.stop_point_seen; stopped_uid = rpy_revdb.unique_id_seen; rpy_revdb.unique_id_seen = (-1ULL) << 63; + rpy_revdb.watch_enabled = 0; } static void restore_state(void) @@ -613,24 +615,25 @@ } RPY_EXTERN -bool_t rpy_reverse_db_save_state(void) +void rpy_reverse_db_watch_save_state(void) { - if (stopped_time == 0) { - save_state(); - disable_io(); - rpy_revdb.stop_point_break = 0; - rpy_revdb.unique_id_break = 0; - return 1; + if (stopped_time != 0) { + fprintf(stderr, "unexpected recursive watch_save_state\n"); + exit(1); } - else - return 0; + save_state(); + disable_io(); + rpy_revdb.stop_point_break = 0; + rpy_revdb.unique_id_break = 0; } RPY_EXTERN -void rpy_reverse_db_restore_state(void) +void rpy_reverse_db_watch_restore_state(bool_t any_watch_point) { enable_io(1); restore_state(); + assert(!rpy_revdb.watch_enabled); + rpy_revdb.watch_enabled = any_watch_point; } RPY_EXTERN @@ -754,13 +757,11 @@ exit(1); } if (rpy_revdb_commands.rp_alloc) { - if (!rpy_reverse_db_save_state()) { - fprintf(stderr, "unexpected recursive unique_id_break\n"); - exit(1); - } + bool_t watch_enabled = rpy_revdb.watch_enabled; + rpy_reverse_db_watch_save_state(); if (setjmp(jmp_buf_cancel_execution) == 0) rpy_revdb_commands.rp_alloc(uid, new_object); - rpy_reverse_db_restore_state(); + rpy_reverse_db_watch_restore_state(watch_enabled); } rpy_revdb.unique_id_break = *future_next_id++; return uid; diff --git a/rpython/translator/revdb/src-revdb/revdb_include.h b/rpython/translator/revdb/src-revdb/revdb_include.h --- a/rpython/translator/revdb/src-revdb/revdb_include.h +++ b/rpython/translator/revdb/src-revdb/revdb_include.h @@ -15,6 +15,7 @@ #define RPY_RDB_REPLAY rpy_revdb.replay #define RPY_RDB_DYNAMIC_REPLAY #endif + bool_t watch_enabled; char *buf_p, *buf_limit; uint64_t stop_point_seen, stop_point_break; uint64_t unique_id_seen, unique_id_break; @@ -98,11 +99,13 @@ #define OP_REVDB_TRACK_OBJECT(uid, callback, r) \ rpy_reverse_db_track_object(uid, callback) -#define OP_REVDB_SAVE_STATE(r) \ - r = rpy_reverse_db_save_state() +#define OP_REVDB_WATCH_SAVE_STATE(r) do { \ + r = rpy_revdb.watch_enabled; \ + if (r) rpy_reverse_db_watch_save_state(); \ + } while (0) -#define OP_REVDB_RESTORE_STATE(r) \ - rpy_reverse_db_restore_state() +#define OP_REVDB_WATCH_RESTORE_STATE(any_watch_point, r) \ + rpy_reverse_db_watch_restore_state(any_watch_point) RPY_EXTERN void rpy_reverse_db_flush(void); RPY_EXTERN char *rpy_reverse_db_fetch(int expected_size, @@ -114,7 +117,7 @@ RPY_EXTERN void rpy_reverse_db_breakpoint(int64_t num); RPY_EXTERN long long rpy_reverse_db_get_value(char value_id); RPY_EXTERN uint64_t rpy_reverse_db_unique_id_break(void *new_object); -RPY_EXTERN bool_t rpy_reverse_db_save_state(void); -RPY_EXTERN void rpy_reverse_db_restore_state(void); +RPY_EXTERN void rpy_reverse_db_watch_save_state(void); +RPY_EXTERN void rpy_reverse_db_watch_restore_state(bool_t any_watch_point); /* ------------------------------------------------------------ */ _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit