Author: Armin Rigo <ar...@tunes.org>
Branch: reverse-debugger
Changeset: r85097:59cd9a5ec3f6
Date: 2016-06-11 12:50 +0200
http://bitbucket.org/pypy/pypy/changeset/59cd9a5ec3f6/

Log:    Don't record/replay the reads from static, immutable structures (the
        RPython classes or the PBCs)

diff --git a/rpython/rtyper/rclass.py b/rpython/rtyper/rclass.py
--- a/rpython/rtyper/rclass.py
+++ b/rpython/rtyper/rclass.py
@@ -172,7 +172,8 @@
                             ('name', Ptr(rstr.STR)),
                             ('hash', Signed),
                             ('instantiate', Ptr(FuncType([], OBJECTPTR))),
-                            hints={'immutable': True}))
+                            hints={'immutable': True,
+                                   'static_immutable': True}))
 # non-gc case
 NONGCOBJECT = Struct('nongcobject', ('typeptr', CLASSTYPE))
 NONGCOBJECTPTR = Ptr(NONGCOBJECT)
@@ -273,7 +274,7 @@
         #
         self.rbase = getclassrepr(self.rtyper, self.classdef.basedef)
         self.rbase.setup()
-        kwds = {'hints': {'immutable': True}}
+        kwds = {'hints': {'immutable': True, 'static_immutable': True}}
         vtable_type = Struct('%s_vtable' % self.classdef.name,
                                 ('super', self.rbase.vtable_type),
                                 *llfields, **kwds)
diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py
--- a/rpython/rtyper/rpbc.py
+++ b/rpython/rtyper/rpbc.py
@@ -243,7 +243,7 @@
         fields = []
         for row in self.uniquerows:
             fields.append((row.attrname, row.fntype))
-        kwds = {'hints': {'immutable': True}}
+        kwds = {'hints': {'immutable': True, 'static_immutable': True}}
         return Ptr(Struct('specfunc', *fields, **kwds))
 
     def create_specfunc(self):
@@ -658,7 +658,7 @@
     """For a SomePBC of frozen PBCs that have no common access set.
     The only possible operation on such a thing is comparison with 'is'."""
     lowleveltype = llmemory.Address
-    EMPTY = Struct('pbc', hints={'immutable': True})
+    EMPTY = Struct('pbc', hints={'immutable': True, 'static_immutable': True})
 
     def __init__(self, rtyper):
         self.rtyper = rtyper
@@ -719,7 +719,7 @@
 
     def _setup_repr(self):
         llfields = self._setup_repr_fields()
-        kwds = {'hints': {'immutable': True}}
+        kwds = {'hints': {'immutable': True, 'static_immutable': True}}
         self.pbc_type.become(Struct('pbc', *llfields, **kwds))
 
     def create_instance(self):
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
@@ -438,7 +438,8 @@
             result = '/* %s */' % result
         if self.db.reverse_debugger:
             S = self.lltypemap(op.args[0]).TO
-            if S._gckind != 'gc' and not S._hints.get('is_excdata'):
+            if (S._gckind != 'gc' and not S._hints.get('is_excdata')
+                    and not S._hints.get('static_immutable')):
                 from rpython.translator.revdb import revdb_genc
                 result = revdb_genc.emit(result, self.lltypename(op.result),
                                          newvalue)
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
@@ -40,7 +40,7 @@
         normal_code                                                     \
         {                                                               \
             decl_e = variable;                                          \
-            _RPY_REVDB_PRINT((stderr, "%s:%d: write %*llx\n",           \
+            _RPY_REVDB_PRINT((stderr, "%s:%d: write %0*llx\n",          \
                               __FILE__, __LINE__,                       \
                               2 * sizeof(_e), (unsigned long long)_e)); \
             memcpy(rpy_revdb.buf_p, &_e, sizeof(_e));                   \
@@ -57,7 +57,7 @@
             }                                                           \
             rpy_revdb.buf_p = _end1;                                    \
             memcpy(&_e, _src, sizeof(_e));                              \
-            _RPY_REVDB_PRINT((stderr, "%s:%d: read %*llx\n",            \
+            _RPY_REVDB_PRINT((stderr, "%s:%d: read %0*llx\n",           \
                               __FILE__, __LINE__,                       \
                               2 * sizeof(_e), (unsigned long long)_e)); \
             variable = _e;                                              \
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
@@ -127,6 +127,51 @@
         x = rdb.next('q'); assert x == 0      # number of stop points
         assert rdb.done()
 
+    def test_dont_record_vtable_reads(self):
+        class A(object):
+            x = 42
+        class B(A):
+            x = 43
+        lst = [A(), B()]
+        def main(argv):
+            print lst[len(argv) & 1].x
+            return 9
+        self.compile(main, [], backendopt=False)
+        out = self.run('Xx')
+        assert out == '42\n'
+        rdb = self.fetch_rdb()
+        rdb.read_check_argv([self.exename, 'Xx'])
+        # write() call (it used to be the case that vtable reads where
+        # recorded too; the single byte fetched from the vtable from
+        # the '.x' in main() would appear here)
+        x = rdb.next(); assert x == len(out)
+        x = rdb.next('i'); assert x == 0      # errno
+        # done
+        x = rdb.next('q'); assert x == 0      # number of stop points
+        assert rdb.done()
+
+    def test_dont_record_pbc_reads(self):
+        class MyPBC:
+            def _freeze_(self):
+                return True
+        pbc1 = MyPBC(); pbc1.x = 41
+        pbc2 = MyPBC(); pbc2.x = 42
+        lst = [pbc1, pbc2]
+        def main(argv):
+            print lst[len(argv) & 1].x
+            return 9
+        self.compile(main, [], backendopt=False)
+        out = self.run('Xx')
+        assert out == '41\n'
+        rdb = self.fetch_rdb()
+        rdb.read_check_argv([self.exename, 'Xx'])
+        # write() call
+        x = rdb.next(); assert x == len(out)
+        x = rdb.next('i'); assert x == 0      # errno
+        # done
+        x = rdb.next('q'); assert x == 0      # number of stop points
+        assert rdb.done()
+
 
 class InteractiveTests(object):
     EOF = pexpect.EOF
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to