Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85006:9bbdb3034f2d
Date: 2016-06-07 20:08 +0200
http://bitbucket.org/pypy/pypy/changeset/9bbdb3034f2d/

Log:    emit stop_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
@@ -564,6 +564,8 @@
 
     # __________ instrumentation _________
     'instrument_count':     LLOp(),
+
+    'revdb_stop_point':     LLOp(),
 }
 # ***** Run test_lloperation after changes. *****
 
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -350,6 +350,9 @@
             SetErrorMode(old_mode)
         if res.returncode != 0:
             if expect_crash:
+                if type(expect_crash) is int and expect_crash != 
res.returncode:
+                    raise Exception("Returned %d, but expected %d" % (
+                        res.returncode, expect_crash))
                 return res.out, res.err
             print >> sys.stderr, res.err
             raise Exception("Returned %d" % (res.returncode,))
diff --git a/rpython/translator/c/src/entrypoint.c 
b/rpython/translator/c/src/entrypoint.c
--- a/rpython/translator/c/src/entrypoint.c
+++ b/rpython/translator/c/src/entrypoint.c
@@ -104,7 +104,7 @@
     exitcode = STANDALONE_ENTRY_POINT(argc, argv);
 
 #ifdef RPY_REVERSE_DEBUGGER
-    rpy_reverse_db_teardown();
+    rpy_reverse_db_teardown(&exitcode);
 #endif
 
     pypy_debug_alloc_results();
diff --git a/rpython/translator/revdb/rdb-src/revdb.c 
b/rpython/translator/revdb/rdb-src/revdb.c
--- a/rpython/translator/revdb/rdb-src/revdb.c
+++ b/rpython/translator/revdb/rdb-src/revdb.c
@@ -22,7 +22,7 @@
 
 static void setup_record_mode(int argc, char *argv[]);
 static void setup_replay_mode(int *argc_p, char **argv_p[]);
-static void check_at_end(void);
+static void check_at_end(int exitcode, int *exitcode_p);
 
 RPY_EXTERN
 void rpy_reverse_db_setup(int *argc_p, char **argv_p[])
@@ -48,12 +48,15 @@
 }
 
 RPY_EXTERN
-void rpy_reverse_db_teardown(void)
+void rpy_reverse_db_teardown(int *exitcode_p)
 {
+    int exitcode;
+    RPY_REVDB_EMIT(exitcode = *exitcode_p; , int _e, exitcode);
+
     if (!rpy_rdb_replay)
         rpy_reverse_db_flush();
     else
-        check_at_end();
+        check_at_end(exitcode, exitcode_p);
 }
 
 
@@ -170,15 +173,21 @@
     *argv_p = (char **)x;
 }
 
-static void check_at_end(void)
+static void check_at_end(int exitcode, int *exitcode_p)
 {
     char dummy[1];
+    if (*exitcode_p != exitcode) {
+        fprintf(stderr, "Bogus exit code\n");
+        exit(1);
+    }
     if (rpy_revdb.buf_p != rpy_revdb.buf_limit ||
             read(rpy_rev_fileno, dummy, 1) > 0) {
         fprintf(stderr, "RevDB file error: corrupted file (too much data?)\n");
         exit(1);
     }
     printf("Replaying finished.\n");
+    rpy_reverse_db_stop_point(0);
+    *exitcode_p = 0;
 }
 
 RPY_EXTERN
@@ -209,5 +218,11 @@
     return rpy_rev_buffer;
 }
 
+RPY_EXTERN
+void rpy_reverse_db_stop_point(long stop_point)
+{
+    printf("stop_point %ld\n", stop_point);
+}
+
 
 /* ------------------------------------------------------------ */
diff --git a/rpython/translator/revdb/rdb-src/revdb_include.h 
b/rpython/translator/revdb/rdb-src/revdb_include.h
--- a/rpython/translator/revdb/rdb-src/revdb_include.h
+++ b/rpython/translator/revdb/rdb-src/revdb_include.h
@@ -1,7 +1,7 @@
 #include <string.h>
 
 RPY_EXTERN void rpy_reverse_db_setup(int *argc_p, char **argv_p[]);
-RPY_EXTERN void rpy_reverse_db_teardown(void);
+RPY_EXTERN void rpy_reverse_db_teardown(int *exitcode_p);
 
 typedef struct { char *buf_p, *buf_limit; } rpy_revdb_t;
 RPY_EXTERN rpy_revdb_t rpy_revdb;
@@ -47,8 +47,12 @@
 #define RPY_REVDB_EMIT_VOID(normal_code)                                \
     if (!rpy_rdb_replay) { normal_code } else { }
 
+#define OP_REVDB_STOP_POINT(stop_point, r)                              \
+    if (rpy_rdb_replay) rpy_reverse_db_stop_point(stop_point);
+
 RPY_EXTERN void rpy_reverse_db_flush(void);
 RPY_EXTERN char *rpy_reverse_db_fetch(int expected_size);
+RPY_EXTERN void rpy_reverse_db_stop_point(long stop_point);
 
 
 /* ------------------------------------------------------------ */
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
@@ -1,9 +1,10 @@
 import py
-import os
+import os, sys
 import array, struct
 from rpython.tool.udir import udir
 from rpython.translator.interactive import Translation
 from rpython.rlib.rarithmetic import LONG_BIT
+from rpython.rlib import revdb
 
 
 class RDB(object):
@@ -47,9 +48,16 @@
         def run(*argv):
             env = os.environ.copy()
             env['PYPYREVDB'] = self.rdbname
-            stdout = t.driver.cbuilder.cmdexec(' '.join(argv), env=env)
+            stdout, stderr = t.driver.cbuilder.cmdexec(' '.join(argv), env=env,
+                                                       expect_crash=9)
+            print >> sys.stderr, stderr
             return stdout
-        return run
+
+        def replay():
+            stdout = t.driver.cbuilder.cmdexec("--replay '%s'" % self.rdbname)
+            return stdout
+
+        return run, replay
 
     def fetch_rdb(self):
         return RDB(self.rdbname)
@@ -57,8 +65,8 @@
     def test_simple(self):
         def main(argv):
             print argv[1:]
-            return 0
-        fn = self.getcompiled(main, [], backendopt=False)
+            return 9
+        fn, replay = self.getcompiled(main, [], backendopt=False)
         assert fn('abc d') == '[abc, d]\n'
         rdb = self.fetch_rdb()
         assert rdb.argc == 3
@@ -82,11 +90,27 @@
         # write() call
         x = rdb.next(); assert x == len('[abc, d]\n')
         x = rdb.next('i'); assert x == 0      # errno
+        x = rdb.next('i'); assert x == 9      # exitcode
         # that's all that should get from this simple example
         assert rdb.done()
         #
         assert got == [self.exename, 'abc', 'd']
         #
         # Now try the replay mode (just "doesn't crash" for now)
-        stdout = fn("--replay '%s'" % (self.rdbname,))
-        assert stdout == "Replaying finished.\n"
+        out = replay()
+        assert out == ("Replaying finished.\n"
+                       "stop_point 0\n")
+
+    def test_simple_interpreter(self):
+        def main(argv):
+            for op in argv[1:]:
+                revdb.stop_point(42)
+                print op
+            return 9
+        fn, replay = self.getcompiled(main, [], backendopt=False)
+        assert fn('abc d') == 'abc\nd\n'
+        out = replay()
+        assert out == ("stop_point 42\n"
+                       "stop_point 42\n"
+                       "Replaying finished.\n"
+                       "stop_point 0\n")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to