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

Reply via email to