[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