[pypy-commit] pypy reverse-debugger: Prebuilt weakrefs

arigo pypy.commits at gmail.com
Wed Jun 29 05:49:08 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: reverse-debugger
Changeset: r85444:172c97e74bff
Date: 2016-06-29 11:50 +0200
http://bitbucket.org/pypy/pypy/changeset/172c97e74bff/

Log:	Prebuilt weakrefs

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
@@ -389,6 +389,8 @@
            it with WEAKREF_AFTERWARDS_ALIVE. */
         if (!RPY_RDB_REPLAY)
             r->re_off_prev = recording_offset();
+        else
+            r->re_off_prev = 1;    /* any number > 0 */
 
         RPY_REVDB_EMIT(alive = WEAKREF_AFTERWARDS_DEAD;, char _e, alive);
 
@@ -420,29 +422,34 @@
     struct WEAKLINK *r = (struct WEAKLINK *)weakref;
     void *result = r->re_addr;
     if (result && flag_io_disabled == FID_REGULAR_MODE) {
-        char alive;
-        if (!RPY_RDB_REPLAY) {
-            if (r->re_off_prev <= 0) {
-                fprintf(stderr, "bug in weakrefs: bad previous offset %lld\n",
-                        (long long)r->re_off_prev);
-                exit(1);
+        if (r->re_off_prev < 0) {
+            fprintf(stderr, "bug in weakrefs: bad previous offset %lld\n",
+                    (long long)r->re_off_prev);
+            exit(1);
+        }
+        if (r->re_off_prev == 0) {
+            /* A prebuilt weakref.  Don't record anything */
+        }
+        else {
+            char alive;
+            if (!RPY_RDB_REPLAY) {
+                patch_prev_offset(r->re_off_prev, WEAKREF_AFTERWARDS_DEAD,
+                                                  WEAKREF_AFTERWARDS_ALIVE);
+                r->re_off_prev = recording_offset();
             }
-            patch_prev_offset(r->re_off_prev, WEAKREF_AFTERWARDS_DEAD,
-                                              WEAKREF_AFTERWARDS_ALIVE);
-            r->re_off_prev = recording_offset();
-        }
-        RPY_REVDB_EMIT(alive = WEAKREF_AFTERWARDS_DEAD;, char _e, alive);
+            RPY_REVDB_EMIT(alive = WEAKREF_AFTERWARDS_DEAD;, char _e, alive);
 
-        if (RPY_RDB_REPLAY) {
-            switch (alive) {
-            case WEAKREF_AFTERWARDS_DEAD:
-                r->re_addr = NULL;
-                break;
-            case WEAKREF_AFTERWARDS_ALIVE:
-                break;
-            default:
-                fprintf(stderr, "bad weakref_deref byte in log\n");
-                exit(1);
+            if (RPY_RDB_REPLAY) {
+                switch (alive) {
+                case WEAKREF_AFTERWARDS_DEAD:
+                    r->re_addr = NULL;
+                    break;
+                case WEAKREF_AFTERWARDS_ALIVE:
+                    break;
+                default:
+                    fprintf(stderr, "bad weakref_deref byte in log\n");
+                    exit(1);
+                }
             }
         }
     }
diff --git a/rpython/translator/revdb/test/test_weak.py b/rpython/translator/revdb/test/test_weak.py
--- a/rpython/translator/revdb/test/test_weak.py
+++ b/rpython/translator/revdb/test/test_weak.py
@@ -151,6 +151,22 @@
         x = rdb.next('q'); assert x == 0      # number of stop points
         assert rdb.done()
 
+    def test_prebuilt_weakref(self):
+        class X:
+            pass
+        x1 = X()
+        x1.foobar = 9
+        wr = weakref.ref(x1)
+        def main(argv):
+            X().foobar = 43
+            return wr().foobar
+        self.compile(main, backendopt=False)
+        out = self.run('Xx')
+        rdb = self.fetch_rdb([self.exename, 'Xx'])
+        # the weakref is prebuilt, so doesn't generate any WEAKREF_xxx
+        x = rdb.next('q'); assert x == 0      # number of stop points
+        assert rdb.done()
+
     def test_finalizer_light_ignored(self):
         py.test.skip("lightweight finalizers could be skipped, but that "
                      "requires also skipping (instead of recording) any "


More information about the pypy-commit mailing list