Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r85124:6494d80c50d8
Date: 2016-06-13 13:03 +0200
http://bitbucket.org/pypy/pypy/changeset/6494d80c50d8/
Log: object_to_id
diff --git a/rpython/rlib/revdb.py b/rpython/rlib/revdb.py
--- a/rpython/rlib/revdb.py
+++ b/rpython/rlib/revdb.py
@@ -5,6 +5,8 @@
from rpython.rtyper.lltypesystem.lloperation import llop
from rpython.rtyper.extregistry import ExtRegistryEntry
from rpython.rtyper.annlowlevel import llhelper, hlstr
+from rpython.rtyper.annlowlevel import cast_base_ptr_to_instance
+from rpython.rtyper.rclass import OBJECTPTR
def stop_point():
@@ -52,6 +54,15 @@
"""
return llop.revdb_creation_time_of(lltype.SignedLongLong, x)
[email protected](0)
+def object_to_id(x):
+ return llop.revdb_object_to_id(lltype.Signed, x)
+
[email protected](0)
+def id_to_object(Class, object_id):
+ x = llop.revdb_id_to_object(OBJECTPTR, object_id)
+ return cast_base_ptr_to_instance(Class, x)
+
@specialize.arg(1)
def go_forward(time_delta, callback, arg_string):
"""For RPython debug commands: tells that after this function finishes,
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
@@ -572,6 +572,8 @@
'revdb_set_value': LLOp(),
'revdb_identityhash': LLOp(),
'revdb_creation_time_of': LLOp(sideeffects=False),
+ 'revdb_object_to_id': LLOp(sideeffects=False),
+ 'revdb_id_to_object': LLOp(sideeffects=False),
}
# ***** Run test_lloperation after changes. *****
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
@@ -79,7 +79,7 @@
#define OP_REVDB_SEND_OUTPUT(ll_string, r) \
rpy_reverse_db_send_output(ll_string)
-#define OP_REVDB_CHANGE_TIME(mode, time, callback, ll_string, r) \
+#define OP_REVDB_CHANGE_TIME(mode, time, callback, ll_string, r) \
rpy_reverse_db_change_time(mode, time, callback, ll_string)
#define OP_REVDB_GET_VALUE(value_id, r) \
@@ -88,9 +88,15 @@
#define OP_REVDB_IDENTITYHASH(obj, r) \
r = rpy_reverse_db_identityhash((struct pypy_header0 *)(obj))
-#define OP_REVDB_CREATION_TIME_OF(x, r) \
+#define OP_REVDB_CREATION_TIME_OF(x, r) \
r = ((struct pypy_header0 *)x)->h_ctime
+#define OP_REVDB_OBJECT_TO_ID(x, r) \
+ r = (Signed)x
+
+#define OP_REVDB_ID_TO_OBJECT(x, r) \
+ r = (void *)x
+
RPY_EXTERN void rpy_reverse_db_flush(void);
RPY_EXTERN char *rpy_reverse_db_fetch(int expected_size,
const char *file, int line);
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
@@ -292,6 +292,9 @@
def setup_class(cls):
#
+ class Stuff:
+ pass
+ #
def g(cmdline):
if len(cmdline) > 5:
raise ValueError
@@ -333,6 +336,12 @@
revdb.jump_in_time(2, changed_time, "xyzzy")
if cmdline == 'set-break-after-0':
dbstate.break_after = 0
+ if cmdline == 'print-id':
+ revdb.send_output('%d\n' %
(revdb.object_to_id(dbstate.stuff),))
+ if cmdline.startswith('check-id '):
+ obj_id = int(cmdline[len('check-id '):])
+ revdb.send_output("%d\n" %
+ int(revdb.id_to_object(Stuff, obj_id) is dbstate.stuff))
revdb.send_output('blipped\n')
lambda_blip = lambda: blip
#
@@ -341,6 +350,7 @@
dbstate = DBState()
#
def main(argv):
+ dbstate.stuff = Stuff()
revdb.register_debug_command('r', lambda_blip)
for i, op in enumerate(argv[1:]):
revdb.stop_point()
@@ -439,3 +449,22 @@
child.sendline('__forward 5')
child.expectx('breakpoint!\r\n'
'(2)$ ')
+
+ def test_object_to_id(self):
+ child = self.replay()
+ child.expectx('(3)$ ')
+ child.sendline('r print-id')
+ child.expect(re.escape('<<<print-id>>>\r\n')
+ + r'(-?\d+)'
+ + re.escape('\r\n'
+ 'blipped\r\n'
+ '(3)$ '))
+ object_id = child.match.group(1)
+ for at_time in [1, 2, 3]:
+ child.sendline('__go %d' % at_time)
+ child.expectx('(%d)$ ' % at_time)
+ child.sendline('r check-id ' + object_id)
+ child.expectx('<<<check-id %s>>>\r\n' % (object_id,) +
+ '1\r\n' +
+ 'blipped\r\n' +
+ '(%d)$ ' % at_time)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit