Author: Armin Rigo <ar...@tunes.org>
Branch: reverse-debugger
Changeset: r85448:45db8fd3e7a1
Date: 2016-06-29 13:30 +0200
http://bitbucket.org/pypy/pypy/changeset/45db8fd3e7a1/

Log:    in-progress

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
@@ -45,7 +45,7 @@
     #revdb.register_debug_command(revdb.CMD_WATCHVALUES, lambda_watchvalues)
 
 
-pycode.PyCode.co_revdb_linestarts = None   # or a string: a list of bits
+pycode.PyCode.co_revdb_linestarts = None   # or a string: an array of bits
 
 
 def potential_stop_point(frame):
@@ -71,28 +71,26 @@
 
 def build_co_revdb_linestarts(code):
     # inspired by findlinestarts() in the 'dis' standard module
-    assert len(code.co_code) > 0
     bits = [False] * len(code.co_code)
-    bits[0] = True
-    lnotab = code.co_lnotab
-    addr = 0
-    p = 0
-    newline = True
-    while p + 1 < len(lnotab):
-        byte_incr = ord(lnotab[p])
-        line_incr = ord(lnotab[p+1])
-        if byte_incr:
-            if newline:
-                if addr < len(bits):
-                    bits[addr] = True
-                newline = False
-            addr += byte_incr
-        if line_incr:
-            newline = True
-        p += 2
-    if newline:
-        if addr < len(bits):
-            bits[addr] = True
+    if not code.hidden_applevel:
+        lnotab = code.co_lnotab
+        addr = 0
+        p = 0
+        newline = 1
+        while p + 1 < len(lnotab):
+            byte_incr = ord(lnotab[p])
+            line_incr = ord(lnotab[p+1])
+            if byte_incr:
+                if newline != 0:
+                    if addr < len(bits):
+                        bits[addr] = True
+                    newline = 0
+                addr += byte_incr
+            newline |= line_incr
+            p += 2
+        if newline:
+            if addr < len(bits):
+                bits[addr] = True
     #
     byte_list = []
     pending = 0
diff --git a/pypy/interpreter/test/test_reverse_debugging.py 
b/pypy/interpreter/test/test_reverse_debugging.py
--- a/pypy/interpreter/test/test_reverse_debugging.py
+++ b/pypy/interpreter/test/test_reverse_debugging.py
@@ -1,5 +1,6 @@
 import dis
 from pypy.interpreter.reverse_debugging import *
+from hypothesis import given, strategies, example
 
 
 class FakeCode:
@@ -10,11 +11,14 @@
         self.co_revdb_linestarts = None
 
 
-def test_build_co_revdb_linestarts():
-    fake_lnotab = ("\x01\x02\x03\x04"
-                   "\x00\xFF\x20\x30\x00\xFF\x00\x40"
-                   "\xFF\x00\x0A\x0B\xFF\x00\x0C\x00")
-    code = FakeCode("?" * sum(map(ord, fake_lnotab[0::2])), fake_lnotab)
+@given(strategies.binary())
+@example("\x01\x02\x03\x04"
+         "\x00\xFF\x20\x30\x00\xFF\x00\x40"
+         "\xFF\x00\x0A\x0B\xFF\x00\x0C\x00")
+def test_build_co_revdb_linestarts(lnotab):
+    if len(lnotab) & 1:
+        lnotab = lnotab + '\x00'   # make the length even
+    code = FakeCode("?" * sum(map(ord, lnotab[0::2])), lnotab)
     lstart = build_co_revdb_linestarts(code)
     assert lstart is code.co_revdb_linestarts
 
diff --git a/rpython/translator/revdb/process.py 
b/rpython/translator/revdb/process.py
--- a/rpython/translator/revdb/process.py
+++ b/rpython/translator/revdb/process.py
@@ -173,9 +173,9 @@
                 break
             elif msg.cmd == ANSWER_LINECACHE:
                 line = linecache.getline(msg.extra, msg.arg1)
-                if not line.endswith('\n'):
-                    line += '\n'
-                sys.stdout.write(line)
+                if line == '':
+                    line = '?'
+                sys.stdout.write(line.strip() + '\n')
                 sys.stdout.flush()
             elif msg.cmd == ANSWER_NEXTNID and pgroup is not None:
                 uid = msg.arg1
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
@@ -29,10 +29,14 @@
 RPY_EXTERN void rpy_reverse_db_setup(int *argc_p, char **argv_p[]);
 RPY_EXTERN void rpy_reverse_db_teardown(void);
 
-#if 0    /* enable to print locations to stderr of all the EMITs */
-#  define _RPY_REVDB_PRINT(args)  fprintf args
+#if 1    /* enable to print locations to stderr of all the EMITs */
+#  define _RPY_REVDB_PRINT(mode)                                        \
+    fprintf(stderr,                                                     \
+            "%s:%d: %0*llx\n",                                          \
+            __FILE__, __LINE__, 2 * sizeof(_e),                         \
+            ((unsigned long long)_e) & ((2ULL << (8*sizeof(_e)-1)) - 1))
 #else
-#  define _RPY_REVDB_PRINT(args)  /* nothing */
+#  define _RPY_REVDB_PRINT(mode)  /* nothing */
 #endif
 
 
@@ -41,9 +45,7 @@
         normal_code                                                     \
         {                                                               \
             decl_e = variable;                                          \
-            _RPY_REVDB_PRINT((stderr, "%s:%d: write %0*llx\n",          \
-                              __FILE__, __LINE__,                       \
-                              2 * sizeof(_e), (unsigned long long)_e)); \
+            _RPY_REVDB_PRINT("write");                                  \
             memcpy(rpy_revdb.buf_p, &_e, sizeof(_e));                   \
             if ((rpy_revdb.buf_p += sizeof(_e)) > rpy_revdb.buf_limit)  \
                 rpy_reverse_db_flush();                                 \
@@ -54,9 +56,7 @@
             char *_end1 = _src + sizeof(_e);                            \
             memcpy(&_e, _src, sizeof(_e));                              \
             rpy_revdb.buf_p = _end1;                                    \
-            _RPY_REVDB_PRINT((stderr, "%s:%d: read %0*llx\n",           \
-                              __FILE__, __LINE__,                       \
-                              2 * sizeof(_e), (unsigned long long)_e)); \
+            _RPY_REVDB_PRINT("read");                                   \
             if (_end1 >= rpy_revdb.buf_limit)                           \
                 rpy_reverse_db_fetch(__FILE__, __LINE__);               \
             variable = _e;                                              \
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to