[pypy-commit] pypy reverse-debugger: Some tests for prints, including printing $0

arigo pypy.commits at gmail.com
Fri Aug 12 04:36:42 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: reverse-debugger
Changeset: r86163:d7c4d2ccc68a
Date: 2016-08-12 10:20 +0200
http://bitbucket.org/pypy/pypy/changeset/d7c4d2ccc68a/

Log:	Some tests for prints, including printing $0

diff --git a/pypy/interpreter/reverse_debugging.py b/pypy/interpreter/reverse_debugging.py
--- a/pypy/interpreter/reverse_debugging.py
+++ b/pypy/interpreter/reverse_debugging.py
@@ -41,7 +41,6 @@
     """
     assert space.config.translation.reverse_debugger
     dbstate.space = space
-    dbstate.w_future = space.w_Ellipsis    # a random prebuilt object
 
     make_sure_not_resized(dbstate.watch_progs)
     make_sure_not_resized(dbstate.metavars)
@@ -228,6 +227,9 @@
     revdb.stop_point(place)
 
 
+def future_object(space):
+    return space.w_Ellipsis    # a random prebuilt object
+
 def load_metavar(index):
     assert index >= 0
     space = dbstate.space
@@ -236,7 +238,7 @@
     if w_var is None:
         raise oefmt(space.w_NameError, "no constant object '$%d'",
                     index)
-    if w_var is dbstate.w_future:
+    if w_var is future_object(space):
         raise oefmt(space.w_RuntimeError,
                     "'$%d' refers to an object created later in time",
                     index)
@@ -543,7 +545,7 @@
     except KeyError:
         # uid not found, probably a future object
         dbstate.watch_futures[uid] = index_metavar
-        w_obj = dbstate.w_future
+        w_obj = future_object(space)
     set_metavar(index_metavar, w_obj)
 lambda_attachid = lambda: command_attachid
 
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
@@ -1536,6 +1536,7 @@
     save_state();
     if (rpy_revdb_commands.rp_alloc) {
         protect_potential_io();
+        /* invoke the "ALLOCATING" callback from RPython */
         rpy_revdb_commands.rp_alloc(uid, new_object);
         unprotect_potential_io();
     }
diff --git a/rpython/translator/revdb/test/test_process.py b/rpython/translator/revdb/test/test_process.py
--- a/rpython/translator/revdb/test/test_process.py
+++ b/rpython/translator/revdb/test/test_process.py
@@ -1,12 +1,23 @@
-import py
+import py, sys
+from cStringIO import StringIO
 from rpython.rlib import revdb
-from rpython.rlib.debug import debug_print
+from rpython.rlib.debug import debug_print, ll_assert
+from rpython.rtyper.annlowlevel import cast_gcref_to_instance
 from rpython.translator.revdb.message import *
 from rpython.translator.revdb.process import ReplayProcessGroup, Breakpoint
 
 from hypothesis import given, strategies
 
 
+class stdout_capture(object):
+    def __enter__(self):
+        self.old_stdout = sys.stdout
+        sys.stdout = self.buffer = StringIO()
+        return self.buffer
+    def __exit__(self, *args):
+        sys.stdout = self.old_stdout
+
+
 class TestReplayProcessGroup:
 
     def setup_class(cls):
@@ -17,6 +28,10 @@
 
         class DBState:
             break_loop = -2
+            stuff = None
+            metavar = None
+            printed_stuff = None
+            watch_future = -1
         dbstate = DBState()
 
         def blip(cmd, extra):
@@ -27,8 +42,46 @@
             revdb.send_answer(42, cmd.c_cmd, -43, -44, extra)
         lambda_blip = lambda: blip
 
+        def command_print(cmd, extra):
+            if extra == 'print-me':
+                stuff = dbstate.stuff
+            elif extra == '$0':
+                stuff = dbstate.metavar
+            else:
+                assert False
+            uid = revdb.get_unique_id(stuff)
+            ll_assert(uid > 0, "uid == 0")
+            revdb.send_nextnid(uid)   # outputs '$NUM = '
+            revdb.send_output('stuff\n')
+            dbstate.printed_stuff = stuff
+        lambda_print = lambda: command_print
+
+        def command_attachid(cmd, extra):
+            index_metavar = cmd.c_arg1
+            uid = cmd.c_arg2
+            ll_assert(index_metavar == 0, "index_metavar != 0")  # in this test
+            dbstate.metavar = dbstate.printed_stuff
+            if dbstate.metavar is None:
+                # uid not found, probably a future object
+                dbstate.watch_future = uid
+        lambda_attachid = lambda: command_attachid
+
+        def command_allocating(uid, gcref):
+            stuff = cast_gcref_to_instance(Stuff, gcref)
+            # 'stuff' is just allocated; 'stuff.x' is not yet initialized
+            dbstate.printed_stuff = stuff
+            if dbstate.watch_future != -1:
+                ll_assert(dbstate.watch_future == uid,
+                          "watch_future out of sync")
+                dbstate.watch_future = -1
+                dbstate.metavar = stuff
+        lambda_allocating = lambda: command_allocating
+
         def main(argv):
             revdb.register_debug_command(100, lambda_blip)
+            revdb.register_debug_command(CMD_PRINT, lambda_print)
+            revdb.register_debug_command(CMD_ATTACHID, lambda_attachid)
+            revdb.register_debug_command("ALLOCATING", lambda_allocating)
             for i, op in enumerate(argv[1:]):
                 dbstate.stuff = Stuff()
                 dbstate.stuff.x = i + 1000
@@ -87,3 +140,26 @@
         group.active.expect(42, 100, -43, -44, 'set-breakpoint')
         group.active.expect(ANSWER_READY, 1, Ellipsis)
         group.go_forward(10, 'i')    # does not raise Breakpoint
+
+    def test_print_cmd(self):
+        group = ReplayProcessGroup(str(self.exename), self.rdbname)
+        group.go_forward(1)
+        assert group.get_current_time() == 2
+        with stdout_capture() as buf:
+            group.print_cmd('print-me')
+        assert buf.getvalue() == "$0 = stuff\n"
+        return group
+
+    def test_print_metavar(self):
+        group = self.test_print_cmd()
+        with stdout_capture() as buf:
+            group.print_cmd('$0', nids=[0])
+        assert buf.getvalue() == "$0 = stuff\n"
+
+    def test_jump_and_print_metavar(self):
+        group = self.test_print_cmd()
+        assert group.is_tainted()
+        group.jump_in_time(2)
+        with stdout_capture() as buf:
+            group.print_cmd('$0', nids=[0])
+        assert buf.getvalue() == "$0 = stuff\n"


More information about the pypy-commit mailing list