Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85221:6dd8ff533d6d
Date: 2016-06-18 07:46 +0200
http://bitbucket.org/pypy/pypy/changeset/6dd8ff533d6d/
Log: fix more tests
diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py
--- a/rpython/rlib/revdb.py
+++ b/rpython/rlib/revdb.py
@@ -103,7 +103,8 @@
('cmd', rffi.INT),
('arg1', lltype.SignedLongLong),
('arg2', lltype.SignedLongLong),
- ('arg3', lltype.SignedLongLong))
+ ('arg3', lltype.SignedLongLong),
+ hints={'ignore_revdb': True})
class RegisterDebugCommand(ExtRegistryEntry):
@@ -126,9 +127,9 @@
cmds.append((command_num, func))
s_func = self.bookkeeper.immutablevalue(func)
s_ptr1 = llannotation.SomePtr(ll_ptrtype=_CMDPTR)
- s_ptr2 = llannotation.SomePtr(ll_ptrtype=rffi.CCHARP)
+ s_str2 = annmodel.SomeString()
self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key,
- s_func, [s_ptr1, s_ptr2])
+ s_func, [s_ptr1, s_str2])
def specialize_call(self, hop):
hop.exception_cannot_occur()
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -439,7 +439,8 @@
if self.db.reverse_debugger:
S = self.lltypemap(op.args[0]).TO
if (S._gckind != 'gc' and not S._hints.get('is_excdata')
- and not S._hints.get('static_immutable')):
+ and not S._hints.get('static_immutable')
+ and not S._hints.get('ignore_revdb')):
from rpython.translator.revdb import revdb_genc
result = revdb_genc.emit(result, self.lltypename(op.result),
newvalue)
diff --git a/rpython/translator/revdb/revdb_genc.py
b/rpython/translator/revdb/revdb_genc.py
--- a/rpython/translator/revdb/revdb_genc.py
+++ b/rpython/translator/revdb/revdb_genc.py
@@ -24,7 +24,7 @@
def prepare_database(db):
FUNCPTR = lltype.Ptr(lltype.FuncType([revdb._CMDPTR,
- rffi.CCHARP], lltype.Void))
+ lltype.Ptr(rstr.STR)], lltype.Void))
bk = db.translator.annotator.bookkeeper
cmds = getattr(db.translator, 'revdb_commands', [])
diff --git a/rpython/translator/revdb/revmsg.py
b/rpython/translator/revdb/revmsg.py
--- a/rpython/translator/revdb/revmsg.py
+++ b/rpython/translator/revdb/revmsg.py
@@ -22,6 +22,11 @@
self.arg3 = arg3
self.extra = extra
+ def __repr__(self):
+ return 'Message(%d, %d, %d, %d, %r)' % (self.cmd, self.arg1,
+ self.arg2, self.arg3,
+ self.extra)
+
def __eq__(self, other):
return (self.cmd == other.cmd and
self.arg1 == other.arg1 and
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
@@ -201,7 +201,7 @@
#define ANSWER_FORKED (-22)
#define ANSWER_AT_END (-23)
-typedef void (*rpy_revdb_command_fn)(rpy_revdb_command_t *, char *);
+typedef void (*rpy_revdb_command_fn)(rpy_revdb_command_t *, RPyString *);
static int rpy_rev_sockfd;
static const char *rpy_rev_filename;
@@ -210,6 +210,7 @@
static uint64_t total_stop_points;
static jmp_buf jmp_buf_cancel_execution;
static void (*pending_after_forward)(void);
+static RPyString *empty_string;
static void attach_gdb(void)
{
@@ -285,6 +286,20 @@
rpy_revdb.unique_id_seen, 0);
}
+static RPyString *make_rpy_string(size_t length)
+{
+ RPyString *s = malloc(sizeof(RPyString) + length);
+ if (s == NULL) {
+ fprintf(stderr, "out of memory for a string of %llu chars\n",
+ (unsigned long long)length);
+ exit(1);
+ }
+ /* xxx assumes Boehm here for now */
+ memset(s, 0, sizeof(RPyString));
+ RPyString_Size(s) = length;
+ return s;
+}
+
static void reopen_revdb_file(const char *filename)
{
rpy_rev_fileno = open(filename, O_RDONLY | O_NOCTTY);
@@ -347,6 +362,8 @@
rpy_revdb.stop_point_break = 1;
rpy_revdb.unique_id_seen = 1;
+ empty_string = make_rpy_string(0);
+
write_answer(ANSWER_INIT, INIT_VERSION_NUMBER, total_stop_points, 0);
pending_after_forward = &answer_std;
@@ -374,8 +391,8 @@
running some custom code now, and we can't just perform I/O
or access raw memory---because there is no raw memory!
*/
- printf("%s:%d: Attempted to do I/O or access raw memory\n",
- file, line);
+ fprintf(stderr, "%s:%d: Attempted to do I/O or access raw memory\n",
+ file, line);
longjmp(jmp_buf_cancel_execution, 1);
}
}
@@ -413,26 +430,9 @@
pypy_g_ExcData.ed_exc_value = dinfo->saved_exc[1];
}
-/*
-static void execute_rpy_function(void func(RPyString *), RPyString *arg);
-
-static void execute_rpy_command(long index, char *arguments)
-{
- size_t length = strlen(arguments);
- RPyString *s;
-
- while (length > 0 && isspace(arguments[length - 1]))
- length--;
- s = make_rpy_string(length);
- memcpy(_RPyString_AsString(s), arguments, length);
-
- execute_rpy_function(rpy_revdb_command_funcs[index], s);
-}
-*/
-
static void execute_rpy_function(rpy_revdb_command_fn func,
rpy_revdb_command_t *cmd,
- char *extra)
+ RPyString *extra)
{
rpy_revdb_t dinfo;
disable_io(&dinfo);
@@ -533,6 +533,7 @@
static void command_default(rpy_revdb_command_t *cmd, char *extra)
{
+ RPyString *s;
int i;
for (i = 0; rpy_revdb_command_names[i] != cmd->cmd; i++) {
if (rpy_revdb_command_names[i] == 0) {
@@ -540,7 +541,15 @@
exit(1);
}
}
- execute_rpy_function(rpy_revdb_command_funcs[i], cmd, extra);
+
+ if (cmd->extra_size == 0) {
+ s = empty_string;
+ }
+ else {
+ s = make_rpy_string(cmd->extra_size);
+ memcpy(_RPyString_AsString(s), extra, cmd->extra_size);
+ }
+ execute_rpy_function(rpy_revdb_command_funcs[i], cmd, s);
}
RPY_EXTERN
@@ -688,11 +697,11 @@
return;
}
if (unique_id <= 0) {
- printf("cannot track a prebuilt or debugger-created object\n");
+ fprintf(stderr, "cannot track a prebuilt or debugger-created
object\n");
return;
}
if (unique_id < stopped_uid) {
- printf("cannot track the creation of an object already created\n");
+ fprintf(stderr, "cannot track the creation of an object already
created\n");
return;
}
assert(callback != NULL);
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
@@ -81,8 +81,8 @@
if (++rpy_revdb.stop_point_seen == rpy_revdb.stop_point_break) \
rpy_reverse_db_stop_point()
-#define OP_REVDB_SEND_OUTPUT(ll_string, r) \
- rpy_reverse_db_send_output(ll_string)
+#define OP_REVDB_SEND_ANSWER(cmd, arg1, arg2, arg3, ll_string, r) \
+ rpy_reverse_db_send_answer(cmd, arg1, arg2, arg3, ll_string)
#define OP_REVDB_CHANGE_TIME(mode, time, callback, r) \
rpy_reverse_db_change_time(mode, time, callback)
@@ -103,7 +103,8 @@
RPY_EXTERN char *rpy_reverse_db_fetch(int expected_size,
const char *file, int line);
RPY_EXTERN void rpy_reverse_db_stop_point(void);
-RPY_EXTERN void rpy_reverse_db_send_output(RPyString *output);
+RPY_EXTERN void rpy_reverse_db_send_answer(int cmd, int64_t arg1, int64_t arg2,
+ int64_t arg3, RPyString *extra);
RPY_EXTERN Signed rpy_reverse_db_identityhash(struct pypy_header0 *obj);
RPY_EXTERN void rpy_reverse_db_change_time(char mode, long long time,
void callback(void));
diff --git a/rpython/translator/revdb/test/test_basic.py
b/rpython/translator/revdb/test/test_basic.py
--- a/rpython/translator/revdb/test/test_basic.py
+++ b/rpython/translator/revdb/test/test_basic.py
@@ -3,9 +3,9 @@
import re, array, struct
from rpython.tool.udir import udir
from rpython.translator.interactive import Translation
-from rpython.rlib.rarithmetic import LONG_BIT
+from rpython.rlib.rarithmetic import LONG_BIT, intmask
from rpython.rlib import objectmodel, revdb
-from rpython.rlib.rarithmetic import intmask
+from rpython.rlib.debug import debug_print
from rpython.rtyper.annlowlevel import cast_gcref_to_instance
from rpython.rtyper.lltypesystem import lltype, llmemory
@@ -210,14 +210,18 @@
class InteractiveTests(object):
- def replay(self):
+ def replay(self, **kwds):
s1, s2 = socket.socketpair()
subproc = subprocess.Popen(
[str(self.exename), '--revdb-replay', str(self.rdbname),
- str(s2.fileno())])
+ str(s2.fileno())], **kwds)
s2.close()
self.subproc = subproc
- return ReplayProcess(subproc.pid, s1)
+ child = ReplayProcess(subproc.pid, s1)
+ child.expect(ANSWER_INIT, INIT_VERSION_NUMBER, 3)
+ msg = child.expect(ANSWER_STD, 1, Ellipsis)
+ self.total_stop_points = msg.arg2
+ return child
class TestSimpleInterpreter(InteractiveTests):
@@ -240,8 +244,6 @@
def test_go(self):
child = self.replay()
- child.expect(ANSWER_INIT, INIT_VERSION_NUMBER, 3)
- child.expect(ANSWER_STD, 1, Ellipsis)
child.send(Message(CMD_FORWARD, 2))
child.expect(ANSWER_STD, 3, Ellipsis)
child.send(Message(CMD_FORWARD, 2))
@@ -249,15 +251,11 @@
def test_quit(self):
child = self.replay()
- child.expect(ANSWER_INIT, INIT_VERSION_NUMBER, 3)
- child.expect(ANSWER_STD, 1, Ellipsis)
child.send(Message(CMD_QUIT))
assert self.subproc.wait() == 0
def test_fork(self):
child = self.replay()
- child.expect(ANSWER_INIT, INIT_VERSION_NUMBER, 3)
- child.expect(ANSWER_STD, 1, Ellipsis)
child2 = child.fork()
child.send(Message(CMD_FORWARD, 2))
child.expect(ANSWER_STD, 3, Ellipsis)
@@ -298,49 +296,50 @@
revdb.send_output("callback_track_obj\n")
dbstate.gcref = gcref
#
- def blip(cmdline):
- revdb.send_output('<<<' + cmdline + '>>>\n')
- if cmdline == 'oops':
+ def blip(cmd, extra):
+ debug_print('<<<', cmd.c_cmd, cmd.c_arg1,
+ cmd.c_arg2, cmd.c_arg3, extra, '>>>')
+ if extra == 'oops':
for i in range(1000):
print 42 # I/O not permitted
- if cmdline == 'raise-and-catch':
- try:
- g(cmdline)
- except ValueError:
- pass
- if cmdline == 'crash':
- raise ValueError
- if cmdline == 'get-value':
- revdb.send_output('%d,%d,%d\n' % (revdb.current_time(),
- revdb.most_recent_fork(),
- revdb.total_time()))
- if cmdline == 'go-fw':
- revdb.go_forward(1, went_fw, "xx")
- if cmdline == 'change-time':
- revdb.jump_in_time(2, changed_time, "xyzzy")
- if cmdline == 'change-time-non-exact':
- revdb.jump_in_time(2, changed_time, "nonx", exact=False)
- if cmdline == 'set-break-after-0':
- dbstate.break_after = 0
- if cmdline == 'print-id':
- revdb.send_output('obj.x=%d %d %d\n' % (
- dbstate.stuff.x,
- revdb.get_unique_id(dbstate.stuff),
- revdb.currently_created_objects()))
- if cmdline.startswith('track-object '):
- uid = int(cmdline[len('track-object '):])
- dbstate.gcref = lltype.nullptr(llmemory.GCREF.TO)
- revdb.track_object(uid, callback_track_obj)
- if cmdline == 'get-tracked-object':
- if dbstate.gcref:
- revdb.send_output('got obj.x=%d\n' % (
- cast_gcref_to_instance(Stuff, dbstate.gcref).x,))
- else:
- revdb.send_output('none\n')
- if cmdline == 'first-created-uid':
- revdb.send_output('first-created-uid=%d\n' % (
- revdb.first_created_object_uid(),))
- revdb.send_output('blipped\n')
+ ## if cmdline == 'raise-and-catch':
+ ## try:
+ ## g(cmdline)
+ ## except ValueError:
+ ## pass
+ ## if cmdline == 'crash':
+ ## raise ValueError
+ ## if cmdline == 'get-value':
+ ## revdb.send_output('%d,%d,%d\n' % (revdb.current_time(),
+ ## revdb.most_recent_fork(),
+ ## revdb.total_time()))
+ ## if cmdline == 'go-fw':
+ ## revdb.go_forward(1, went_fw, "xx")
+ ## if cmdline == 'change-time':
+ ## revdb.jump_in_time(2, changed_time, "xyzzy")
+ ## if cmdline == 'change-time-non-exact':
+ ## revdb.jump_in_time(2, changed_time, "nonx", exact=False)
+ ## if cmdline == 'set-break-after-0':
+ ## dbstate.break_after = 0
+ ## if cmdline == 'print-id':
+ ## revdb.send_output('obj.x=%d %d %d\n' % (
+ ## dbstate.stuff.x,
+ ## revdb.get_unique_id(dbstate.stuff),
+ ## revdb.currently_created_objects()))
+ ## if cmdline.startswith('track-object '):
+ ## uid = int(cmdline[len('track-object '):])
+ ## dbstate.gcref = lltype.nullptr(llmemory.GCREF.TO)
+ ## revdb.track_object(uid, callback_track_obj)
+ ## if cmdline == 'get-tracked-object':
+ ## if dbstate.gcref:
+ ## revdb.send_output('got obj.x=%d\n' % (
+ ## cast_gcref_to_instance(Stuff, dbstate.gcref).x,))
+ ## else:
+ ## revdb.send_output('none\n')
+ ## if cmdline == 'first-created-uid':
+ ## revdb.send_output('first-created-uid=%d\n' % (
+ ## revdb.first_created_object_uid(),))
+ revdb.send_answer(42, cmd.c_cmd, -43, -44, "foo")
lambda_blip = lambda: blip
#
class DBState:
@@ -348,14 +347,14 @@
dbstate = DBState()
#
def main(argv):
- revdb.register_debug_command('r', lambda_blip)
+ revdb.register_debug_command(1, lambda_blip)
for i, op in enumerate(argv[1:]):
dbstate.stuff = Stuff()
dbstate.stuff.x = i + 1000
revdb.stop_point()
- if i == dbstate.break_after:
- revdb.send_output('breakpoint!\n')
- revdb.go_forward(1, _nothing, "")
+ ## if i == dbstate.break_after:
+ ## revdb.send_output('breakpoint!\n')
+ ## revdb.go_forward(1, _nothing, "")
print op
return 9
compile(cls, main, [], backendopt=False)
@@ -363,19 +362,15 @@
def test_run_blip(self):
child = self.replay()
- child.expectx('(3)$ ')
- child.sendline('r foo bar baz ')
- child.expectx('<<<foo bar baz>>>\r\n'
- 'blipped\r\n'
- '(3)$ ')
+ child.send(Message(1, extra=''))
+ child.expect(42, 1, -43, -44, "foo")
def test_io_not_permitted(self):
- child = self.replay()
- child.expectx('(3)$ ')
- child.sendline('r oops')
- child.expectx('<<<oops>>>\r\n')
- child.expectx(': Attempted to do I/O or access raw memory\r\n'
- '(3)$ ')
+ child = self.replay(stderr=subprocess.PIPE)
+ child.send(Message(1, extra='oops'))
+ child.close()
+ line = self.subproc.stderr.read()
+ assert line.endswith(': Attempted to do I/O or access raw memory\n')
def test_interaction_with_forward(self):
child = self.replay()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit