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

Reply via email to