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